【问题标题】:No module named 'pandas._libs.tslibs.timedeltas' in PyInstallerPyInstaller 中没有名为“pandas._libs.tslibs.timedeltas”的模块
【发布时间】:2018-04-29 07:26:55
【问题描述】:

我正在尝试使用 Windows 的 PyInstaller(开发版)将 Python 脚本包装到 exe 中。

脚本使用 Pandas,我在运行 exe 时遇到了错误。

Traceback (most recent call last):   File "site-packages\pandas\__init__.py", line 26, in <module>   File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)   File "site-packages\pandas\_libs\__init__.py", line 4, in <module>   File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 714, in load_module
    module = loader.load_module(fullname)   File "pandas/_libs/tslib.pyx", line 1, in init pandas._libs.tslib ModuleNotFoundError: No module named 'pandas._libs.tslibs.timedeltas'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):   File "G5k Version file Extract (with tkinter).py", line 15, in <module>   File "C:\Users\Eddie\Anaconda3\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    exec(bytecode, module.__dict__)   File "site-packages\pandas\__init__.py", line 35, in <module> ImportError: C extension: No module named 'pandas._libs.tslibs.timedeltas' not built. If you want to import pandas from the source directory, you may need to run 'python setup.py build_ext --inplace --force' to build the C extensions first.

我已经尝试为没有 pandas 的程序执行此操作,一切都很好。

这与已经为 Python 2 解决的 another question 非常相似,但我使用的是 Python 3,由于 .spec 文件格式已更改,该解决方案的应用方式不同。

Python 3.6
PyInstaller - 版本 3.3
熊猫 - 版本 0.20.3

【问题讨论】:

    标签: python windows python-3.x pandas pyinstaller


    【解决方案1】:

    PyInstaller 3.3、Pandas 0.21.0、Python 3.6.1。

    感谢尚未发布/提交的 PyInstaller 修复程序,我能够解决这个问题,请参阅 thisthis。并保留将其打包到一个可执行文件中的能力。

    基本上:

    1. 找到 PyInstaller 文件夹..\hooks,例如C:\Program Files\Python\Lib\site-packages\PyInstaller\hooks.

    2. 创建带有内容的文件 hook-pandas.py(或任何基于您的错误的类似内容):

      hiddenimports = ['pandas._libs.tslibs.timedeltas']
      
    3. 保存 + 我删除了 .spec 文件、build 和 dist 文件夹以确保安全。

    4. 运行pyinstaller -F my_app.py

    只要您不升级或重新安装 PyInstaller,此修复程序就应该有效。所以你不需要编辑 .spec 文件。

    也许他们会尽快为我们提供修复! :)

    【讨论】:

    • 我相信这在 pyinstaller 3.4 中已修复 - 钩子开箱即用。请参阅链接问题。
    【解决方案2】:

    我不确定它是否会对您有所帮助,但请按照您提到的帖子中的解决方案在 Windows 7 上使用 python 3.6 pyinstaller 3.3 和 pandas 0.21.0 为我工作。

    所以在分析后将其添加到规范文件中:

    def get_pandas_path():
        import pandas
        pandas_path = pandas.__path__[0]
        return pandas_path
    
    dict_tree = Tree(get_pandas_path(), prefix='pandas', excludes=["*.pyc"])
    a.datas += dict_tree
    a.binaries = filter(lambda x: 'pandas' not in x[0], a.binaries)
    

    另外我的规范文件格式和the post you mention中的一样。

    【讨论】:

    • 我今天遇到了递归错误,即使使用 hiddenimports 的东西,我想如果一切都失败了,只包括整个 pandas 文件夹可能是一个可行的解决方案,类似于 matplotlib 提供数据文件的方式列表。这看起来更好或等效。我要到星期一才有机会尝试,但在那之前我想说声谢谢。
    • @Simon -- 使用您的建议后,我的程序在 console=True 时对我来说效果很好,但在 console=False 时它不起作用。但是,当我说 True 时,我会在最后看到黑色的命令窗口以及我想要的 exe 窗口,这不是必需的。当我尝试删除黑色窗口时,我想要的窗口也会关闭。你能推荐我吗!
    • 这种情况下的树是什么?
    • 这是一个来自 pyinstaller 的类,可以帮助处理目录内容:pyinstaller.readthedocs.io/en/stable/…
    【解决方案3】:

    我设法通过使用“--hidden-import”标志解决了这个问题。希望这对遇到此线程的其他人有所帮助。

    pyinstaller --onefile --hidden-import pandas._libs.tslibs.timedeltas myScript.py
    

    【讨论】:

    • 非常感谢!此外,您可以根据需要多次使用--hidden-import
    【解决方案4】:

    如果您使用的是 Anaconda,很可能当您尝试卸载某些软件包时,它破坏了 pandas 的依赖关系并且无法获取所需的脚本。如果你只是运行conda install pandas,你可能会遇到另一个错误:

    module 'pandas' has no attribute 'compat'.

    所以,请尝试卸载并重新安装 pandas conda uninstall pandas,然后使用 conda install pandas 重新安装它,这将解决问题。 另一方面,如果您不使用 Anaconda,请尝试在指向 Python 脚本文件夹 pip uninstall pandas &amp; pip install pandas 的命令提示符下执行相同操作。

    大多数时候,这应该可以解决问题。为了涵盖所有可能性,请不要忘记在安装 pandas 后从 Anaconda 启动 Spyder。

    【讨论】:

    • 你可以使用一些基本的格式来区分什么是文本,什么是要运行的等等,比如print("Hello")
    猜你喜欢
    • 2018-05-16
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2018-07-01
    相关资源
    最近更新 更多