GitLab CI/CD虚拟环境已装numpy,运行Cython编译程序仍遇ModuleNotFoundError?
解决Cython嵌入编译后运行时找不到numpy的问题
问题原因
你编译生成的main_output链接的是系统Python库,但numpy安装在你创建的虚拟环境中。运行时,系统Python解释器无法找到虚拟环境里的第三方包,因此抛出ModuleNotFoundError。
解决方案
方案1:编译时链接虚拟环境的Python库(推荐)
修改.gitlab-ci.yml中的编译命令,使用虚拟环境内的Python头文件和库路径,确保可执行文件关联虚拟环境的Python解释器:
- 在激活虚拟环境后,添加获取路径的命令:
# 获取虚拟环境的Python头文件路径 INCLUDE_PATH=$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))") # 获取虚拟环境的Python库路径 LIB_PATH=$(python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))")
- 修改gcc编译命令,替换为虚拟环境的路径,并添加
-rpath确保运行时能找到库:
gcc -v main.c -I $INCLUDE_PATH -L $LIB_PATH -Wl,-rpath=$LIB_PATH -lpython3.9 -o main_output
修改后的build-job脚本片段:
build-job: stage: build script: - echo "Compiling the code..." - python3 -m pip install --upgrade pip - python3 -m venv venv - source venv/bin/activate # 修正路径:当前目录创建的venv,无需前缀/path - python3 -m pip install --upgrade pip - pip install pyimagej - pip show numpy - python3 check_py.py # 获取虚拟环境的Python路径 - INCLUDE_PATH=$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))") - LIB_PATH=$(python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))") # 用虚拟环境路径编译 - gcc -v main.c -I $INCLUDE_PATH -L $LIB_PATH -Wl,-rpath=$LIB_PATH -lpython3.9 -o main_output - ./main_output - echo "Compile complete."
方案2:运行时指定PYTHONPATH
如果不想修改编译命令,可在运行main_output前,将虚拟环境的site-packages目录加入Python路径:
# 获取虚拟环境的site-packages路径 PY_SITE_PACKAGES=$(python3 -c "import site; print(site.getsitepackages()[0])") export PYTHONPATH=$PY_SITE_PACKAGES ./main_output
方案3:直接使用系统Python安装依赖
如果不需要虚拟环境,可跳过创建venv的步骤,直接在系统Python中安装依赖,然后编译链接系统Python:
build-job: stage: build script: - echo "Compiling the code..." - python3 -m pip install --upgrade pip - pip install pyimagej - pip show numpy - python3 check_py.py - gcc -v main.c -I /usr/include/python3.9/ -L /usr/lib/python3.9 -lpython3.9 -o main_output - ./main_output - echo "Compile complete."
额外注意
- 原脚本中
source /path/venv/bin/activate路径错误,你在当前目录创建的venv,应使用source venv/bin/activate - 确保
main.c是通过cython main.pyx --embed生成的,该命令会生成包含Python解释器嵌入逻辑的C文件
内容的提问来源于stack exchange,提问作者Jane
相关产品推荐
相关产品推荐

