J'ai un module assez simple de Python que j'essaye de compiler dans un fichier Windows .exe. Dans mon script, j'utilise les bibliothèques wxPython et Pandas. Le fichier .exe PyInstaller généré only works/s'ouvre lorsque la bibliothèque Pandas est exclue de mon module.
Je reçois le même problème si j'utilise --onefile
ou --onedir
dans PyInstaller. J'ai trouvé en ligne que la "nouvelle" version de PyInstaller (2.1) aurait dû s'occuper de ce bogue. Est-ce que quelqu'un a des idées sur ce qu'il faut faire?
PyInstaller: version 2.1
pandas: version 0.15.2
Python: version 2.7
J'ai rencontré le même problème. Je l'ai résumé à un script simple comme celui-ci Hello.py:
import pandas
print "hello world, pandas was imported successfully!"
Pour que les pandas soient importés correctement au moment de l'exécution, j'ai dû modifier Hello.spec comme suit:
# -*- 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')
J'ai ensuite couru:
$pyinstaller Hello.spec --onefile
de l'invite de commande et obtenu le message «Bonjour tout le monde» que je m'attendais. Je ne comprends toujours pas pourquoi c'est nécessaire. J'ai une version personnalisée de pandas - qui est connectée aux bibliothèques MKL - mais je ne vois pas avec certitude que cela est à l'origine de l'échec de l'exécution.
Ceci est similaire à la réponse ici: Pyinstaller ne importe pas correctement pycripto ... parfois
J'ai eu un problème similaire avec pyinstaller version 3.3. La solution consistait en la présence d’un crochet d’import-caché manquant, tel que décrit ici
J'ai créé un nouveau fichier sous Pyinstaller/hooks/appelé hook-pandas.py et ai placé le contenu comme décrit dans ce commit ici / et ai réinstallé pyinstaller manuellement via python setup.py install dans le répertoire Pyinstaller.
Le problème ne s'est pas reproduit lorsque j'ai créé exe à partir de mon script pandas avec pyinstaller à l'aide de l'option --onefile.
J'ai résolu le même problème en utilisant un fichier hook dans le répertoire du projet (par pyinstaller document), hook-pandas.py
hiddenimports = [
'pandas._libs.tslibs.timedeltas',
'pandas._libs.tslibs.nattype',
'pandas._libs.tslibs.np_datetime',
'pandas._libs.skiplist',
]
puis en ajoutant une ligne dans le fichier de spécification:
...
a = Analysis([...
hookspath=['.'],
...],
...
J'ai essayé d'inclure hiddenimports=[..., 'pandas', ...]
dans le fichier de spécifications, ce qui n'a pas fonctionné comme prévu.
En tant que solution supplémentaire, l'ajout de --hidden-import=pandas._libs.tslibs.timedelta
ou de ce que le module manque à la commande pyinstaller
fonctionne également.
Cela peut être utile si vous ne voulez pas toucher à la source de pyinstaller.