使用Python脚本激活virtualenv

时间:2011-08-04 14:27:27

标签: python virtualenv

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

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

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

这样的事情:

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

这可能吗?

相关:

virtualenv › Invoking an env from a script

10 个答案:

答案 0 :(得分:67)

如果你想在virtualenv下运行一个Python子进程,你可以使用位于virtualenv的/ bin /目录中的python解释器来运行脚本:

# 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 :(得分: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保留在激活的环境中。

赢!

答案 2 :(得分:19)

在virtualenv的解释器下运行脚本的最简单的解决方案是将默认的shebang行替换为你的virtualenv的解释器的路径,如下所示:

<a href="/link/with/</symbol/in/it">

使脚本可执行:

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

运行脚本:

chmod u+x script.py

瞧!

答案 3 :(得分:8)

要根据官方Virtualenv documentation运行另一个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

答案 4 :(得分: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或退出,而不是停用venv 这是一个可能的解决方案还是不是你想要的?

答案 5 :(得分:2)

子进程env在它不再存在的那一刻就丢失了,将环境内容从那里移动到父进程有点棘手。

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

或者您只需解析激活脚本,使用for line in line(“bin / activate”)并手动提取内容并放入os.environ。棘手,但并非不可能。

答案 6 :(得分:0)

最佳答案仅适用于python2.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))

参考:What is an alternative to execfile in Python 3?

答案 7 :(得分:0)

对于python2/3,使用下面的代码片段我们可以激活虚拟环境。

activate_this = "/home/<--path-->/<--virtual env name -->/bin/activate_this.py" #for ubuntu
activate_this = "D:\<-- path -->\<--virtual env name -->\Scripts\\activate_this.py" #for windows
with open(activate_this) as f:
    code = compile(f.read(), activate_this, 'exec')
    exec(code, dict(__file__=activate_this))

答案 8 :(得分:0)

我遇到了同样的问题,我的环境的 activate_this.py 目录中没有 Scripts

activate_this.py

"""By using execfile(this_file, dict(__file__=this_file)) you will
activate this virtualenv environment.
This can be used when you must use an existing Python interpreter, not
the virtualenv bin/python
"""

try:
    __file__
except NameError:
    raise AssertionError(
        "You must run this like execfile('path/to/active_this.py', dict(__file__='path/to/activate_this.py'))")
import sys
import os

base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if(sys.platform=='win32'):
     site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
     site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
    if item not in prev_sys_path:
        new_sys_path.append(item)
        sys.path.remove(item)
sys.path[:0] = new_sys_path

将文件复制到您环境的 Scripts 目录中,然后像这样使用它:

def activate_virtual_environment(environment_root):
    """Configures the virtual environment starting at ``environment_root``."""
    activate_script = os.path.join(
        environment_root, 'Scripts', 'activate_this.py')
    execfile(activate_script, {'__file__': activate_script})

activate_virtual_environment('path/to/your/venv')

参考:https://github.com/dcreager/virtualenv/blob/master/virtualenv_support/activate_this.py

答案 9 :(得分:-2)

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

假设您的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

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

export PATH=$PATH:"$HOME/custom"

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

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

假设是abc,然后...

vhelper abc