pyinstaller错误:找不到scipy(没有模块_named _ufuncs_cxx)

2 投票
2 回答
5669 浏览
提问于 2025-04-18 11:27

我正在使用pyinstaller把Python脚本转换成二进制文件,在Ubuntu(14.04)上进行操作。我用Canopy(Enthought)来管理所有的Python库。

我的代码使用了networkx、numpy和scipy。以下是我的配置文件:

# -*- mode: python -*-
a = Analysis(['main_test.py'],
             pathex=['/home/sean/Desktop/prog',],
             hiddenimports=[],
             hookspath=None,
             runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='main_test',
          debug=False,
          strip=None,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name='main_test')

一开始我遇到了一个错误:

ImportError: libmkl_gf.so: cannot open shared object file: 
    No such file or directory

然后我在这里找到了.so库:

/home/sean/Canopy/appdata/canopy-1.3.0.1715.rh5-x86/lib

我手动把几个.so文件复制到了dist目录里。

但是,我又遇到了另一个错误:

  File "/home/sean/Enthought/Canopy_32bit/User/lib/python2.7/site-
        packages/PyInstaller/loader/pyi_importers.py", line 409, in load_module
        module = imp.load_module(fullname, fp, filename, self._c_ext_tuple)
  File "_ufuncs.pyx", line 1, in init scipy.special._ufuncs
        (scipy/special/_ufuncs.c:21824)
ImportError: No module named _ufuncs_cxx

我该如何解决这个错误?我应该如何修改配置文件来添加这些库和模块呢?

编辑:

我找到了解决办法。现在我的问题是:我该如何修改配置文件来添加.so库?现在我还得手动把很多.so文件复制到dist目录……

编辑2:

结果我发现我需要把它添加到COLLECT里:

a.binaries + ["libmkl_gf.so" , 
  "/home/sean/Canopy/appdata/canopy-1.3.0.1715.rh5-x86/lib/libmkl_gf.so", 
  "binaries"]

有没有简单的方法可以找到隐藏的导入或库?

谢谢!

2 个回答

1

你想试着把库的路径加到LD_LIBRARY_PATH里面吗?可以这样做:

export LD_LIBRARY_PATH=/home/sean/Canopy/appdata/canopy-1.3.0.1715.rh5-x86/lib

或者

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/sean/Canopy/appdata/canopy-1.3.0.1715.rh5-x86/lib(如果管理员已经设置过的话)

这样在运行的时候,那个文件夹里的所有.so文件就不会出现链接错误了……

哦,我明白你的意思了,

import sys

sys.path.append('你的库路径')

这样应该可以工作。

7

我刚刚解决了这个问题。我需要用 --hidden-import 这个选项来指定缺失的模块。缺失的模块有很多,但我发现大部分都是来自 scipy.integrate 这个库。所以我这样指定了:

pyinstaller --hidden-import=scipy.integrate --hidden-import=scipy.integrate.quadpack --hidden-import=scipy.integrate._vode bla bla bla bla -F --windowed myscript.py

虽然过程很痛苦,但最终成功了。

撰写回答