##// END OF EJS Templates
fixed issue #800
fixed issue #800

File last commit:

r4872:34c10438
r4945:ef03f85c
Show More
entry_point.py
167 lines | 6.1 KiB | text/x-python | PythonLexer
epatters
* Restored functionality after major merge....
r2778 """ Defines helper functions for creating kernel entry points and process
launchers.
"""
# Standard library imports.
Brian Granger
Draft of context closing....
r3046 import atexit
Brian Granger
Merge branch 'newkernel' into upstream-newkernel...
r2873 import os
epatters
* Restored functionality after major merge....
r2778 import socket
epatters
Fixed launch_kernel to support pythonw.exe. The joys of Windows programming...
r2944 from subprocess import Popen, PIPE
epatters
* Restored functionality after major merge....
r2778 import sys
# Local imports.
MinRK
zmq kernels now started via newapp
r3970 from parentpoller import ParentPollerWindows
Fernando Perez
Install kernel-side sys.excepthook so we at least see kernel tracebacks.
r2853
epatters
* Restored functionality after major merge....
r2778
MinRK
zmq kernels now started via newapp
r3970 def base_launch_kernel(code, shell_port=0, iopub_port=0, stdin_port=0, hb_port=0,
ip=None, stdin=None, stdout=None, stderr=None,
executable=None, independent=False, extra_arguments=[]):
epatters
* Restored functionality after major merge....
r2778 """ Launches a localhost kernel, binding to the specified ports.
Parameters
----------
code : str,
A string of Python code that imports and executes a kernel entry point.
MinRK
zmq kernels now started via newapp
r3970 shell_port : int, optional
epatters
* Restored functionality after major merge....
r2778 The port to use for XREP channel.
MinRK
zmq kernels now started via newapp
r3970 iopub_port : int, optional
epatters
* Restored functionality after major merge....
r2778 The port to use for the SUB channel.
MinRK
zmq kernels now started via newapp
r3970 stdin_port : int, optional
epatters
* Restored functionality after major merge....
r2778 The port to use for the REQ (raw input) channel.
Brian Granger
Added heartbeat support.
r2910 hb_port : int, optional
The port to use for the hearbeat REP channel.
MinRK
zmq kernels now started via newapp
r3970 ip : str, optional
The ip address the kernel will bind to.
epatters
Add stdin/stdout/stderr options to kernel launch functions.
r3828 stdin, stdout, stderr : optional (default None)
Standards streams, as defined in subprocess.Popen.
epatters
Add option for specifying Python executable to 'launch_kernel'.
r3812 executable : str, optional (default sys.executable)
The Python executable to use for the kernel process.
Bernardo B. Marques
remove all trailling spaces
r4872 independent : bool, optional (default False)
epatters
* Restored functionality after major merge....
r2778 If set, the kernel process is guaranteed to survive if this process
dies. If not set, an effort is made to ensure that the kernel is killed
when this process dies. Note that in this case it is still good practice
to kill kernels manually before exiting.
extra_arguments = list, optional
A list of extra arguments to pass when executing the launch code.
Returns
-------
A tuple of form:
MinRK
zmq kernels now started via newapp
r3970 (kernel_process, shell_port, iopub_port, stdin_port, hb_port)
epatters
* Restored functionality after major merge....
r2778 where kernel_process is a Popen object and the ports are integers.
"""
# Find open ports as necessary.
ports = []
MinRK
zmq kernels now started via newapp
r3970 ports_needed = int(shell_port <= 0) + int(iopub_port <= 0) + \
int(stdin_port <= 0) + int(hb_port <= 0)
epatters
* Restored functionality after major merge....
r2778 for i in xrange(ports_needed):
sock = socket.socket()
sock.bind(('', 0))
ports.append(sock)
for i, sock in enumerate(ports):
port = sock.getsockname()[1]
sock.close()
ports[i] = port
MinRK
zmq kernels now started via newapp
r3970 if shell_port <= 0:
shell_port = ports.pop(0)
if iopub_port <= 0:
iopub_port = ports.pop(0)
if stdin_port <= 0:
stdin_port = ports.pop(0)
Brian Granger
Added heartbeat support.
r2910 if hb_port <= 0:
hb_port = ports.pop(0)
epatters
* Restored functionality after major merge....
r2778
# Build the kernel launch command.
epatters
Add option for specifying Python executable to 'launch_kernel'.
r3812 if executable is None:
executable = sys.executable
MinRK
disallow no-prefix `ipython foo=bar` argument style....
r4197 arguments = [ executable, '-c', code, '--shell=%i'%shell_port,
'--iopub=%i'%iopub_port, '--stdin=%i'%stdin_port,
epatters
BUG: Ensure that kernel can be spawned from a backgrounded process.
r4635 '--hb=%i'%hb_port ]
MinRK
zmq kernels now started via newapp
r3970 if ip is not None:
MinRK
disallow no-prefix `ipython foo=bar` argument style....
r4197 arguments.append('--ip=%s'%ip)
epatters
* Restored functionality after major merge....
r2778 arguments.extend(extra_arguments)
epatters
BUG: Ensure that kernel can be spawned from a backgrounded process.
r4635 # Popen will fail (sometimes with a deadlock) if stdin, stdout, and stderr
# are invalid. Unfortunately, there is in general no way to detect whether
# they are valid. The following two blocks redirect them to (temporary)
# pipes in certain important cases.
# If this process has been backgrounded, our stdin is invalid. Since there
# is no compelling reason for the kernel to inherit our stdin anyway, we'll
# place this one safe and always redirect.
redirect_in = True
_stdin = PIPE if stdin is None else stdin
# If this process in running on pythonw, we know that stdin, stdout, and
# stderr are all invalid.
redirect_out = sys.executable.endswith('pythonw.exe')
Bernardo B. Marques
remove all trailling spaces
r4872 if redirect_out:
epatters
BUG: Ensure that kernel can be spawned from a backgrounded process.
r4635 _stdout = PIPE if stdout is None else stdout
_stderr = PIPE if stderr is None else stderr
else:
Bernardo B. Marques
remove all trailling spaces
r4872 _stdout, _stderr = stdout, stderr
epatters
BUG: Ensure that kernel can be spawned from a backgrounded process.
r4635
epatters
* Restored functionality after major merge....
r2778 # Spawn a kernel.
epatters
Fixed launch_kernel to support pythonw.exe. The joys of Windows programming...
r2944 if sys.platform == 'win32':
epatters
Implemented kernel interrupts for Windows.
r3027 # Create a Win32 event for interrupting the kernel.
interrupt_event = ParentPollerWindows.create_interrupt_event()
MinRK
disallow no-prefix `ipython foo=bar` argument style....
r4197 arguments += [ '--interrupt=%i'%interrupt_event ]
epatters
More pythonw.exe-specific fixes to the kernel launching pipeline.
r2980
Evan Patterson
Properly support std* redirection when using pythonw on Windows.
r3833 # If the kernel is running on pythonw and stdout/stderr are not been
# re-directed, it will crash when more than 4KB of data is written to
# stdout or stderr. This is a bug that has been with Python for a very
# long time; see http://bugs.python.org/issue706263.
# A cleaner solution to this problem would be to pass os.devnull to
# Popen directly. Unfortunately, that does not work.
if executable.endswith('pythonw.exe'):
if stdout is None:
arguments.append('--no-stdout')
if stderr is None:
arguments.append('--no-stderr')
# Launch the kernel process.
epatters
Fixed launch_kernel to support pythonw.exe. The joys of Windows programming...
r2944 if independent:
Bernardo B. Marques
remove all trailling spaces
r4872 proc = Popen(arguments,
epatters
Implemented kernel interrupts for Windows.
r3027 creationflags=512, # CREATE_NEW_PROCESS_GROUP
epatters
Add stdin/stdout/stderr options to kernel launch functions.
r3828 stdin=_stdin, stdout=_stdout, stderr=_stderr)
epatters
* Restored functionality after major merge....
r2778 else:
from _subprocess import DuplicateHandle, GetCurrentProcess, \
DUPLICATE_SAME_ACCESS
pid = GetCurrentProcess()
Bernardo B. Marques
remove all trailling spaces
r4872 handle = DuplicateHandle(pid, pid, pid, 0,
epatters
* Improved frontend-side kernel restart support....
r2913 True, # Inheritable by new processes.
epatters
* Restored functionality after major merge....
r2778 DUPLICATE_SAME_ACCESS)
MinRK
disallow no-prefix `ipython foo=bar` argument style....
r4197 proc = Popen(arguments + ['--parent=%i'%int(handle)],
epatters
Add stdin/stdout/stderr options to kernel launch functions.
r3828 stdin=_stdin, stdout=_stdout, stderr=_stderr)
epatters
More pythonw.exe-specific fixes to the kernel launching pipeline.
r2980
epatters
Implemented kernel interrupts for Windows.
r3027 # Attach the interrupt event to the Popen objet so it can be used later.
proc.win32_interrupt_event = interrupt_event
epatters
Fixed launch_kernel to support pythonw.exe. The joys of Windows programming...
r2944 else:
if independent:
epatters
Add stdin/stdout/stderr options to kernel launch functions.
r3828 proc = Popen(arguments, preexec_fn=lambda: os.setsid(),
epatters
BUG: Ensure that kernel can be spawned from a backgrounded process.
r4635 stdin=_stdin, stdout=_stdout, stderr=_stderr)
epatters
* Restored functionality after major merge....
r2778 else:
MinRK
disallow no-prefix `ipython foo=bar` argument style....
r4197 proc = Popen(arguments + ['--parent=1'],
epatters
BUG: Ensure that kernel can be spawned from a backgrounded process.
r4635 stdin=_stdin, stdout=_stdout, stderr=_stderr)
# Clean up pipes created to work around Popen bug.
if redirect_in:
if stdin is None:
proc.stdin.close()
if redirect_out:
if stdout is None:
proc.stdout.close()
if stderr is None:
proc.stderr.close()
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
zmq kernels now started via newapp
r3970 return proc, shell_port, iopub_port, stdin_port, hb_port