子进程popen与virtualenv的交互

时间:2017-12-13 10:18:37

标签: python virtualenv

我正在使用virtualenv运行一个脚本,该脚本使用子进程popen来运行另一个需要系统范围的python和原始环境变量的程序。我如何阻止virtualenv影响它?

3 个答案:

答案 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'
>>>