我想从Python脚本激活virtualenv实例。
我知道这很容易做到,但是我看过的所有示例都使用它在env中运行命令,然后关闭子进程。
我只是想激活virtualenv并返回外壳,就像bin / activate一样。
像这样:
$me: my-script.py -d env-name
$(env-name)me:
这可能吗?
相关:
我想从Python脚本激活virtualenv实例。
我知道这很容易做到,但是我看过的所有示例都使用它在env中运行命令,然后关闭子进程。
我只是想激活virtualenv并返回外壳,就像bin / activate一样。
像这样:
$me: my-script.py -d env-name
$(env-name)me:
这可能吗?
相关:
Answers:
如果要在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))
script_file
从任意位置运行,还是必须在virtualenv
目录中?
script_file
不必在virtualenv目录中,它可以在任何地方。
在virtualenv的解释器下运行脚本的最简单解决方案是将默认的shebang行替换为virtualenv的解释器的路径,就像在脚本开头一样:
#!/path/to/project/venv/bin/python
使脚本可执行:
chmod u+x script.py
运行脚本:
./script.py
瞧!
事实证明,是的,问题并不简单,但解决方案却很简单。
首先,我必须创建一个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保留在激活的环境中。
赢得!
os.system('/bin/bash --rcfile path/to/env/activate')
您知道,当bash实例启动时,它将.bashrc用作--rcfile的参数。因此,只需指定rcfile是您的激活文件即可。
cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
要根据正式的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
子进程环境在不复存在的瞬间就丢失了,将环境内容从那里移到父进程有些棘手。
您可能需要生成一个shell脚本(您可以动态生成一个/ tmp脚本),该脚本会将virtualenv环境变量输出到一个文件,然后在父Python进程中读取该文件并将其放入os.environ。
或者,您只需要在open(“ bin / activate”)中的那一行中解析出用于使用的激活脚本,手动提取内容,然后放入os.environ。这很棘手,但并非不可能。
最佳答案仅适用于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))
您应该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
subprocess.Popen([venv_python_file, script_file])
?