commit
						f16d54f9a8
					
				|  | @ -6,6 +6,7 @@ Changes between 1.2.1 and 1.2.2 (release pending) | |||
| - (issue87) fix unboundlocal error in assertionold code  | ||||
| - (issue86) improve documentation for looponfailing | ||||
| - fix jython/win32 issues | ||||
| - ship distribute_setup.py version 0.6.10  | ||||
| 
 | ||||
| 
 | ||||
| Changes between 1.2.1 and 1.2.0 | ||||
|  |  | |||
|  | @ -46,19 +46,21 @@ except ImportError: | |||
|             args = [quote(arg) for arg in args] | ||||
|         return os.spawnl(os.P_WAIT, sys.executable, *args) == 0 | ||||
| 
 | ||||
| DEFAULT_VERSION = "0.6.6" | ||||
| DEFAULT_VERSION = "0.6.10" | ||||
| DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/" | ||||
| SETUPTOOLS_FAKED_VERSION = "0.6c11" | ||||
| 
 | ||||
| SETUPTOOLS_PKG_INFO = """\ | ||||
| Metadata-Version: 1.0 | ||||
| Name: setuptools | ||||
| Version: 0.6c9 | ||||
| Version: %s | ||||
| Summary: xxxx | ||||
| Home-page: xxx | ||||
| Author: xxx | ||||
| Author-email: xxx | ||||
| License: xxx | ||||
| Description: xxx | ||||
| """ | ||||
| """ % SETUPTOOLS_FAKED_VERSION | ||||
| 
 | ||||
| 
 | ||||
| def _install(tarball): | ||||
|  | @ -79,12 +81,14 @@ def _install(tarball): | |||
| 
 | ||||
|         # installing | ||||
|         log.warn('Installing Distribute') | ||||
|         assert _python_cmd('setup.py', 'install') | ||||
|         if not _python_cmd('setup.py', 'install'): | ||||
|             log.warn('Something went wrong during the installation.') | ||||
|             log.warn('See the error message above.') | ||||
|     finally: | ||||
|         os.chdir(old_wd) | ||||
| 
 | ||||
| 
 | ||||
| def _build_egg(tarball, to_dir): | ||||
| def _build_egg(egg, tarball, to_dir): | ||||
|     # extracting the tarball | ||||
|     tmpdir = tempfile.mkdtemp() | ||||
|     log.warn('Extracting in %s', tmpdir) | ||||
|  | @ -104,27 +108,28 @@ def _build_egg(tarball, to_dir): | |||
|         log.warn('Building a Distribute egg in %s', to_dir) | ||||
|         _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) | ||||
| 
 | ||||
|         # returning the result | ||||
|         for file in os.listdir(to_dir): | ||||
|             if fnmatch.fnmatch(file, 'distribute-%s*.egg' % DEFAULT_VERSION): | ||||
|                 return os.path.join(to_dir, file) | ||||
| 
 | ||||
|         raise IOError('Could not build the egg.') | ||||
|     finally: | ||||
|         os.chdir(old_wd) | ||||
|     # returning the result | ||||
|     log.warn(egg) | ||||
|     if not os.path.exists(egg): | ||||
|         raise IOError('Could not build the egg.') | ||||
| 
 | ||||
| 
 | ||||
| def _do_download(version, download_base, to_dir, download_delay): | ||||
|     egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg' | ||||
|                        % (version, sys.version_info[0], sys.version_info[1])) | ||||
|     if not os.path.exists(egg): | ||||
|         tarball = download_setuptools(version, download_base, | ||||
|                                       to_dir, download_delay) | ||||
|     egg = _build_egg(tarball, to_dir) | ||||
|         _build_egg(egg, tarball, to_dir) | ||||
|     sys.path.insert(0, egg) | ||||
|     import setuptools | ||||
|     setuptools.bootstrap_install_from = egg | ||||
| 
 | ||||
| 
 | ||||
| def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, | ||||
|                    to_dir=os.curdir, download_delay=15, no_fake=False): | ||||
|                    to_dir=os.curdir, download_delay=15, no_fake=True): | ||||
|     # making sure we use the absolute path | ||||
|     to_dir = os.path.abspath(to_dir) | ||||
|     was_imported = 'pkg_resources' in sys.modules or \ | ||||
|  | @ -134,7 +139,7 @@ def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, | |||
|             import pkg_resources | ||||
|             if not hasattr(pkg_resources, '_distribute'): | ||||
|                 if not no_fake: | ||||
|                     fake_setuptools() | ||||
|                     _fake_setuptools() | ||||
|                 raise ImportError | ||||
|         except ImportError: | ||||
|             return _do_download(version, download_base, to_dir, download_delay) | ||||
|  | @ -159,6 +164,7 @@ def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, | |||
|             return _do_download(version, download_base, to_dir, | ||||
|                                 download_delay) | ||||
|     finally: | ||||
|         if not no_fake: | ||||
|             _create_fake_setuptools_pkg_info(to_dir) | ||||
| 
 | ||||
| def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, | ||||
|  | @ -218,22 +224,34 @@ def _patch_file(path, content): | |||
| def _same_content(path, content): | ||||
|     return open(path).read() == content | ||||
| 
 | ||||
| def _no_sandbox(function): | ||||
|     def __no_sandbox(*args, **kw): | ||||
|         try: | ||||
|             from setuptools.sandbox import DirectorySandbox | ||||
|             def violation(*args): | ||||
|                 pass | ||||
|             DirectorySandbox._old = DirectorySandbox._violation | ||||
|             DirectorySandbox._violation = violation | ||||
|             patched = True | ||||
|         except ImportError: | ||||
|             patched = False | ||||
| 
 | ||||
|         try: | ||||
|             return function(*args, **kw) | ||||
|         finally: | ||||
|             if patched: | ||||
|                 DirectorySandbox._violation = DirectorySandbox._old | ||||
|                 del DirectorySandbox._old | ||||
| 
 | ||||
|     return __no_sandbox | ||||
| 
 | ||||
| @_no_sandbox | ||||
| def _rename_path(path): | ||||
|     new_name = path + '.OLD.%s' % time.time() | ||||
|     log.warn('Renaming %s into %s', path, new_name) | ||||
|     try: | ||||
|         from setuptools.sandbox import DirectorySandbox | ||||
|         def _violation(*args): | ||||
|             pass | ||||
|         DirectorySandbox._violation = _violation | ||||
|     except ImportError: | ||||
|         pass | ||||
| 
 | ||||
|     os.rename(path, new_name) | ||||
|     return new_name | ||||
| 
 | ||||
| 
 | ||||
| def _remove_flat_installation(placeholder): | ||||
|     if not os.path.isdir(placeholder): | ||||
|         log.warn('Unkown installation at %s', placeholder) | ||||
|  | @ -273,22 +291,26 @@ def _after_install(dist): | |||
|     placeholder = dist.get_command_obj('install').install_purelib | ||||
|     _create_fake_setuptools_pkg_info(placeholder) | ||||
| 
 | ||||
| @_no_sandbox | ||||
| def _create_fake_setuptools_pkg_info(placeholder): | ||||
|     if not placeholder or not os.path.exists(placeholder): | ||||
|         log.warn('Could not find the install location') | ||||
|         return | ||||
|     pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1]) | ||||
|     setuptools_file = 'setuptools-0.6c9-py%s.egg-info' % pyver | ||||
|     setuptools_file = 'setuptools-%s-py%s.egg-info' % \ | ||||
|             (SETUPTOOLS_FAKED_VERSION, pyver) | ||||
|     pkg_info = os.path.join(placeholder, setuptools_file) | ||||
|     if os.path.exists(pkg_info): | ||||
|         log.warn('%s already exists', pkg_info) | ||||
|         return | ||||
| 
 | ||||
|     log.warn('Creating %s', pkg_info) | ||||
|     f = open(pkg_info, 'w') | ||||
|     try: | ||||
|         f.write(SETUPTOOLS_PKG_INFO) | ||||
|     finally: | ||||
|         f.close() | ||||
| 
 | ||||
|     pth_file = os.path.join(placeholder, 'setuptools.pth') | ||||
|     log.warn('Creating %s', pth_file) | ||||
|     f = open(pth_file, 'w') | ||||
|  | @ -297,7 +319,6 @@ def _create_fake_setuptools_pkg_info(placeholder): | |||
|     finally: | ||||
|         f.close() | ||||
| 
 | ||||
| 
 | ||||
| def _patch_egg_dir(path): | ||||
|     # let's check if it's already patched | ||||
|     pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') | ||||
|  | @ -319,7 +340,7 @@ def _patch_egg_dir(path): | |||
| 
 | ||||
| def _before_install(): | ||||
|     log.warn('Before install bootstrap.') | ||||
|     fake_setuptools() | ||||
|     _fake_setuptools() | ||||
| 
 | ||||
| 
 | ||||
| def _under_prefix(location): | ||||
|  | @ -340,7 +361,7 @@ def _under_prefix(location): | |||
|     return True | ||||
| 
 | ||||
| 
 | ||||
| def fake_setuptools(): | ||||
| def _fake_setuptools(): | ||||
|     log.warn('Scanning installed packages') | ||||
|     try: | ||||
|         import pkg_resources | ||||
|  |  | |||
|  | @ -1,6 +1,10 @@ | |||
| import re | ||||
| import sys | ||||
| import parser | ||||
| 
 | ||||
| try: | ||||
|     import parser | ||||
| except ImportError: | ||||
|     parser = None | ||||
| 
 | ||||
| d={} | ||||
| #  d is the dictionary of unittest changes, keyed to the old name | ||||
|  |  | |||
|  | @ -523,7 +523,8 @@ class FormattedExcinfo(object): | |||
|             source = py.code.Source("???") | ||||
|             line_index = 0 | ||||
|         else: | ||||
|             line_index = entry.lineno - entry.getfirstlinesource() | ||||
|             # entry.getfirstlinesource() can be -1, should be 0 on jython | ||||
|             line_index = entry.lineno - max(entry.getfirstlinesource(), 0) | ||||
| 
 | ||||
|         lines = [] | ||||
|         if self.style == "long": | ||||
|  |  | |||
|  | @ -353,6 +353,8 @@ def parse_time_with_missing_year(timestr): | |||
|     day = time.strptime(tparts.pop(0), '%d')[2] | ||||
|     last = tparts.pop(0) # year or hour:minute | ||||
|     try: | ||||
|         if ":" in last: | ||||
|             raise ValueError() | ||||
|         year = time.strptime(last, '%Y')[0] | ||||
|         hour = minute = 0 | ||||
|     except ValueError: | ||||
|  |  | |||
|  | @ -100,7 +100,7 @@ def raises(ExpectedException, *args, **kwargs): | |||
|         k = ", ".join(["%s=%r" % x for x in kwargs.items()]) | ||||
|         if k: | ||||
|             k = ', ' + k | ||||
|         expr = '%s(%r%s)' %(func.__name__, args, k) | ||||
|         expr = '%s(%r%s)' %(getattr(func, '__name__', func), args, k) | ||||
|     raise ExceptionFailure(msg="DID NOT RAISE",  | ||||
|                            expr=args, expected=ExpectedException)  | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,3 +1,5 @@ | |||
| import py | ||||
| py.test.importorskip("parser") | ||||
| from py._cmdline.pyconvert_unittest import rewrite_utest | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,6 +3,8 @@ import py | |||
| from py._code.code import FormattedExcinfo, ReprExceptionInfo | ||||
| queue = py.builtin._tryimport('queue', 'Queue') | ||||
| 
 | ||||
| failsonjython = py.test.mark.xfail("sys.platform.startswith('java')") | ||||
| 
 | ||||
| class TWMock:  | ||||
|     def __init__(self): | ||||
|         self.lines = [] | ||||
|  | @ -82,6 +84,7 @@ class TestTraceback_f_g_h: | |||
|         assert s.startswith("def f():") | ||||
|         assert s.endswith("raise ValueError")  | ||||
| 
 | ||||
|     @failsonjython | ||||
|     def test_traceback_entry_getsource_in_construct(self): | ||||
|         source = py.code.Source("""\ | ||||
|             def xyz(): | ||||
|  | @ -216,7 +219,7 @@ def test_excinfo_repr(): | |||
| def test_excinfo_str(): | ||||
|     excinfo = py.test.raises(ValueError, h) | ||||
|     s = str(excinfo) | ||||
|     assert s.startswith(__file__[:-1]) # pyc file  | ||||
|     assert s.startswith(__file__[:-9]) # pyc file and $py.class | ||||
|     assert s.endswith("ValueError") | ||||
|     assert len(s.split(":")) >= 3 # on windows it's 4 | ||||
| 
 | ||||
