##// END OF EJS Templates
Release 5.0.0b4...
Release 5.0.0b4 What's new since b3: Small delay since last beta release, sorry about that, a few reasons though: - We / I slowed down a bit on the beta release pace, there was a few bugs/issues/User interface annoyance that needed a new version of prompt_toolkit to be released, there was no reasons to make extra-beta without this new version released. - We backed-down on some changes on which we had a few disagrements (more below). - I got sick, and had to catch up with backlog. Anyway, Jonathan release prompt_toolkit 1.0.1 and 1.0.2, so even if you don't try this new beta, upgrading prompt_toolkit will fix some of your issues. == Move back `TerminalInteractiveShell` to it's old place. This is a bigger breaking change since 5.0b3, the `TerminalInteractiveshell` moved back from `IPython.terminal.ptshell` to `IPython.terminal.interactiveshell`, if you've updated your project recently to adapt to this change we're sorry, but despite the fact that the version pre 5.0 and post 5.0 are relatively different the cost of conditional import for project depending on us appeared to be too high. So it's now easier to migrate from 4.0 to 5.0 as the class have the same name, and same location == Option name and default changed. `TerminalInteractiveShell.display_completions_in_column` is now gone. It was not present on 4.x so no API breakage there, and is now replaced by `TerminalInteractiveShell.display_completions` and is a enum that gained a 3rd mode for the completer: `readlinelike` for those of you that regret readline. This give us more flexibility for further options. Would appreciate testing of this new layout from vi user. The two other mode now being `column` and `multicolumn`. By popular request, `multicolumn` is not the default value for the previous option. == bug fixed: - quit/exit broken in ipdb - Copy/Past broken on windowm - Unicode broken on windows - function signature garbled when using `object?` - issue with paging text with `?` - completer could get stuck. See the complete git log for more informations.

File last commit:

