【问题标题】:pyinstaller error: cannot find scipy (No module named _ufuncs_cxx)pyinstaller 错误:找不到 scipy(没有名为 _ufuncs_cxx 的模块)
【发布时间】:2023-11-26 15:57:01
【问题描述】:

我在 Ubuntu (14.04) 中使用 pyinstaller 将 python 脚本转换为二进制文件。我使用 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"]

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

谢谢

【问题讨论】:

    标签: python scipy enthought pyinstaller canopy


    【解决方案1】:

    我刚刚解决了这个问题。我必须使用 --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
    

    痛苦,但有效

    【讨论】:

      【解决方案2】:

      您想尝试将库路径添加到 LD_LIBRARY_PATH 中吗? 比如,

      导出 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 都不会出现链接错误...

      哦,我明白你的意思了,

      导入系统

      sys.path.append('your_lib_path')

      这应该可行。

      【讨论】: