私は Py2Exe ではなく Pyinstaller を使い始めました。しかし、すぐに問題に遭遇しました。不要なモジュールを除外するにはどうすればいいのでしょうか。また、単一の実行可能ファイルに含まれているモジュールを表示するにはどうすればいいのでしょうか。
pyd
Python インストールの DLL フォルダーからいくつかのファイルとディレクトリを削除するdll
と、Pyinstaller はそれらを見つけられず、インストールされなくなります。すべてのモジュールでこれを行うのは、かなり面倒なので、あまりしたくありません。
Pyinstaller が作成する spec ファイルを編集してみました。
a.binaries - [('ssl','pydoc',)],
しかし、ファイルのサイズは同じままだったので、うまくいかなかったと結論付けました。
では、Pyinstaller に含まれているモジュールを確認するにはどうすればよいでしょうか。また、不要なモジュールを除外するにはどうすればよいでしょうか。
ベストアンサー1
ここでは私が使用しているオプションを要約します。
PyInstaller TOC は、ドキュメントに記載されているとおりです。
TOC は、(名前、パス、タイプコード) 形式のタプルのリストのように見えます。実際は、リストではなく順序付けられたセットです。TOC には重複が含まれず、一意性は名前のみに基づきます。
言い換えれば、単純に言えば:
a_toc = [('uname1','/path/info','BINARY'),('uname2','/path/to','EXTENSION')...]
したがって、.spec ファイルでは、スクリプトの分析結果を取得したら、次のいずれかの方法でそれぞれの TOC をさらに変更できます。
のために特定のファイル/モジュールは、差 (-) と積 (+) の演算を使用して TOC を変更します。 *
追加/削除用リストファイル/モジュールは TOC を反復処理し、パターン マッチング コードと比較します。
(* 余談ですが、違いが機能するには、TOC()
明示的にキャストする必要があるようです。また、セットの要素を一意に定義するのは名前だけなので、それを指定するだけでよいことに注意してください。('sqlite3', None, None)
)
以下に、説明的な例 (.spec ファイルから取得) を示します。ここでは、良くも悪くも、scipy、IPython、zmq への参照をすべて削除し、特定の sqlite、tcl/tk、ssl .DLL を削除し、不足している opencv .DLL を挿入し、最後に matplotlib 以外のすべてのデータ フォルダーを削除します...
結果として得られるPyinstaller .exeが、.pycファイルが期待される.DLLをロードしようとしたときに機能するかどうかは議論の余地がある。:-/
# Manually remove entire packages...
exclude = ["scipy", "IPython", "zmq"]
a.binaries = [x for x in a.binaries if not x[0].startswith(tuple(exclude))]
# Target remove specific ones...
a.binaries = a.binaries - TOC([
('sqlite3.dll', None, None),
('tcl85.dll', None, None),
('tk85.dll', None, None),
('_sqlite3', None, None),
('_ssl', None, None),
('_tkinter', None, None)])
# Add a single missing dll...
a.binaries = a.binaries + [
('opencv_ffmpeg245_64.dll', 'C:\\Python27\\opencv_ffmpeg245_64.dll', 'BINARY')]
# Delete everything bar matplotlib data...
a.datas = [x for x in a.datas if
os.path.dirname(x[1]).startswith("C:\\Python27\\Lib\\site-packages\\matplotlib")]