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 os
import sys import sys
import shutil import shutil
import subprocess
import tempfile import tempfile
import time import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
@ -33,6 +32,16 @@ try:
except: except:
PNUM = 70 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( INTEGRATION_TEST_DIR = os.path.dirname(
os.path.normpath(os.path.abspath(__file__)) 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:])) ppath = 'PYTHONPATH={0}:{1}'.format(CODE_DIR, ':'.join(sys.path[1:]))
cmd = '{0} {1} {2} {3}'.format(ppath, PYEXEC, path, arg_str) 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: 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() out, err = process.communicate()
# Force closing stderr/stdout to release file descriptors # Force closing stderr/stdout to release file descriptors
process.stdout.close() process.stdout.close()
@ -596,9 +598,6 @@ class ShellCase(TestCase):
# process already terminated # process already terminated
pass pass
process = subprocess.Popen(
cmd, shell=True, stdout=subprocess.PIPE
)
data = process.communicate() data = process.communicate()
process.stdout.close() process.stdout.close()

1532
tests/py27_subprocess.py Normal file

File diff suppressed because it is too large Load Diff