pyinstaller错误:找不到scipy(没有名为_ufuncs_cxx的模块)

时间:2014-06-29 02:36:00

标签: python scipy enthought pyinstaller canopy

我正在使用pyinstaller将python脚本转换为Ubuntu中的二进制文件(14.04)。我使用Canopy(Enthought)来管理所有python库。

代码使用networkx,numpy和scipy。这是我的spec文件:

# -*- 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 direcotry中。

然而,我又收到了一个错误:

  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

如何修复此错误?我应该如何修改spec文件来添加这些库和模块?

修改

我找到了解决方案。我现在的问题是:如何修改spec文件以添加.so图书馆?现在我必须将一些.so文件手动复制到dist目录...

EDIT2

事实证明我必须将其添加到COLLECT

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

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

由于

2 个答案:

答案 0 :(得分:4)

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

痛苦但有效

答案 1 :(得分: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(如果已由admin设置) 所以在运行时该文件夹中的所有.so都不会给你链接错误...

哦,我明白你的意思,

导入sys

sys.path.append(' your_lib_path&#39)

这应该有用。

相关问题