Merge pull request #2635 from s0undt3ch/features/use-py27-subprocess

Features/use py27 subprocess
This commit is contained in:
Thomas S Hatch 2012-11-19 19:13:46 -08:00
commit dfc90286a9
2 changed files with 1556 additions and 25 deletions

View File

@ -8,7 +8,6 @@ import multiprocessing
import os
import sys
import shutil
import subprocess
import tempfile
import time
from datetime import datetime, timedelta
@ -33,6 +32,16 @@ try:
except:
PNUM = 70
if sys.version_info >= (2, 7):
from subprocess import PIPE, Popen
print('Using regular subprocess')
else:
# Don't do import py27_subprocess as subprocess so within the remaining of
# salt's source, whenever subprocess is imported, the proper one is used,
# even in under python 2.6
from py27_subprocess import PIPE, Popen
print('Using copied 2.7 subprocess')
INTEGRATION_TEST_DIR = os.path.dirname(
os.path.normpath(os.path.abspath(__file__))
@ -562,27 +571,20 @@ class ShellCase(TestCase):
ppath = 'PYTHONPATH={0}:{1}'.format(CODE_DIR, ':'.join(sys.path[1:]))
cmd = '{0} {1} {2} {3}'.format(ppath, PYEXEC, path, arg_str)
popen_kwargs = {
'shell': True,
'stdout': PIPE
}
if catch_stderr:
popen_kwargs['stderr'] = PIPE
if not sys.platform.lower().startswith('win'):
popen_kwargs['close_fds'] = True
process = Popen(cmd, **popen_kwargs)
if catch_stderr:
process = subprocess.Popen(
cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)
if sys.version_info[0:2] < (2, 7):
# On python 2.6, the subprocess'es communicate() method uses
# select which, is limited by the OS to 1024 file descriptors
# We need more available descriptors to run the tests which
# need the stderr output.
# So instead of .communicate() we wait for the process to
# finish, but, as the python docs state "This will deadlock
# when using stdout=PIPE and/or stderr=PIPE and the child
# process generates enough output to a pipe such that it
# blocks waiting for the OS pipe buffer to accept more data.
# Use communicate() to avoid that." <- a catch, catch situation
#
# Use this work around were it's needed only, python 2.6
process.wait()
out = process.stdout.read()
err = process.stderr.read()
else:
out, err = process.communicate()
# Force closing stderr/stdout to release file descriptors
process.stdout.close()
@ -596,9 +598,6 @@ class ShellCase(TestCase):
# process already terminated
pass
process = subprocess.Popen(
cmd, shell=True, stdout=subprocess.PIPE
)
data = process.communicate()
process.stdout.close()

1532
tests/py27_subprocess.py Normal file

File diff suppressed because it is too large Load Diff