Python3.11+Win11下PyInstaller打包后缺失numpy问题求助
问题:PyInstaller打包Cython编译模块后提示找不到numpy
环境信息
- Cython 3.0.8
- PyInstaller 6.11.0
- Python 3.11(Conda环境)
- Windows系统
文件结构
. ├── src │ ├── __init__.py │ └── submodule.pyx ├── README.txt ├── setup.py └── appx.py
代码片段
appx.py
from src import submodule subObj = submodule.runApp()
setup.py
# setup.py from setuptools import find_packages, setup from setuptools.extension import Extension from Cython.Build import cythonize from Cython.Distutils import build_ext setup( name="appx", version='1.37.41', ext_modules = cythonize( [ Extension("src.submodule", ["src/submodule.pyx"]), ], build_dir="build_cythonize", compiler_directives={ 'language_level' : "3", 'always_allow_keywords': True, } ), cmdclass=dict( build_ext=build_ext ), )
src/init.py
# Note! There should be no whatever module variables in CnUtil. from __future__ import print_function # (at top of module) import sys if sys.version_info[0] < 3: # Python 2 and 3: # to execute the file, type in the following command in powershell: # % python CnTestDragonPackage.py build_ext --inplace import future # pip install future import builtins # pip install future import past # pip install future import six # pip install future from submodule import runApp import numpy import cv2 import base64 import wx import os import string import random import math import copy import subprocess import json import threading import datetime import shutil
操作步骤
编译Cython模块:
在项目根目录执行:conda activate myCondaEnv311_Windows python setup.py build_ext --inplace成功在
./src目录生成submodule.cp311-win_amd64.pyd文件。PyInstaller打包:
执行命令:pyinstaller --name "appx" --add-data="README.txt:." --add-binary="src/submodule.cp311-win_amd64.pyd:src" appx.py打包后文件结构:
. ├── src │ ├── __init__.py │ └── submodule.pyx ├── build ├── build_cythonize ├── dist │ └── appx │ ├── _internal │ └── appx.exe ├── README.txt ├── setup.py └── appx.py运行exe报错:
进入./dist/appx目录运行appx.exe,提示:No module named 'numpy'
解决方法
方法1:显式导入依赖
修改appx.py,在开头显式导入numpy,让PyInstaller自动检测到该依赖:
import numpy # 显式导入触发PyInstaller依赖扫描 from src import submodule subObj = submodule.runApp()
方法2:用--hidden-import指定缺失模块
打包时直接告知PyInstaller需要包含的依赖模块:
pyinstaller --name "appx" --add-data="README.txt:." --add-binary="src/submodule.cp311-win_amd64.pyd:src" --hidden-import=numpy --hidden-import=cv2 --hidden-import=wx appx.py
(其他未被检测到的依赖如cv2、wx可一并添加)
方法3:通过.spec文件自定义配置
- 先生成spec文件:
pyinstaller --name "appx" --add-data="README.txt:." --add-binary="src/submodule.cp311-win_amd64.pyd:src" appx.py --specpath . - 打开
appx.spec,在hiddenimports列表中添加缺失模块:hiddenimports=['numpy', 'cv2', 'wx'], - 基于spec文件重新打包:
pyinstaller appx.spec
方法4:优化Cython编译时的依赖处理(可选)
如果submodule.pyx直接使用了numpy,建议在setup.py中添加numpy的include目录,确保编译时正确链接:
# 在setup.py顶部导入numpy import numpy as np # 修改Extension部分 Extension( "src.submodule", ["src/submodule.pyx"], include_dirs=[np.get_include()] # 添加numpy的头文件目录 ),
此步骤配合前面的PyInstaller依赖处理,能更稳妥解决问题。
内容的提问来源于stack exchange,提问作者Farn Wang
相关产品推荐
相关产品推荐

