mirror of
https://github.com/valitydev/salt.git
synced 2024-11-08 01:18:58 +00:00
Merge pull request #2635 from s0undt3ch/features/use-py27-subprocess
Features/use py27 subprocess
This commit is contained in:
commit
dfc90286a9
@ -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
1532
tests/py27_subprocess.py
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user