使用Python脚本激活virtualenv


89

我想从Python脚本激活virtualenv实例。

我知道这很容易做到,但是我看过的所有示例都使用它在env中运行命令,然后关闭子进程。

我只是想激活virtualenv并返回外壳,就像bin / activate一样。

像这样:

$me: my-script.py -d env-name
$(env-name)me:

这可能吗?

相关:

virtualenv›从脚本调用环境

Answers:


86

如果要在virtualenv下运行Python子进程,可以通过使用位于virtualenv的/ bin /目录中的Python解释器运行脚本来实现:

import subprocess

# 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])
弥敦道(Nathan Basanese)2015年

//,还有一种方法可以script_file从任意位置运行,还是必须在virtualenv目录中?
弥敦道(Nathan Basanese)2015年

已修复,感谢您注意到此错误。至于第二个问题,script_file不必在virtualenv目录中,它可以在任何地方。
Lie Ryan

如果使用第二个选项,如何停用虚拟环境?
falsePockets

@falsePockets:XY问题,您为什么要这样做?
Lie Ryan

42

在virtualenv的解释器下运行脚本的最简单解决方案是将默认的shebang行替换为virtualenv的解释器的路径,就像在脚本开头一样:

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

使脚本可执行:

chmod u+x script.py

运行脚本:

./script.py

瞧!


2
+1优雅。在Windows上注意,这需要一个posix兼容的环境,该环境应了解诸如cygwin或msys之类的shebang行
qneill

1
适用于python 3.6.3和Windows 10!
toonarmycaptain

认为我可能误解了最初的问题。他想使用脚本激活虚拟环境,并使用激活的环境返回外壳。我的答案在虚拟环境中运行脚本,但是返回的外壳程序不保留该环境。现代的解决方案是virtualenvwrapper:virtualenvwrapper.readthedocs.io/en/latest/#。它允许一个人激活并在不同的虚拟环境之间切换。
nafooesi

20

事实证明,是的,问题并不简单,但解决方案却很简单。

首先,我必须创建一个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保留在激活的环境中。

赢得!


3
我真的不明白。您为什么不这样做:os.system('/bin/bash --rcfile path/to/env/activate') 您知道,当bash实例启动时,它将.bashrc用作--rcfile的参数。因此,只需指定rcfile是您的激活文件即可。
Depado

@Depado我刚刚尝试了您的解决方案,这将激活python中的shell。至少当我在外壳中尝试时。>>> os.system('/ bin / bash --rcfile / var / envs / test / bin / activate')(测试)tcraig @ tallis-desktop:〜$(测试)tcraig @ tallis-desktop:〜$ ls -l总706288
特伦顿

也许可以,但这可以在脚本中使用。这种技术的唯一不便之处在于,您无法获得所有别名以及〜/ .bashrc中的所有内容。但是我很好。例如,“ ls”命令没有颜色。但是,一切对我有用。当我想离开时,我只是Ctrl + D键
Depado 2013年

7
“当python解释器退出时,它将当前的shell保留在激活的环境中”什么?它产生一个全新的shell作为子进程,并等待其完成。
科斯

为了避免在我的存储库中创建更多新文件并复制当前的bash配置,我这样做了:cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
WhyWhat 16-02-28

17

要根据正式的Virtualenv文档运行另一个Python环境,请在命令行中指定可执行Python二进制文件的完整路径,就这样(无需先激活virtualenv即可):

/path/to/virtualenv/bin/python

如果要使用virtualenv从命令行调用脚本,则同样适用。您无需先激活它:

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

对于Windows环境是相同的(无论是从命令行还是从脚本):

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

2
问题是:使用python脚本激活Virtualenv(壳牌公司不提供)
Zaheer

3
是的,我的意思是,您可以从虚拟环境中调用python运行时,而无需事先从控制台或脚本中对其进行激活。我会澄清答案,谢谢!
马里亚诺·鲁伊斯

哦,我的天啊!我没有考虑。这是唯一对我有用的解决方案:)。现在,当我从php执行python脚本时,我使用的是:“ path / to / virtualenv / bin / python mypythonscript.py”
Zaheer,2010年

6

只是一个对我有用的简单解决方案。我不知道您为什么需要Bash脚本,该脚本基本上没有用(我错了吗?)

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

基本上可以满足您的需求:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$

然后,不要取消激活虚拟环境,只需按Ctrl+D或退出即可。这是可能的解决方案,还是您想要的不是?


2

子进程环境在不复存在的瞬间就丢失了,将环境内容从那里移到父进程有些棘手。

您可能需要生成一个shell脚本(您可以动态生成一个/ tmp脚本),该脚本会将virtualenv环境变量输出到一个文件,然后在父Python进程中读取该文件并将其放入os.environ。

或者,您只需要在open(“ bin / activate”)中的那一行中解析出用于使用的激活脚本,手动提取内容,然后放入os.environ。这很棘手,但并非不可能。


2
H3。

2

最佳答案仅适用于Python 2.x

对于Python 3.x,请使用以下命令:

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

参考:Python 3中execfile的替代方法是什么?


1
什么是activate_this.py
兰迪·彭1919年

1
@randyPen,在项目目录中构建virtualenv时会自动添加activate_this.py文件。(即/project/directory/venv/bin/activate_this.py)–
从理论上说,

-2

您应该virtualenv在一个文件夹中创建所有,例如virt

假设您的virtualenv文件夹名称为virt,如果没有更改的话

cd
mkdir custom

复制以下行...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

创建一个shell脚本文件并粘贴以上行...

touch custom/vhelper
nano custom/vhelper

向您的文件授予可执行权限:

sudo chmod +x custom/vhelper

现在导出该自定义文件夹路径,以便您可以在命令行上通过单击制表符找到它。

导出PATH = $ PATH:“ $ HOME / custom”

现在,您只需键入以下命令即可在任何地方使用它...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

假设是abc,然后...

vhelper abc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.