r17181:c8507215
r22560:1b487f7a
Show More
_process_win32.py
192 lines | 6.3 KiB | text/x-python | PythonLexer
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 """Windows-specific implementation of process utilities.
This file is only meant to be imported by process.py, not by end-users.
"""
#-----------------------------------------------------------------------------
Matthias BUSSONNIER
update copyright to 2011/20xx-2011...
r5390 # Copyright (C) 2010-2011 The IPython Development Team
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
from __future__ import print_function
# stdlib
import os
import sys
Jörgen Stenarson
Moved arg_split to _process_win32.py and _process_posix.py.
r5517 import ctypes
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908
Jörgen Stenarson
Moved arg_split to _process_win32.py and _process_posix.py.
r5517 from ctypes import c_int, POINTER
from ctypes.wintypes import LPCWSTR, HLOCAL
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 from subprocess import STDOUT
# our own imports
MinRK
add strict kwarg to win32 arg_split...
r5713 from ._process_common import read_no_interrupt, process_handler, arg_split as py_arg_split
Jörgen Stenarson
Moved arg_split to _process_win32.py and _process_posix.py.
r5517 from . import py3compat
Brandon Parsons
saner default encoding mechanism
r6716 from .encoding import DEFAULT_ENCODING
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908
#-----------------------------------------------------------------------------
# Function definitions
#-----------------------------------------------------------------------------
class AvoidUNCPath(object):
"""A context manager to protect command execution from UNC paths.
In the Win32 API, commands can't be invoked with the cwd being a UNC path.
This context manager temporarily changes directory to the 'C:' drive on
entering, and restores the original working directory on exit.
The context manager returns the starting working directory *if* it made a
change and None otherwise, so that users can apply the necessary adjustment
to their system calls in the event of a change.
Thomas Kluyver
Improvements to docs formatting.
r12553 Examples
--------
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 ::
cmd = 'dir'
with AvoidUNCPath() as path:
if path is not None:
cmd = '"pushd %s &&"%s' % (path, cmd)
os.system(cmd)
"""
def __enter__(self):
Thomas Kluyver
Python 3 compatibility for os.getcwdu()
r13447 self.path = py3compat.getcwd()
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 self.is_unc_path = self.path.startswith(r"\\")
if self.is_unc_path:
# change to c drive (as cmd.exe cannot handle UNC addresses)
os.chdir("C:")
Fernando Perez
Fix small bug in UNC path context manager.
r2909 return self.path
else:
# We return None to signal that there was no change in the working
# directory
return None
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908
def __exit__(self, exc_type, exc_value, traceback):
if self.is_unc_path:
os.chdir(self.path)
def _find_cmd(cmd):
"""Find the full path to a .bat or .exe using the win32api module."""
try:
from win32api import SearchPath
except ImportError:
raise ImportError('you need to have pywin32 installed for this to work')
else:
PATH = os.environ['PATH']
extensions = ['.exe', '.com', '.bat', '.py']
path = None
for ext in extensions:
try:
Thomas Kluyver
Allow filename with extension in find_cmd in Windows....
r10678 path = SearchPath(PATH, cmd, ext)[0]
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 except:
pass
if path is None:
raise OSError("command %r not found" % cmd)
else:
return path
def _system_body(p):
"""Callback for _system."""
Brandon Parsons
saner default encoding mechanism
r6716 enc = DEFAULT_ENCODING
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 for line in read_no_interrupt(p.stdout).splitlines():
Thomas Kluyver
Improve robustness, as suggested by Min.
r3476 line = line.decode(enc, 'replace')
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 print(line, file=sys.stdout)
for line in read_no_interrupt(p.stderr).splitlines():
Thomas Kluyver
Improve robustness, as suggested by Min.
r3476 line = line.decode(enc, 'replace')
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 print(line, file=sys.stderr)
MinRK
store exit code in user_ns['_exit_code']...
r3910 # Wait to finish for returncode
return p.wait()
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908
def system(cmd):
"""Win32 version of os.system() that works with network shares.
Note that this implementation returns None, as meant for use in IPython.
Parameters
----------
Thomas Kluyver
Allow process_handler to accept a list of arguments
r13738 cmd : str or list
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 A command to be executed in the system shell.
Returns
-------
None : we explicitly do NOT return the subprocess status code, as this
utility is meant to be used extensively in IPython, where any return value
would trigger :func:`sys.displayhook` calls.
"""
Mark Wiebe
Tweak out the process controller class so it works interactively better...
r6130 # The controller provides interactivity with both
# stdin and stdout
Jonathan March
Fixes gh-1632; minimal revert of gh-1424...
r7424 #import _process_win32_controller
#_process_win32_controller.system(cmd)
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908
Jonathan March
Fixes gh-1632; minimal revert of gh-1424...
r7424 with AvoidUNCPath() as path:
if path is not None:
cmd = '"pushd %s &&"%s' % (path, cmd)
return process_handler(cmd, _system_body)
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908
def getoutput(cmd):
"""Return standard output of executing cmd in a shell.
Accepts the same arguments as os.system().
Parameters
----------
Thomas Kluyver
Allow process_handler to accept a list of arguments
r13738 cmd : str or list
Fernando Perez
Fully refactored subprocess handling on all platforms....
r2908 A command to be executed in the system shell.
Returns
-------
stdout : str
"""
with AvoidUNCPath() as path:
if path is not None:
cmd = '"pushd %s &&"%s' % (path, cmd)
out = process_handler(cmd, lambda p: p.communicate()[0], STDOUT)
if out is None:
Jörgen Stenarson
Declare byte-type
r7518 out = b''
Jörgen Stenarson
cast return value to str in getoutput
r7513 return py3compat.bytes_to_str(out)
Jörgen Stenarson
Moved arg_split to _process_win32.py and _process_posix.py.
r5517
Jörgen Stenarson
Create fallback with old arg_split, incase CommandLineToArgvW is missing.
r5533 try:
CommandLineToArgvW = ctypes.windll.shell32.CommandLineToArgvW
CommandLineToArgvW.arg_types = [LPCWSTR, POINTER(c_int)]
Jörgen Stenarson
fixes #1708, failing test in arg_split on windows
r6728 CommandLineToArgvW.restype = POINTER(LPCWSTR)
Jörgen Stenarson
Create fallback with old arg_split, incase CommandLineToArgvW is missing.
r5533 LocalFree = ctypes.windll.kernel32.LocalFree
LocalFree.res_type = HLOCAL
LocalFree.arg_types = [HLOCAL]
MinRK
add strict kwarg to win32 arg_split...
r5713 def arg_split(commandline, posix=False, strict=True):
Jörgen Stenarson
Create fallback with old arg_split, incase CommandLineToArgvW is missing.
r5533 """Split a command line's arguments in a shell-like manner.
This is a special version for windows that use a ctypes call to CommandLineToArgvW
to do the argv splitting. The posix paramter is ignored.
MinRK
add strict kwarg to win32 arg_split...
r5713
If strict=False, process_common.arg_split(...strict=False) is used instead.
Jörgen Stenarson
Create fallback with old arg_split, incase CommandLineToArgvW is missing.
r5533 """
#CommandLineToArgvW returns path to executable if called with empty string.
if commandline.strip() == "":
return []
MinRK
add strict kwarg to win32 arg_split...
r5713 if not strict:
# not really a cl-arg, fallback on _process_common
return py_arg_split(commandline, posix=posix, strict=strict)
Jörgen Stenarson
Create fallback with old arg_split, incase CommandLineToArgvW is missing.
r5533 argvn = c_int()
result_pointer = CommandLineToArgvW(py3compat.cast_unicode(commandline.lstrip()), ctypes.byref(argvn))
result_array_type = LPCWSTR * argvn.value
Jörgen Stenarson
fixes #1708, failing test in arg_split on windows
r6728 result = [arg for arg in result_array_type.from_address(ctypes.addressof(result_pointer.contents))]
Jörgen Stenarson
Create fallback with old arg_split, incase CommandLineToArgvW is missing.
r5533 retval = LocalFree(result_pointer)
return result
except AttributeError:
MinRK
add strict kwarg to win32 arg_split...
r5713 arg_split = py_arg_split
Thomas Kluyver
Check for pids when listing nbserver processes
r17181
def check_pid(pid):
# OpenProcess returns 0 if no such process (of ours) exists
# positive int otherwise
return bool(ctypes.windll.kernel32.OpenProcess(1,0,pid))