用Python脚本激活虚拟环境

132 投票
12 回答
183193 浏览
提问于 2025-04-16 22:53

我想在一个Python脚本中激活一个虚拟环境。

我知道这其实很简单,但我看到的所有例子都是用它来在环境中运行命令,然后再关闭子进程。

我只是想激活这个虚拟环境,然后返回到命令行,就像使用bin/activate那样。

类似这样的:

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

这样做可以吗?

相关链接:

virtualenv › 从脚本中调用环境

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中工作。

撰写回答