web-dev-qa-db-fra.com

PyInstaller et Pandas

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
16
bsheehy

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

18

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.

11
John

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.

0
cong yu

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.

0
Alto.Clef