pyinstaller + usaddress包:' ImportError:无法导入名称_dumpparser'

时间:2017-09-22 22:30:49

标签: python python-3.x pyinstaller

我试图在Windows上使用python包usaddress和pyinstaller。在我构建可执行文件后,我收到了这个我不明白的错误:

Traceback (most recent call last):
  File "test_usaddress\main.py", line 1, in <module>
  File "c:\users\chq-luisd\appdata\local\continuum\anaconda3\lib\site-packages\P
yInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\usaddress\__init__.py", line 16, in <module>
  File "c:\users\chq-luisd\appdata\local\continuum\anaconda3\lib\site-packages\P
yInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\pycrfsuite\__init__.py", line 2, in <module>
  File "c:\users\chq-luisd\appdata\local\continuum\anaconda3\lib\site-packages\P
yInstaller\loader\pyimod03_importers.py", line 714, in load_module
    module = loader.load_module(fullname)
  File "pycrfsuite\_pycrfsuite.pyx", line 14, in init pycrfsuite._pycrfsuite
ImportError: cannot import name _dumpparser
[14752] Failed to execute script main

我得到的错误是一个只执行导入并调用usaddress的包。我的main.py文件中唯一的东西是:

import usaddress

if __name__ == '__main__':
    addr = '123 Main St. Suite 100 Chicago, IL'
    print(usaddress.parse(addr))

我使用

构建可执行文件
pyinstaller main.py

我在Windows上使用pyinstaller 3.3运行64位python 3.6.1。 usaddress在没有pyinstaller的情况下工作正常。

2 个答案:

答案 0 :(得分:1)

将'pycrfsuite._dumpparser'添加到spec文件中的hiddenimports列表中,以消除该错误。重新编译并重新运行可执行文件后,您将看到有关_logparser的类似错误;还需要将'pycrfsuite._logparser'添加到隐藏的导入中。该.exe现在将运行,但是您会收到关于usaddr.crfsuite的警告。添加元组

('C:\\ProgramData\\Anaconda3\\lib\\site-packages\\usaddress\\usaddr.crfsuite','usaddress')

(将路径替换为系统上usaddr.crfsuite的位置)到规范文件中的数据列表(根据https://pyinstaller.readthedocs.io/en/stable/spec-files.html#using-data-files-from-a-module),

答案 1 :(得分:0)

我遇到了同样的问题,并且能够解决。 __init__.py程序包中的usaddress代码中存在错误。您需要进入usaddress下的dist软件包,进入__init__.py。从

更改MODEL_PATH
MODEL_PATH = os.path.split(os.path.abspath(__file___))[0] + '/' + MODEL_FILE

MODEL_PATH = os.path.split(os.path.abspath(__file___))[0] + '\\' + MODEL_FILE