为什么在使用pyinstaller构建.exe时会出现ImportError?

时间:2015-08-02 18:01:06

标签: python ipython scikit-learn pyinstaller py2app

我刚创建了一个可以在IPython中编译和工作的小型GUI程序,但是当我尝试使用pyinstaller将其导出到.exe时,它会给我一个导入错误。我确定它是sklearn,因为当我注释sklearn导入时,我的文件在构建时打开正常。

C:\Users\Chris\Anaconda>C:/Users/Chris/Anaconda/dist/Room_Test.exe
WARNING: file already exists but should not:                            C:\Users\Chris\AppData\Local\Temp\_MEI100402\Include\pyconfig.h
Traceback (most recent call last):
File "<string>", line 9, in <module>
File "C:\Users\Chris\Anaconda\Lib\site-    packages\PyInstaller\loader\pyi_importers.py", line 270, in load_module
exec(bytecode, module.__dict__)
  File "C:\Users\Chris\Anaconda\build\Room_Test\out00-    PYZ.pyz\sklearn.neighbors", line 6, in <module>
  File "C:\Users\Chris\Anaconda\Lib\site-    packages\PyInstaller\loader\pyi_importers.py", line 409, in load_module
    module = imp.load_module(fullname, fp, filename, self._c_ext_tuple)
  File "dist_metrics.pxd", line 48, in init sklearn.neighbors.ball_tree     (sklearn\neighbors\ball_tree.c:35726)
  File "C:\Users\Chris\Anaconda\Lib\site-    packages\PyInstaller\loader\pyi_importers.py", line 409, in load_module
    module = imp.load_module(fullname, fp, filename, self._c_ext_tuple)
  File "dist_metrics.pyx", line 52, in init sklearn.neighbors.dist_metrics     (sklearn\neighbors\dist_metrics.c:25494)
ImportError: No module named typedefs

4 个答案:

答案 0 :(得分:9)

您仍然可以通过在命令中添加以下内容来使用pyinstaller:

--hidden-import sklearn.neighbors.typedefs

或将以下内容添加到.spec文件中:

hiddenimports=['cython', 'sklearn', 'sklearn.neighbors.typedefs']

答案 1 :(得分:6)

最好使用spec文件导入另一个隐藏的库可能会导致问题。我列出了所有Sklearn库并添加到spec文件中作为这样的hiddenimports:

  # -*- mode: python -*-

block_cipher = None


a = Analysis(['MyPythonApplication.py'],
             pathex=['..\\ApplicationFolder'],
             binaries=[],
             datas=[],
             hiddenimports=['cython', 'sklearn', 'sklearn.ensemble', 'sklearn.neighbors.typedefs', 'sklearn.neighbors.quad_tree', 'sklearn.tree._utils'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='ExeFileName',             
          debug=False,
          strip=False,
          upx=False,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='ApplicationName')

答案 2 :(得分:3)

自己解决了!结束使用py2exe。即使在x64系统上尚不支持捆绑到一个.exe,导入模块也更容易。但为我的目的工作。刚刚将以下行添加到“包含”:

sklearn.neighbors.typedefs

答案 3 :(得分:1)

找到这个目录“E:\ Anaconda3 \ Lib \ site-packages \ PyInstaller \ hooks”。 添加文件“hook-pandas.py”,将此内容写入此文件:

"""
Hook for pandas. 
Suport for pyinstaller error : No module named ‘pandas._libs.tslibs.timedeltas
"""
hiddenimports=[
    #all your previous hidden imports
    'pandas', 'pandas._libs.tslibs.timedeltas',
    'sklearn.neighbors.typedefs'
]

然后使用此命令:

pyinstaller -F myfile.py --hidden-import sklearn.neighbors.typedefs

然后就可以了!