|  | @ -290,6 +293,7 @@ class TestFormattedExcinfo: | |||
|         assert lines[0] == "|   def f(x):" | ||||
|         assert lines[1] == "        pass" | ||||
| 
 | ||||
|     @failsonjython | ||||
|     def test_repr_source_excinfo(self): | ||||
|         """ check if indentation is right """ | ||||
|         pr = FormattedExcinfo() | ||||
|  |  | |||
|  | @ -1,2 +0,0 @@ | |||
| import sys | ||||
| import py | ||||
|  | @ -2,6 +2,8 @@ from py.code import Source | |||
| import py | ||||
| import sys | ||||
| 
 | ||||
| failsonjython = py.test.mark.xfail("sys.platform.startswith('java')") | ||||
| 
 | ||||
| def test_source_str_function(): | ||||
|     x = Source("3") | ||||
|     assert str(x) == "3" | ||||
|  | @ -78,6 +80,7 @@ def test_source_strip_multiline(): | |||
|     source2 = source.strip()  | ||||
|     assert source2.lines == [" hello"] | ||||
| 
 | ||||
| @failsonjython | ||||
| def test_syntaxerror_rerepresentation(): | ||||
|     ex = py.test.raises(SyntaxError, py.code.compile, 'x x') | ||||
|     assert ex.value.lineno == 1 | ||||
|  | @ -129,6 +132,7 @@ class TestSourceParsingAndCompiling: | |||
|         exec (co, d) | ||||
|         assert d['x'] == 3 | ||||
| 
 | ||||
