web-dev-qa-db-ja.com

PyInstallerとPandas

私はWindows .exeファイルにコンパイルしようとしているかなり単純なPythonモジュールを持っています。私のスクリプトでは、wxPythonとPandasライブラリを使用しています。生成されるPyInstaller .exeファイルonlyは、Pandasライブラリがモジュールから除外されている場合に機能し、開きます。

PyInstallerで_--onefile_を使用しても_--onedir_を使用しても同じ問題が発生します。オンラインでPyInstaller(2.1)の「新しい」バージョンがこのバグを処理するはずであることがわかりました。誰かが何をすべきかについて何か考えを持っていますか?

_PyInstaller: version 2.1
pandas: version 0.15.2
Python: version 2.7
_
19
bsheehy

同じ問題が発生しました。私はそれを次の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はpycriptoを正しくインポートしていません...

19

Pyinstallerバージョン3.3でも同様の問題がありました。解決策は、説明されているように、hiddenimportフックが欠落していたことでした here

私はPyinstaller/hooks /の下にhook-pandas.pyという名前の新しいファイルを作成し、このコミット here の説明に従ってコンテンツを配置し、python setup。 Pyinstallerディレクトリにpy installします。

--onefileオプションを使用してpyinstallerでpandasスクリプトからexeを作成した場合、問題は再発しませんでした。

11
John

python version = 3.8およびpyinstaller = 3.6の場合、pyinstallerをカスタマイズしたり、pandasフックを追加したりする必要はありません。hook-pandas.pyはすでにLib \に存在します。 site-packages\PyInstaller\hooksとすべてが正常に動作します。

0
vpa

プロジェクトディレクトリのフックファイル(pyinstallerドキュメントごと)、hook-pandas.pyを使用して同じ問題を解決しました

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

次に、スペックファイルに1行追加します。

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

仕様ファイルにhiddenimports=[..., 'pandas', ...]を含めようとしましたが、どういうわけか期待どおりに機能しませんでした。

0
mikey

別のソリューションと同様に、--hidden-import=pandas._libs.tslibs.timedeltaまたはpyinstallerコマンドに欠けているモジュールも機能します。

これは、pyinstallerのソースに触れたくない場合に役立ちます。

0
Alto.Clef