在 python CGI 脚本中激活 venv 虚拟环境时出现 ModuleNotFoundError

问题描述 投票:0回答:1

我刚刚开始使用 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’

虚拟环境的路径肯定是正确的,我忽略了什么?

python pytorch cgi huggingface-transformers huggingface
1个回答
0
投票

您缺少的是 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 代码是否依赖于该环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.