summaryrefslogtreecommitdiffstats
path: root/Lib/subprocess.py
diff options
context:
space:
mode:
authorBrian Curtin <brian.curtin@gmail.com>2010-04-24 16:33:18 (GMT)
committerBrian Curtin <brian.curtin@gmail.com>2010-04-24 16:33:18 (GMT)
commite149166412f59fd46a907bf66bf704317b8b06f3 (patch)
tree35bc0d6a30fb01001d83119e5e4e37ebb5998661 /Lib/subprocess.py
parentfe0f117ce67f79092735a858bb587c2890b00a13 (diff)
downloadcpython-e149166412f59fd46a907bf66bf704317b8b06f3.zip
cpython-e149166412f59fd46a907bf66bf704317b8b06f3.tar.gz
cpython-e149166412f59fd46a907bf66bf704317b8b06f3.tar.bz2
Merged revisions 80441 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k ................ r80441 | brian.curtin | 2010-04-24 11:19:22 -0500 (Sat, 24 Apr 2010) | 13 lines Merged revisions 80439 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r80439 | brian.curtin | 2010-04-24 10:40:11 -0500 (Sat, 24 Apr 2010) | 6 lines Fix #7838. Add docstrings and privatize _subprocess implementation details. Since CREATE_NEW_* are used for the creation flags of a subprocess, they were added to __all__. The rest of the previously exposed attributes are now qualified by _subprocess.ATTR rather than importing *. ........ ................
Diffstat (limited to 'Lib/subprocess.py')
-rw-r--r--Lib/subprocess.py86
1 files changed, 39 insertions, 47 deletions
diff --git a/Lib/subprocess.py b/Lib/subprocess.py
index fa54bca..36d7818 100644
--- a/Lib/subprocess.py
+++ b/Lib/subprocess.py
@@ -344,31 +344,18 @@ class CalledProcessError(Exception):
if mswindows:
+ from _subprocess import CREATE_NEW_CONSOLE
import threading
import msvcrt
- if 0: # <-- change this to use pywin32 instead of the _subprocess driver
- import pywintypes
- from win32api import GetStdHandle, STD_INPUT_HANDLE, \
- STD_OUTPUT_HANDLE, STD_ERROR_HANDLE
- from win32api import GetCurrentProcess, DuplicateHandle, \
- GetModuleFileName, GetVersion
- from win32con import DUPLICATE_SAME_ACCESS, SW_HIDE
- from win32pipe import CreatePipe
- from win32process import CreateProcess, STARTUPINFO, \
- GetExitCodeProcess, STARTF_USESTDHANDLES, \
- STARTF_USESHOWWINDOW, CREATE_NEW_CONSOLE
- from win32process import TerminateProcess
- from win32event import WaitForSingleObject, INFINITE, WAIT_OBJECT_0
- else:
- from _subprocess import *
- class STARTUPINFO:
- dwFlags = 0
- hStdInput = None
- hStdOutput = None
- hStdError = None
- wShowWindow = 0
- class pywintypes:
- error = IOError
+ import _subprocess
+ class STARTUPINFO:
+ dwFlags = 0
+ hStdInput = None
+ hStdOutput = None
+ hStdError = None
+ wShowWindow = 0
+ class pywintypes:
+ error = IOError
else:
import select
_has_poll = hasattr(select, 'poll')
@@ -385,6 +372,8 @@ else:
__all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "getstatusoutput",
"getoutput", "check_output", "CalledProcessError"]
+if mswindows:
+ __all__.append("CREATE_NEW_CONSOLE")
try:
MAXFD = os.sysconf("SC_OPEN_MAX")
except:
@@ -747,11 +736,11 @@ class Popen(object):
errread, errwrite = None, None
if stdin is None:
- p2cread = GetStdHandle(STD_INPUT_HANDLE)
+ p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE)
if p2cread is None:
- p2cread, _ = CreatePipe(None, 0)
+ p2cread, _ = _subprocess.CreatePipe(None, 0)
elif stdin == PIPE:
- p2cread, p2cwrite = CreatePipe(None, 0)
+ p2cread, p2cwrite = _subprocess.CreatePipe(None, 0)
elif isinstance(stdin, int):
p2cread = msvcrt.get_osfhandle(stdin)
else:
@@ -760,11 +749,11 @@ class Popen(object):
p2cread = self._make_inheritable(p2cread)
if stdout is None:
- c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE)
+ c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE)
if c2pwrite is None:
- _, c2pwrite = CreatePipe(None, 0)
+ _, c2pwrite = _subprocess.CreatePipe(None, 0)
elif stdout == PIPE:
- c2pread, c2pwrite = CreatePipe(None, 0)
+ c2pread, c2pwrite = _subprocess.CreatePipe(None, 0)
elif isinstance(stdout, int):
c2pwrite = msvcrt.get_osfhandle(stdout)
else:
@@ -773,11 +762,11 @@ class Popen(object):
c2pwrite = self._make_inheritable(c2pwrite)
if stderr is None:
- errwrite = GetStdHandle(STD_ERROR_HANDLE)
+ errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE)
if errwrite is None:
- _, errwrite = CreatePipe(None, 0)
+ _, errwrite = _subprocess.CreatePipe(None, 0)
elif stderr == PIPE:
- errread, errwrite = CreatePipe(None, 0)
+ errread, errwrite = _subprocess.CreatePipe(None, 0)
elif stderr == STDOUT:
errwrite = c2pwrite
elif isinstance(stderr, int):
@@ -794,14 +783,15 @@ class Popen(object):
def _make_inheritable(self, handle):
"""Return a duplicate of handle, which is inheritable"""
- return DuplicateHandle(GetCurrentProcess(), handle,
- GetCurrentProcess(), 0, 1,
- DUPLICATE_SAME_ACCESS)
+ return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(),
+ handle, _subprocess.GetCurrentProcess(), 0, 1,
+ _subprocess.DUPLICATE_SAME_ACCESS)
def _find_w9xpopen(self):
"""Find and return absolut path to w9xpopen.exe"""
- w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)),
+ w9xpopen = os.path.join(
+ os.path.dirname(_subprocess.GetModuleFileName(0)),
"w9xpopen.exe")
if not os.path.exists(w9xpopen):
# Eeek - file-not-found - possibly an embedding
@@ -830,17 +820,17 @@ class Popen(object):
if startupinfo is None:
startupinfo = STARTUPINFO()
if None not in (p2cread, c2pwrite, errwrite):
- startupinfo.dwFlags |= STARTF_USESTDHANDLES
+ startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES
startupinfo.hStdInput = p2cread
startupinfo.hStdOutput = c2pwrite
startupinfo.hStdError = errwrite
if shell:
- startupinfo.dwFlags |= STARTF_USESHOWWINDOW
- startupinfo.wShowWindow = SW_HIDE
+ startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW
+ startupinfo.wShowWindow = _subprocess.SW_HIDE
comspec = os.environ.get("COMSPEC", "cmd.exe")
args = comspec + " /c " + args
- if (GetVersion() >= 0x80000000 or
+ if (_subprocess.GetVersion() >= 0x80000000 or
os.path.basename(comspec).lower() == "command.com"):
# Win9x, or using command.com on NT. We need to
# use the w9xpopen intermediate program. For more
@@ -854,11 +844,11 @@ class Popen(object):
# use at xxx" and a hopeful warning about the
# stability of your system. Cost is Ctrl+C won't
# kill children.
- creationflags |= CREATE_NEW_CONSOLE
+ creationflags |= _subprocess.CREATE_NEW_CONSOLE
# Start the process
try:
- hp, ht, pid, tid = CreateProcess(executable, args,
+ hp, ht, pid, tid = _subprocess.CreateProcess(executable, args,
# no special security
None, None,
int(not close_fds),
@@ -897,8 +887,9 @@ class Popen(object):
"""Check if child process has terminated. Returns returncode
attribute."""
if self.returncode is None:
- if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0:
- self.returncode = GetExitCodeProcess(self._handle)
+ if(_subprocess.WaitForSingleObject(self._handle, 0) ==
+ _subprocess.WAIT_OBJECT_0):
+ self.returncode = _subprocess.GetExitCodeProcess(self._handle)
return self.returncode
@@ -906,8 +897,9 @@ class Popen(object):
"""Wait for child process to terminate. Returns returncode
attribute."""
if self.returncode is None:
- obj = WaitForSingleObject(self._handle, INFINITE)
- self.returncode = GetExitCodeProcess(self._handle)
+ _subprocess.WaitForSingleObject(self._handle,
+ _subprocess.INFINITE)
+ self.returncode = _subprocess.GetExitCodeProcess(self._handle)
return self.returncode
@@ -962,7 +954,7 @@ class Popen(object):
def terminate(self):
"""Terminates the process
"""
- TerminateProcess(self._handle, 1)
+ _subprocess.TerminateProcess(self._handle, 1)
kill = terminate