我有一个相当简单的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
答案 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)
我遇到了完全相同的问题,并且找到了另一种解决方案(实际上是唯一对我有用的解决方案):
除了我在Anaconda上运行虚拟环境外。
开始之前:这些是我针对特殊情况所遵循的步骤,您可能需要根据自己的情况进行调整。
我用Anaconda创建了我的环境:
conda create --name myenv
然后,我安装了所需的所有模块:
conda install -n myenv pandas
conda install -n myenv -c conda-forge python-docx
etc.
在Anaconda提示上:
conda activate myenv
cd path/to/your/project/folder
仍在同一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']
在同一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)
我在 pyinstaller 上挣扎了很多,但在 Nuitka 上得到了完美的结果。福利:
只需安装 nuitka
pip install nuitka
并构建exe
nuitka hello.py
您甚至可以在之后使用 upx 进一步压缩!
upx hello.exe
在我的例子中,文件大小减少到 1/3,只需 ~150kB .exe
文件大小,用于读取和保存 excel 文件的简单 Pandas 脚本。
有关详细信息,请参阅我的 blog post。