PyInstaller和Pandas

时间:2015-03-17 20:45:09

标签: python pandas pyinstaller

我有一个相当简单的Python模块,我试图编译成Windows .exe文件。在我的脚本中,我使用的是wxPython和Pandas库。当Pandas库从我的模块中排除时,生成 的PyInstaller .exe文件工作/打开。

我在PyInstaller中使用--onefile--onedir时遇到了同样的问题。我在网上发现了" new" PyInstaller(2.1)的版本应该已经处理好这个bug。有没有人对如何做有任何想法?

PyInstaller: version 2.1
pandas: version 0.15.2
Python: version 2.7

6 个答案:

答案 0 :(得分:19)

我遇到了同样的问题。我把它归结为一个像Hello.py这样的简单脚本:

import pandas
print "hello world, pandas was imported successfully!"

要在运行时正确导入pandas,我必须将Hello.spec修改为以下内容:

# -*- mode: python -*-

block_cipher = None

def get_pandas_path():
    import pandas
    pandas_path = pandas.__path__[0]
    return pandas_path

a = Analysis(['Hello.py'],
         pathex=['C:\\ScriptsThatRequirePandas'],
         binaries=None,
         datas=None,
         hiddenimports=[],
         hookspath=None,
         runtime_hooks=None,
         excludes=None,
         win_no_prefer_redirects=None,
         win_private_assemblies=None,
         cipher=block_cipher)

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)

pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)
exe = EXE(pyz,
      a.scripts,
      exclude_binaries=True,
      name='Hello',
      debug=False,
      strip=None,
      upx=True,
      console=True )
scoll = COLLECT(exe,
           a.binaries,
           a.zipfiles,
           a.datas,
           strip=None,
           upx=True,
           name='Hello')
然后我跑了:

$pyinstaller Hello.spec --onefile
从命令提示符

获得我期望的'hello world'消息。我仍然不完全理解为什么这是必要的。我有一个自定义构建的pandas - 它连接到MKL库 - 但我不清楚这是否导致运行失败。

这与答案类似:Pyinstaller not correclty importing pycripto... sometimes

答案 1 :(得分:0)

就像另一个解决方案一样,向--hidden-import=pandas._libs.tslibs.timedelta命令添加pyinstaller或任何模块缺失的方法也可以。

如果您不想接触pyinstaller的来源,这可能会有所帮助。

答案 2 :(得分:0)

我通过使用项目目录(每个pyinstaller文档)中的hook文件hook-pandas.py解决了相同的问题

hiddenimports = [
    'pandas._libs.tslibs.timedeltas',
    'pandas._libs.tslibs.nattype',
    'pandas._libs.tslibs.np_datetime',
    'pandas._libs.skiplist',
]

然后在规格文件中添加一行:

...
a = Analysis([...
hookspath=['.'],
...],
...

我试图在规格文件中加入hiddenimports=[..., 'pandas', ...],但由于某种原因未能按预期进行。

答案 3 :(得分:0)

使用python version = 3.8和pyinstaller = 3.6,无需自定义pyinstaller或添加熊猫钩子,钩子pandas.py已存在于Lib \ site-packages \ PyInstaller \ hooks中,一切正常。

答案 4 :(得分:0)

我遇到了完全相同的问题,并且找到了另一种解决方案(实际上是唯一对我有用的解决方案):

我几乎遵循了这个原则:https://medium.com/@liron92/pyinstaller-with-pandas-problems-solutions-and-workflow-with-code-examples-c72973e1e23f

除了我在Anaconda上运行虚拟环境外。

快速的分步解决方案

开始之前:这些是我针对特殊情况所遵循的步骤,您可能需要根据自己的情况进行调整。

1)创建并配置您的虚拟环境

我用Anaconda创建了我的环境:

conda create --name myenv

然后,我安装了所需的所有模块:

conda install -n myenv pandas
conda install -n myenv -c conda-forge python-docx
etc.

2)激活您的环境并切换到项目路径

在Anaconda提示上:

conda activate myenv
cd path/to/your/project/folder

3)创建和修改* .spec文件

仍在同一Anaconda Prompt窗口上:

pyi-makespec project.py

然后打开您的project.spec文件,它看起来像这样:

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['project.py'],
             pathex=['path/to/your/project/folder'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='main')

您只需修改hiddenimports = []并添加所有隐式导入(包括熊猫)。 就我而言,我也在使用Tkinter,所以我指定了:

hiddenimports=['pandas', 'tkinter']

4)最后运行pyinstaller

在同一Anaconda Prompt窗口上(在您的项目目录中激活了环境):

pyinstaller main.spec

然后您就完成了!

免责声明

我到处都看到有人告诉您在使用Pyinstaller编译Python项目时应使用--onefile,老实说,您不应该这样做:它会使* .exe速度变慢。也许我错过了一些东西,所以如果您使用它,请向我解释。

规格

Windows 10
Anaconda 4.8.2
Python 3.7.6
Pandas 1.0.5

答案 5 :(得分:0)

对于任何希望在 2021 年将涉及 Pandas 的 Python 脚本转换为 exe 的人

我在 pyinstaller 上挣扎了很多,但在 Nuitka 上得到了完美的结果。福利:

  • 低文件大小 (500kB)
  • 快速构建和执行时间(类似于 Python 执行时间)
  • 最重要的是:pandas 支持开箱即用,无需虚拟环境!

只需安装 nuitka

pip install nuitka

并构建exe

nuitka hello.py

您甚至可以在之后使用 upx 进一步压缩!

upx hello.exe

在我的例子中,文件大小减少到 1/3,只需 ~150kB .exe 文件大小,用于读取和保存 excel 文件的简单 Pandas 脚本。

有关详细信息,请参阅我的 blog post