2011-08-04 60 views

回答

2

子进程ENV是在它便会消失和环境的内容从那里转移到父母的那一刻失去了是有点棘手。

你可能需要做的是产生一个shell脚本(你可以为/ tmp动态生成一个脚本),它将输出virtualenv环境变量到一个文件中,然后你可以在父进程中读取并放入os。 ENVIRON。

或者你只是解析激活脚本中使用打开(“斌/激活”)行和手动提取的东西,并把os.environ。整蛊,但并非不可能。

+2

你的意思是这样的吗? https://bitbucket.org/ianb/virtualenv/src/1f9dfb2437f1/virtualenv_support/activate_this.py –

14

原来,问题并不简单,但解决方案是。

首先,我必须创建一个shell脚本来包装“source”命令。这就是说我使用了“。”相反,因为我已经读过使用它比使用bash脚本的源更好。

#!/bin/bash 
. /path/to/env/bin/activate 

然后从我的Python脚本,我可以简单地这样做:

import os 
os.system('/bin/bash --rcfile /path/to/myscript.sh') 

整个诀窍在于在--rcfile参数中。

当Python解释器退出时,它会在激活的环境中保留当前shell。

赢!

+1

这是一个优秀和优雅的解决方案。 – Glycerine

+2

我真的不明白。 为什么你不这样做: 'os.system('/ bin/bash --rcfile path/to/env/activate')' 你知道,当一个bash实例启动时,它需要.bashrc作为--rc文件的参数。所以只需指定rcfile是您的激活文件...不是? – Depado

+0

@Depado我只是试过你的解决方案,这将激活python内的shell。至少当我在壳中尝试它时。 >>>使用os.system( '/斌/庆典--rcfile的/ var/ENVS /测试/斌/激活') (测试)tcraig @ TALLIS桌面:〜$ (测试)tcraig @ TALLIS桌面:〜$ ls -l 总计706288 – Trenton

52

如果你想运行的virtualenv下一个Python子,你可以做,通过使用Python解释器的virtualenv的/ bin /目录生活运行脚本:如果你想激活

# path to a python interpreter that runs any python script 
# under the virtualenv /path/to/virtualenv/ 
python_bin = "/path/to/virtualenv/bin/python" 

# path to the script that must run under the virtualenv 
script_file = "must/run/under/virtualenv/script.py" 

subprocess.Popen([python_bin, script_file]) 

然而当前Python解释器,而不是一个子进程下的virtualenv,您可以使用脚本activate_this.py

# doing execfile() on this file will alter the current interpreter's 
# environment so you can import libraries in the virtualenv 
activate_this_file = "/path/to/virtualenv/bin/activate_this.py" 

execfile(activate_this_file, dict(__file__=activate_this_file)) 
+1

//,这个答案的第一个代码块中的最后一行不应该如下所示:'subprocess.Popen([venv_python_file,script_file])'? –

+0

//,另外,有没有办法从任意位置运行'script_file',还是必须在'virtualenv'目录下? –

+0

修正了,感谢您注意到错误。至于你的第二个问题,没有'script_file'不必在virtualenv目录中,它可以在任何地方。 –

4

只是一个简单的解决方案,为我的作品。我不知道你为什么需要bash脚本,它基本上做了一个无用的步骤(我错了吗?)

import os 
os.system('/bin/bash --rcfile flask/bin/activate') 

这基本上你所需要的:

[[email protected] Foundation]$ python2.7 pythonvenv.py 
(flask)[[email protected] Foundation]$ 

然后代替停用VENV,只需按Ctrl + d或退出。
这是一种可能的解决方案,还是不是你想要的?

1

要根据官方Virtualenv documentation运行另一个Python环境,在命令行中,你可以指定完整路径的可执行蟒蛇二进制文件,只是(无前需要激活的virtualenv):

/path/to/virtualenv/bin/python myscript.py 

这同样适用,如果你想从你的virtualenv从命令行调用脚本,你不需要之前将其激活:

me$ /path/to/virtualenv/bin/python myscript.py 

同为Windows环境(无论是通过命令行或脚本:

> \path\to\env\Scripts\python.exe myscript.py 
+0

问题是:使用python脚本激活virtualenv(不是来自Shell) – zHs

+1

是的,我的意思是,您可以从虚拟环境调用python运行时,而无需在之前,从控制台或脚本激活它。我会澄清答案,谢谢! – Mrdev

+0

噢,我的天啊!我没有想过。这是唯一对我有用的解决方案:)。现在,当我从php执行python脚本时,我正在使用:“path/to/virtualenv/bin/python mypythonscript.py” – zHs

12

最简单的解决方案下的virtualenv的解释器中运行你的脚本与路径默认家当线替换成您的virtualenv的解释,像这样在脚本的开头:

#!/path/to/project/venv/bin/python 

使脚本可执行:

chmod u+x script.py 

运行脚本:

./script.py 

瞧!

+1

完美且直接的解决方案! – user2436428

+1

+1为优雅。关于windows的注意事项这需要一个posix兼容的环境,可以理解像cygwin或msys这样的shebang行。 – qneill

+0

适用于python 3.6.3和windows 10! – toonarmycaptain