我刚刚开始使用 Huggingface Transformers 库,并一直通过 Pytorch 和 venv 进行实验。
如果我从 shell 激活 venv 虚拟环境,它就可以正常工作。 但是,如果我在 Python CGI 脚本中激活它,则不会,如下所示:
# Importing libraries for virtual environment
import subprocess
# Defining function for activating/deactivating virtual environment
def activate_virtual_environment():
# Build the path to the activation script
activation_script = f"/xampp/htdocs/cgi_bin/env/Scripts/activate"
# Activate the virtual environment using subprocess
subprocess.run([activation_script], shell=True)
def deactivate_virtual_environment():
# Deactivate the virtual environment using subprocess
subprocess.run(["deactivate"], shell=True)
# Activating virtual environment
activate_virtual_environment()
# Importing 'pipeline'
from transformers import pipeline
如果我像这样激活虚拟环境,当执行脚本时,我会得到一个
ModuleNotFoundError: No module named ‘transformers’
。
虚拟环境的路径肯定是正确的,我忽略了什么?
您缺少的是 virtualenv 激活脚本的流程模型。
virtualenv 中的“激活”脚本通过修改正在执行其命令的 shell 进程中的环境变量来工作,特别是 PATH 和 VIRTUAL_ENV。
python 子进程模块将请求的程序作为单独的子进程运行,因此环境变量修改仅影响实际处理“activate”脚本中命令的进程。
因此,您无法使用 python subprocess 模块来实现您想要做的事情。
最简单的完整解决方案是编写一个小包装脚本来激活 virtualenv,然后使用 python 程序运行 python 解释器,这不再需要担心执行激活或子进程的事情。
Linux 上的一个更简单的解决方案是修改 python 脚本的 shebang 以指向 virtualenv 内的 python 二进制文件,但我从代码中的“/Scripts/”部分猜测您在 Windows 上,所以我不确定这如何转化为 Windows。
第一个选项是完整的,因为它还设置了 VIRTUAL_ENV 环境变量,而第二个选项则没有。这对你来说是否重要取决于你的 python 代码或你正在导入的其他 python 代码是否依赖于该环境变量。