web-dev-qa-db-ja.com

pyinstaller exeのサイズを縮小する

40MBを超える単純なpandas pyinstaller exeがあります。

私のexeの例:

import collections
import csv
import Selenium
import pandas

print('hi')

このための40MB +は少し過剰に思えます。

これを可能な限り減らすにはどうすればよいですか?

1つの方法:

pyinstaller --onefile --exclude matplotlib --exclude scipy --exclude pandas --exclude numpy.py

ただし、これは除外リストの大きさを考慮すると実用的ではありません。

Pyinstallerのフォルダーを選択してモジュールを取得し、他のすべてを除外して、小さなアプリケーションを作成するにはどうすればよいですか?

仕様ファイル:

a = Analysis(['123.py'],
             pathex=['C:\\Users\\AA\\ZZ'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='123',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )

言及する価値もあります。デフォルトでは、Pyinstallerはパンダを検出しません。

追加:

hiddenimports = ['pandas._libs.tslibs.timedeltas']

To: C:\Users\<NAME>\AppData\Local\Programs\Python\Python36\Lib\site-packages\PyInstaller\hooks

複数の実行可能ファイルを使用する場合、可能な ソリューション は、各実行可能ファイルを個別のフォルダまたはすべてのインポートを含む実行可能ファイルにリンクすることです。

24
user9062171

virtualenvを使用して環境を設定し、そこに必要なライブラリのみをインストールしてみてください

仮想envの使用に関する詳細はこちら: https://virtualenv.pypa.io/en/stable/

10
Ophir Yoktan

これらの答えは両方とも素晴らしいと思います。

私にとって、pandasを使用する単純なケースは、exeが巨大であることです。

特定のディレクトリを削除することは有用でしたが、UPXINGも大いに役立ちました。

私はそれを大幅に削減しましたが、デフォルトではこれをしていませんでした。

そうは言っても、最終的で最もインポートするソリューションについては、ここで説明します。 選択場所からのPythonモジュールのインポート そのため、これをすべて実行する機能がありましたが、現時点では次のような手動処理が必要です。multipackage-bundlesが壊れています。

さあ、たくさんのexeのシンプルなソリューションへ

多くの実行可能ファイルがある場合、このアプローチを強くお勧めします。

pyinstaller -F abc.py --onedir (Have all imports of both scripts)
pyinstaller -F abd.py --onedir (Have all imports of both scripts)

ここで、abd.exeをabc.pyフォルダーの1つのディレクトリおよびその他の外部スクリプトに配置します。必ず異なる名前を付けるか、実行するスクリプトは1つだけにしてください。

すべての依存関係が1つのフォルダーにあるため、これは非常にうまく機能します。これがその方法です。したがって、この例では、40MBの1つのフォルダーがあると言います。その後の追加のexeごとに、それぞれ40MBではなく+ 5mb(またはexeの大きさ)のみになります。

7
user9062171

私はAnaconda環境を使用しているため、virtualenvソリューションはオプションではありません。私の方法は、スペックファイルから不要なモジュールを除外することでした。

分析中(...)

excludes=['pandas', 'numpy'],

(これは、ファイルのサイズを非常に大きくするモジュールです)

ビルドごとに、この調整済みスペックファイルを使用してexeを作成しています。

pyinstaller "mySpec.spec" --distpath="<path>"
0
droebi

pythonインタープリターとインポートされたすべてのモジュールは、実行可能ファイルに含まれています。

除外するモジュールを、仕様ファイルのexcludesの下にあるAnalysisリストに追加してみてください。

UPXを使用して実行可能ファイルを圧縮することもできます。 PXの使用に関する注意 を参照してください

0
Aaron Garton