用Python脚本激活虚拟环境
我想在一个Python脚本中激活一个虚拟环境。
我知道这其实很简单,但我看到的所有例子都是用它来在环境中运行命令,然后再关闭子进程。
我只是想激活这个虚拟环境,然后返回到命令行,就像使用bin/activate那样。
类似这样的:
$me: my-script.py -d env-name
$(env-name)me:
这样做可以吗?
相关链接:
12 个回答
27
根据官方的Virtualenv 文档,如果你想运行另一个 Python 环境,可以直接在命令行中指定 Python 可执行文件的完整路径,直接这样做就行了(不需要先激活虚拟环境):
/path/to/virtualenv/bin/python
如果你想通过命令行运行一个脚本,也可以直接用你的虚拟环境,不需要提前激活它:
me$ /path/to/virtualenv/bin/python myscript.py
在 Windows 环境下也是一样的,无论是通过命令行还是脚本都可以这样做:
> \path\to\env\Scripts\python.exe myscript.py
80
要在虚拟环境的解释器下运行你的脚本,最简单的方法就是把脚本开头的默认shebang行替换成你虚拟环境解释器的路径,像这样:
#!/path/to/project/venv/bin/python
让脚本可以执行:
chmod u+x script.py
运行脚本:
./script.py
好了!
120
如果你想在虚拟环境(virtualenv)中运行一个Python子进程,可以通过使用虚拟环境中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解释器中激活虚拟环境,而不是在子进程中运行,可以调用exec
,并传入activate_this.py
脚本,像这样:
# Doing exec() 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"
exec(open(activate_this_file).read(), {'__file__': activate_this_file})
需要注意的是,上面的操作需要使用virtualenv库,而不是venv。
如果你使用的是venv,你可以复制virtualenv的activate_this.py的实现,经过一些小改动,它应该也能在venv中工作。