|     @failsonjython | ||||
|     def test_compile_and_getsource_simple(self): | ||||
|         co = py.code.compile("x=3") | ||||
|         exec (co) | ||||
|  | @ -199,6 +203,7 @@ class TestSourceParsingAndCompiling: | |||
|         assert isinstance(mod, ast.Module) | ||||
|         compile(mod, "<filename>", "exec") | ||||
| 
 | ||||
|     @failsonjython | ||||
|     def test_compile_and_getsource(self): | ||||
|         co = self.source.compile() | ||||
|         py.builtin.exec_(co, globals()) | ||||
|  | @ -255,6 +260,7 @@ def test_getstartingblock_multiline(): | |||
|     l = [i for i in x.source.lines if i.strip()] | ||||
|     assert len(l) == 4 | ||||
| 
 | ||||
| @failsonjython | ||||
| def test_getline_finally(): | ||||
|     def c(): pass | ||||
|     excinfo = py.test.raises(TypeError, """ | ||||
|  | @ -268,6 +274,7 @@ def test_getline_finally(): | |||
|     source = excinfo.traceback[-1].statement | ||||
|     assert str(source).strip() == 'c(1)' | ||||
| 
 | ||||
| @failsonjython | ||||
| def test_getfuncsource_dynamic(): | ||||
|     source = """ | ||||
|         def f(): | ||||
|  | @ -334,6 +341,7 @@ def test_getsource_fallback(): | |||
|     src = getsource(x) | ||||
|     assert src == expected | ||||
| 
 | ||||
| @failsonjython | ||||
| def test_idem_compile_and_getsource(): | ||||
|     from py._code.source import getsource | ||||
|     expected = "def x(): pass" | ||||
|  | @ -347,6 +355,7 @@ def test_findsource_fallback(): | |||
|     assert 'test_findsource_simple' in str(src) | ||||
|     assert src[lineno] == '    def x():' | ||||
| 
 | ||||
| @failsonjython | ||||
| def test_findsource___source__(): | ||||
|     from py._code.source import findsource | ||||
|     co = py.code.compile("""if 1: | ||||
|  | @ -364,6 +373,7 @@ def test_findsource___source__(): | |||
|     assert src[lineno] == "    def x():" | ||||
|      | ||||
| 
 | ||||
| @failsonjython | ||||
| def test_getfslineno(): | ||||
|     from py.code import getfslineno | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,8 @@ | |||
| import os, sys | ||||
| import py | ||||
| 
 | ||||
| needsdup = py.test.mark.skipif("not hasattr(os, 'dup')") | ||||
| 
 | ||||
| from py.builtin import print_ | ||||
| 
 | ||||
| if sys.version_info >= (3,0): | ||||
|  | @ -72,6 +74,7 @@ def pytest_funcarg__tmpfile(request): | |||
|     request.addfinalizer(f.close) | ||||
|     return f | ||||
| 
 | ||||
| @needsdup | ||||
| def test_dupfile(tmpfile): | ||||
|     somefile = tmpfile | ||||
|     flist = [] | ||||
|  | @ -91,6 +94,8 @@ def test_dupfile(tmpfile): | |||
|     somefile.close() | ||||
| 
 | ||||
| class TestFDCapture:  | ||||
|     pytestmark = needsdup  | ||||
| 
 | ||||
|     def test_stdout(self, tmpfile): | ||||
|         fd = tmpfile.fileno() | ||||
|         cap = py.io.FDCapture(fd) | ||||
|  | @ -261,6 +266,8 @@ class TestStdCapture: | |||
|         assert not err  | ||||
| 
 | ||||
| class TestStdCaptureFD(TestStdCapture):  | ||||
|     pytestmark = needsdup | ||||
| 
 | ||||
|     def getcapture(self, **kw):  | ||||
|         return py.io.StdCaptureFD(**kw) | ||||
| 
 | ||||
|  | @ -289,6 +296,7 @@ class TestStdCaptureFD(TestStdCapture): | |||
|         assert out.startswith("3")  | ||||
|         assert err.startswith("4")  | ||||
| 
 | ||||
| @needsdup | ||||
| def test_capture_no_sys():  | ||||
|     capsys = py.io.StdCapture() | ||||
|     try: | ||||
|  | @ -303,6 +311,7 @@ def test_capture_no_sys(): | |||
|     finally: | ||||
|         capsys.reset() | ||||
| 
 | ||||
| @needsdup | ||||
| def test_callcapture_nofd():  | ||||
|     def func(x, y):  | ||||
|         oswritebytes(1, "hello") | ||||
|  |  | |||
|  | @ -38,9 +38,12 @@ def test_terminalwriter_dumb_term_no_markup(monkeypatch): | |||
|         def isatty(self): | ||||
|             return True | ||||
|     monkeypatch.setattr(sys, 'stdout', MyFile()) | ||||
|     try: | ||||
|         assert sys.stdout.isatty() | ||||
|         tw = py.io.TerminalWriter() | ||||
|         assert not tw.hasmarkup | ||||
|     finally: | ||||
|         monkeypatch.undo() | ||||
| 
 | ||||
| def test_unicode_encoding(): | ||||
|     msg = py.builtin._totext('b\u00f6y', 'utf8') | ||||
|  |  | |||
|  | @ -117,7 +117,7 @@ class TestLogConsumer: | |||
| 
 | ||||
|     def test_log_file(self, tmpdir): | ||||
|         customlog = tmpdir.join('log.out') | ||||
|         py.log.setconsumer("default", open(str(customlog), 'w', buffering=1)) | ||||
|         py.log.setconsumer("default", open(str(customlog), 'w', 1)) | ||||
|         py.log.Producer("default")("hello world #1")  | ||||
|         assert customlog.readlines() == ['[default] hello world #1\n'] | ||||
| 
 | ||||
|  |  | |||
|  | @ -13,6 +13,12 @@ class TestSvnURLCommandPath(CommonSvnTests): | |||
|     def test_load(self, path1): | ||||
|         super(TestSvnURLCommandPath, self).test_load(path1) | ||||
| 
 | ||||
|     # the following two work on jython but not in local/svnwc | ||||
|     def test_listdir(self, path1): | ||||
|         super(TestSvnURLCommandPath, self).test_listdir(path1) | ||||
|     def test_visit_ignore(self, path1): | ||||
|         super(TestSvnURLCommandPath, self).test_visit_ignore(path1) | ||||
| 
 | ||||
|     def test_svnurl_needs_arg(self, path1): | ||||
|         py.test.raises(TypeError, "py.path.svnurl()") | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| import py | ||||
| import sys | ||||
| import os, sys | ||||
| from py._plugin.pytest__pytest import HookRecorder | ||||
| from py._test.pluginmanager import Registry | ||||
| 
 | ||||
|  | @ -17,7 +17,7 @@ def test_hookrecorder_basic(): | |||
| 
 | ||||
| def test_hookrecorder_basic_no_args_hook(): | ||||
|     rec = HookRecorder(Registry()) | ||||
|     apimod = type(sys)('api') | ||||
|     apimod = type(os)('api') | ||||
|     def xyz(): | ||||
|         pass | ||||
|     apimod.xyz = xyz | ||||
|  |  | |||
|  | @ -82,7 +82,7 @@ class TestTerminal: | |||
|         ]) | ||||
| 
 | ||||
|     def test_collect_fail(self, testdir, option): | ||||
|         p = testdir.makepyfile("import xyz") | ||||
|         p = testdir.makepyfile("import xyz\n") | ||||
|         result = testdir.runpytest(*option._getcmdargs()) | ||||
|         result.stdout.fnmatch_lines([ | ||||
|             "*test_collect_fail.py E*", | ||||
|  |  | |||
|  | @ -1,8 +1,10 @@ | |||
| import py | ||||
| import sys, os | ||||
| 
 | ||||
| def fass(): | ||||
|     assert 1 == 2 | ||||
| def check_assertion(): | ||||
|     excinfo = py.test.raises(AssertionError, "assert 1 == 2") | ||||
|     excinfo = py.test.raises(AssertionError, fass) | ||||
|     s = excinfo.exconly(tryshort=True) | ||||
|     if not s == "assert 1 == 2": | ||||
|         raise ValueError("assertion not enabled: got %s" % s) | ||||
|  | @ -16,6 +18,7 @@ def test_invoke_assertion(recwarn, monkeypatch): | |||
|         py.magic.revoke(assertion=True) | ||||
|     recwarn.pop(DeprecationWarning) | ||||
| 
 | ||||
| @py.test.mark.skipif("sys.platform.startswith('java')") | ||||
| def test_invoke_compile(recwarn, monkeypatch): | ||||
|     monkeypatch.setattr(py.builtin.builtins, 'compile', None) | ||||
|     py.magic.invoke(compile=True) | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ def checksubpackage(name): | |||
|         keys = dir(obj) | ||||
|         assert len(keys) > 0 | ||||
|         print (obj.__map__) | ||||
|         for name in obj.__map__: | ||||
|         for name in list(obj.__map__): | ||||
|             assert hasattr(obj, name), (obj, name) | ||||
| 
 | ||||
| def test_dir(): | ||||
|  |  | |||
|  | @ -15,6 +15,16 @@ class TestRaises: | |||
|     def test_raises_function(self): | ||||
|         py.test.raises(ValueError, int, 'hello') | ||||
| 
 | ||||
|     def test_raises_callable_no_exception(self): | ||||
|         from py._test.outcome import ExceptionFailure | ||||
|         class A: | ||||
|             def __call__(self): | ||||
|                 pass | ||||
|         try: | ||||
|             py.test.raises(ValueError, A()) | ||||
|         except ExceptionFailure: | ||||
|             pass | ||||
| 
 | ||||
| def test_pytest_exit(): | ||||
|     try: | ||||
|         py.test.exit("hello") | ||||
|  | @ -68,5 +78,7 @@ def test_pytest_cmdline_main(testdir): | |||
|            py.test.cmdline.main([__file__]) | ||||
|     """ % (str(py._pydir.dirpath()))) | ||||
|     import subprocess | ||||
|     ret = subprocess.call([sys.executable, str(p)]) | ||||
|     popen = subprocess.Popen([sys.executable, str(p)], stdout=subprocess.PIPE) | ||||
|     s = popen.stdout.read() | ||||
|     ret = popen.wait() | ||||
|     assert ret == 0 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue