123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- """Connection file-related utilities for the kernel
- """
- # Copyright (c) IPython Development Team.
- # Distributed under the terms of the Modified BSD License.
- from __future__ import absolute_import
- import json
- import sys
- from subprocess import Popen, PIPE
- import warnings
- from IPython.core.profiledir import ProfileDir
- from IPython.paths import get_ipython_dir
- from ipython_genutils.path import filefind
- from ipython_genutils.py3compat import str_to_bytes, PY3
- import jupyter_client
- from jupyter_client import write_connection_file
- def get_connection_file(app=None):
- """Return the path to the connection file of an app
- Parameters
- ----------
- app : IPKernelApp instance [optional]
- If unspecified, the currently running app will be used
- """
- if app is None:
- from ipykernel.kernelapp import IPKernelApp
- if not IPKernelApp.initialized():
- raise RuntimeError("app not specified, and not in a running Kernel")
- app = IPKernelApp.instance()
- return filefind(app.connection_file, ['.', app.connection_dir])
- def find_connection_file(filename='kernel-*.json', profile=None):
- """DEPRECATED: find a connection file, and return its absolute path.
-
- THIS FUNCION IS DEPRECATED. Use juptyer_client.find_connection_file instead.
- Parameters
- ----------
- filename : str
- The connection file or fileglob to search for.
- profile : str [optional]
- The name of the profile to use when searching for the connection file,
- if different from the current IPython session or 'default'.
- Returns
- -------
- str : The absolute path of the connection file.
- """
-
- import warnings
- warnings.warn("""ipykernel.find_connection_file is deprecated, use jupyter_client.find_connection_file""",
- DeprecationWarning, stacklevel=2)
- from IPython.core.application import BaseIPythonApplication as IPApp
- try:
- # quick check for absolute path, before going through logic
- return filefind(filename)
- except IOError:
- pass
- if profile is None:
- # profile unspecified, check if running from an IPython app
- if IPApp.initialized():
- app = IPApp.instance()
- profile_dir = app.profile_dir
- else:
- # not running in IPython, use default profile
- profile_dir = ProfileDir.find_profile_dir_by_name(get_ipython_dir(), 'default')
- else:
- # find profiledir by profile name:
- profile_dir = ProfileDir.find_profile_dir_by_name(get_ipython_dir(), profile)
- security_dir = profile_dir.security_dir
-
- return jupyter_client.find_connection_file(filename, path=['.', security_dir])
- def _find_connection_file(connection_file, profile=None):
- """Return the absolute path for a connection file
-
- - If nothing specified, return current Kernel's connection file
- - If profile specified, show deprecation warning about finding connection files in profiles
- - Otherwise, call jupyter_client.find_connection_file
- """
- if connection_file is None:
- # get connection file from current kernel
- return get_connection_file()
- else:
- # connection file specified, allow shortnames:
- if profile is not None:
- warnings.warn(
- "Finding connection file by profile is deprecated.",
- DeprecationWarning, stacklevel=3,
- )
- return find_connection_file(connection_file, profile=profile)
- else:
- return jupyter_client.find_connection_file(connection_file)
- def get_connection_info(connection_file=None, unpack=False, profile=None):
- """Return the connection information for the current Kernel.
- Parameters
- ----------
- connection_file : str [optional]
- The connection file to be used. Can be given by absolute path, or
- IPython will search in the security directory of a given profile.
- If run from IPython,
- If unspecified, the connection file for the currently running
- IPython Kernel will be used, which is only allowed from inside a kernel.
- unpack : bool [default: False]
- if True, return the unpacked dict, otherwise just the string contents
- of the file.
- profile : DEPRECATED
- Returns
- -------
- The connection dictionary of the current kernel, as string or dict,
- depending on `unpack`.
- """
- cf = _find_connection_file(connection_file, profile)
- with open(cf) as f:
- info = f.read()
- if unpack:
- info = json.loads(info)
- # ensure key is bytes:
- info['key'] = str_to_bytes(info.get('key', ''))
- return info
- def connect_qtconsole(connection_file=None, argv=None, profile=None):
- """Connect a qtconsole to the current kernel.
- This is useful for connecting a second qtconsole to a kernel, or to a
- local notebook.
- Parameters
- ----------
- connection_file : str [optional]
- The connection file to be used. Can be given by absolute path, or
- IPython will search in the security directory of a given profile.
- If run from IPython,
- If unspecified, the connection file for the currently running
- IPython Kernel will be used, which is only allowed from inside a kernel.
- argv : list [optional]
- Any extra args to be passed to the console.
- profile : DEPRECATED
- Returns
- -------
- :class:`subprocess.Popen` instance running the qtconsole frontend
- """
- argv = [] if argv is None else argv
- cf = _find_connection_file(connection_file, profile)
- cmd = ';'.join([
- "from IPython.qt.console import qtconsoleapp",
- "qtconsoleapp.main()"
- ])
- kwargs = {}
- if PY3:
- # Launch the Qt console in a separate session & process group, so
- # interrupting the kernel doesn't kill it. This kwarg is not on Py2.
- kwargs['start_new_session'] = True
- return Popen([sys.executable, '-c', cmd, '--existing', cf] + argv,
- stdout=PIPE, stderr=PIPE, close_fds=(sys.platform != 'win32'),
- **kwargs
- )
- __all__ = [
- 'write_connection_file',
- 'get_connection_file',
- 'find_connection_file',
- 'get_connection_info',
- 'connect_qtconsole',
- ]
|