我正在使用virtualenv运行一个脚本,该脚本使用子进程popen来运行另一个需要系统范围的python和原始环境变量的程序。我如何阻止virtualenv影响它?
答案 0 :(得分:1)
您可以使用PATH
传递修改后的env=
子进程。
from subprocess import Popen
from os import environ
from os.path import join as path_join
myenv = environ.copy()
if 'VIRTUAL_ENV' in environ:
myenv['PATH'] = ':'.join(
[x for x in environ['PATH'].split(':')
if x != path_join(environ['VIRTUAL_ENV'], 'bin')])
Popen(['command', '--with', 'arguments'], env=myenv)
答案 1 :(得分:0)
我认为subprocess不关心你venv
subprocess.run('/path/to/system/python program.py', stdout=PIPE, stderr=PIPE)
答案 2 :(得分:0)
virtualenv
创建python可执行文件的副本,您可以将其激活到当前的shell:
这将改变您的$ PATH,因此它的第一个条目是virtualenv bin /目录。 (你必须使用source,因为它会改变你的shell 环境就地。)这就是它的全部;这纯粹是一种便利。 如果你直接运行脚本或python解释器 virtualenv的bin /目录(例如path / to / ENV / bin / pip或 /path/to/ENV/bin/python-script.py)无需激活。
所以当我在我的项目的virtualenv中激活python时,它将是一个将被使用的:
gonczor@wiktor-papu:~/Projects/papukurier/papukurier$ source ../venv/bin/activate
(venv) gonczor@wiktor-papu:~/Projects/papukurier/papukurier$ which python
/home/gonczor/Projects/papukurier/venv/bin/python
(venv) gonczor@wiktor-papu:~/Projects/papukurier/papukurier$ python
Python 2.7.14 (default, Sep 23 2017, 22:06:14)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'/home/gonczor/Projects/papukurier/venv/bin/python'
>>>
但与此同时,您可以提供完整的路径来执行您计算机上的任何其他python实例:
(venv) gonczor@wiktor-papu:~/Projects/papukurier/papukurier$ /usr/bin/python
Python 2.7.14 (default, Sep 23 2017, 22:06:14)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'/usr/bin/python'
>>>