私は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
_
同じ問題が発生しました。私はそれを次の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を正しくインポートしていません...
python version = 3.8およびpyinstaller = 3.6の場合、pyinstallerをカスタマイズしたり、pandasフックを追加したりする必要はありません。hook-pandas.pyはすでにLib \に存在します。 site-packages\PyInstaller\hooksとすべてが正常に動作します。
プロジェクトディレクトリのフックファイル(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', ...]
を含めようとしましたが、どういうわけか期待どおりに機能しませんでした。
別のソリューションと同様に、--hidden-import=pandas._libs.tslibs.timedelta
またはpyinstaller
コマンドに欠けているモジュールも機能します。
これは、pyinstallerのソースに触れたくない場合に役立ちます。