我正在使用virtualenv运行一个脚本,该脚本使用子进程popen运行另一个程序,该程序需要系统范围的python和原始环境变量。如何防止virtualenv影响它?
发布于 2017-12-13 20:28:45
您可以使用env=为子流程传入修改后的PATH。
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)发布于 2017-12-13 18:38:48
virtualenv会创建python可执行文件的副本,您可以将其激活到当前的shell中:
这将更改您的$PATH,以便它的第一个条目是virtualenv的bin/目录。(您必须使用source,因为它会就地更改您的shell环境。)这就是它所做的一切;它纯粹是一种便利。如果您直接从virtualenv的bin/目录(例如path/to/ENV/bin/pip或/path/to/ENV/bin/ python -script.py)运行脚本或python解释器,则无需激活。
因此,当我为我的项目在一个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'
>>> 发布于 2017-12-13 18:26:26
我相信subprocess不会关心你。
subprocess.run('/path/to/system/python program.py', stdout=PIPE, stderr=PIPE)https://stackoverflow.com/questions/47790526
复制相似问题