New submission from Ofek Lev: The following example shows that we are indeed changing PATH, but the subprocess does not acknowledge it in Windows 7 x64. Also note this works in Linux (Ubuntu 16.04).
----- import os import subprocess from contextlib import contextmanager from tempfile import TemporaryDirectory def get_python_path(): return subprocess.check_output( ['python', '-c', 'import sys;print(sys.executable)'] ).decode().strip() @contextmanager def temp_chdir(cwd=None): with TemporaryDirectory() as d: origin = cwd or os.getcwd() os.chdir(d) try: yield d finally: os.chdir(origin) def create_venv(d, pypath=None): command = ['virtualenv', d] if pypath: command.extend(['-p', pypath]) subprocess.call(command) @contextmanager def venv(d): if os.path.exists(os.path.join(d, 'bin')): # no cov venv_exe_dir = os.path.join(d, 'bin') elif os.path.exists(os.path.join(d, 'Scripts')): venv_exe_dir = os.path.join(d, 'Scripts') else: raise OSError('Unable to locate executables directory.') old_path = os.environ['PATH'] os.environ['PATH'] = '{}{}{}'.format(venv_exe_dir, os.pathsep, old_path) yield os.environ['PATH'] = old_path def test_venv(): with temp_chdir() as d: d = os.path.join(d, 'test_env') create_venv(d) global_python = get_python_path() print('PATH', os.environ['PATH'][:140]) with venv(d): print('PATH', os.environ['PATH'][:140]) venv_python = get_python_path() assert global_python != venv_python assert global_python == get_python_path() ---------- components: Windows messages: 296986 nosy: Ofekmeister, paul.moore, steve.dower, tim.golden, zach.ware priority: normal severity: normal status: open title: Spawned subprocesses don't respect environment type: behavior versions: Python 3.6 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue30783> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com