You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab CI/CD虚拟环境已装numpy,运行Cython编译程序仍遇ModuleNotFoundError?

解决Cython嵌入编译后运行时找不到numpy的问题

问题原因

你编译生成的main_output链接的是系统Python库,但numpy安装在你创建的虚拟环境中。运行时,系统Python解释器无法找到虚拟环境里的第三方包,因此抛出ModuleNotFoundError。

解决方案

方案1:编译时链接虚拟环境的Python库(推荐)

修改.gitlab-ci.yml中的编译命令,使用虚拟环境内的Python头文件和库路径,确保可执行文件关联虚拟环境的Python解释器:

  1. 在激活虚拟环境后,添加获取路径的命令:
# 获取虚拟环境的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'))")
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:02:48