diff --git a/tests/test_interpreters.py b/tests/test_interpreters.py index 06aa76f52..2992d8079 100644 --- a/tests/test_interpreters.py +++ b/tests/test_interpreters.py @@ -1,3 +1,4 @@ +import distutils.spawn import os import subprocess import sys @@ -19,20 +20,26 @@ def interpreters(): @pytest.mark.skipif("sys.platform != 'win32'") def test_locate_via_py(monkeypatch): - class PseudoPy: - def sysexec(self, *args): - assert args[0] == '-3.2' - assert args[1] == '-c' - # Return value needs to actually exist! - return sys.executable - - @staticmethod - def ret_pseudopy(name): - assert name == 'py' - return PseudoPy() - # Monkeypatch py.path.local.sysfind to return PseudoPy - monkeypatch.setattr(py.path.local, 'sysfind', ret_pseudopy) from tox.interpreters import locate_via_py + + def fake_find_exe(exe): + assert exe == 'py' + return 'py' + + def fake_popen(cmd, stdout): + assert cmd[:3] == ('py', '-3.2', '-c') + + class proc: + returncode = 0 + + @staticmethod + def communicate(): + return sys.executable.encode(), None + return proc + + # Monkeypatch modules to return our faked value + monkeypatch.setattr(distutils.spawn, 'find_executable', fake_find_exe) + monkeypatch.setattr(subprocess, 'Popen', fake_popen) assert locate_via_py('3', '2') == sys.executable diff --git a/tox/interpreters.py b/tox/interpreters.py index c2f5943c8..f3fd63f19 100644 --- a/tox/interpreters.py +++ b/tox/interpreters.py @@ -1,5 +1,7 @@ +import distutils.util import inspect import re +import subprocess import sys import py @@ -164,16 +166,14 @@ def tox_get_python_executable(envconfig): def locate_via_py(v_maj, v_min): ver = "-%s.%s" % (v_maj, v_min) script = "import sys; print(sys.executable)" - py_exe = py.path.local.sysfind('py') + py_exe = distutils.spawn.find_executable('py') if py_exe: - try: - exe = py_exe.sysexec(ver, '-c', script).strip() - except py.process.cmdexec.Error: - exe = None - if exe: - exe = py.path.local(exe) - if exe.check(): - return exe + proc = subprocess.Popen( + (py_exe, ver, '-c', script), stdout=subprocess.PIPE, + ) + out, _ = proc.communicate() + if not proc.returncode: + return out.decode('UTF-8').strip() def pyinfo(): diff --git a/tox/session.py b/tox/session.py index 3e352549b..be8af838e 100644 --- a/tox/session.py +++ b/tox/session.py @@ -12,7 +12,6 @@ import subprocess import sys import time -from subprocess import STDOUT import py @@ -138,7 +137,7 @@ def popen(self, args, cwd=None, env=None, redirect=True, returnout=False, ignore cwd = py.path.local() try: popen = self._popen(args, cwd, env=env, - stdout=stdout, stderr=STDOUT) + stdout=stdout, stderr=subprocess.STDOUT) except OSError as e: self.report.error("invocation failed (errno %d), args: %s, cwd: %s" % (e.errno, args, cwd)) @@ -673,12 +672,12 @@ def report_env(e): def info_versions(self): versions = ['tox-%s' % tox.__version__] - try: - version = py.process.cmdexec("virtualenv --version") - except py.process.cmdexec.Error: - versions.append("virtualenv-1.9.1 (vendored)") - else: - versions.append("virtualenv-%s" % version.strip()) + proc = subprocess.Popen( + (sys.executable, '-m', 'virtualenv', '--version'), + stdout=subprocess.PIPE, + ) + out, _ = proc.communicate() + versions.append('virtualenv-{0}'.format(out.decode('UTF-8').strip())) self.report.keyvalue("tool-versions:", " ".join(versions)) def _resolve_pkg(self, pkgspec):