web-dev-qa-db-ja.com

Pandasを指定したPyInstallerは500 MB以上のexeを作成します

PyInstaller 3.2.1を使用してexeファイルを作成しようとしましたが、テスト目的で、次のコードのexeを作成しようとしました。

import pandas as pd
print('hello world')

かなりの時間(15分+)が経過した後、最大620 MBのdistフォルダーを作成し、150 MBをビルドしました。 Python 3.5.2 | Anacondaカスタム(64ビット)を使用してWindowsで作業しています。distフォルダーでは、mklファイルが約300 MBを占めていることに注意してください。pyinstallerを使用してpyinstallerを実行します.exe foo.py '。--exclude-moduleを使用して一部の依存関係を除外しようとしましたが、それでも巨大なファイルになってしまいました。

Exeにはいくつかの重要なファイルが含まれている必要があることは承知していますが、通常は1 GBほどの大きさになりますか?必要に応じて警告ログや、問題の解決に役立つと思われるものを提供できます。

追伸並行して、同僚が同じサンプルスクリプトからexeを作成し、100 MB未満で終了しました。違いは、彼がanacondaを使用していないことです。それは問題でしょうか?

どんな助けでもありがたいです。

8
dylan_fan

PyInstallerはcondaパッケージから大きな実行ファイルを作成し、pipパッケージから小さな実行ファイルを作成します。この単純なpythonコードから:

from pandas import DataFrame as df
print('h')

Condaパッケージで203MBの実行可能ファイルを取得し、pipパッケージで30MBの実行可能ファイルを取得します。しかし、condaは、純粋なvirtualenvの代わりに使用できます。私はcondaとJupyterで開発でき、mycode.pyをいくつか作成します(myfolderのpyファイルとしてjupyterノートブックをダウンロードできます)。しかし、私の最終的な解決策は次のとおりです。それがない場合は Miniconda をインストールし、WindowsのスタートメニューからAnacondaプロンプトを開きます。

    cd myfolder
    conda create -n exe python=3
    activate exe
    pip install pandas pyinstaller pypiwin32
    echo hiddenimports = ['pandas._libs.tslibs.timedeltas'] > %CONDA_PREFIX%\Lib\site-packages\PyInstaller\hooks\hook-pandas.py
    pyinstaller -F mycode.py

新しい環境「exe」を作成する場合、pypiwin32はpyinstallerを必要としますが、自動的にインストールされません。hook-pandas.pyは、pandasでコンパイルする必要があります。また、インポートサブモジュールは、実行可能ファイルのサイズを最適化するのに役立ちません。だから私はこれを必要としません:

from pandas import DataFrame as df

しかし、私は通常のコードを使用することができます:

import pandas as pd

また、パスに国別文字を使用すると、いくつかのエラーが発生する可能性があるため、開発ツールの英語ユーザーアカウントはニースです。

12
abicorios

これは、アナコンダ版のnumpymkl を使用してビルドされているためと考えられます。

配布可能ファイルのサイズを小さくしたい場合は、pipの代わりにcondaを介してインストールされたパッケージを使用して、別の建物 virtual environment で作業できます。

7
Maarten Fabré

condaを引き続き使用してmklを回避する方法は次のとおりです。この代替コマンドでpandasをインストールする前にnumpyをインストールします:
conda install -c conda-forge numpy

mklを避け、代わりに OpenBLAS パッケージを使用します。 conda/conda-forge/numpy-feedstock github repo のこの問題の完全な説明.

5
Nikhil VJ

Anacondaでの作業中の簡単な解決策:

-Anaconda Navigator内で新しい環境を作成します。 (新しい環境には、問題の原因となっている大量のパッケージがありません。)

-ターミナルを開き、pipinstallを使用して必要なパッケージを含めます。 (新しい環境にあることを確認してください)

-pyinstallerを実行します。

.exeを300 MBから30 MBに減らしました。

1
JSBY

私は、Anaconda 3.5.5ビルドをWindows 10でPython用にビルドしており、Anacondaディストリビューションを使用して非常に大きな実行可能ファイルを取得していました。

私は次のようにしてこれを修正することができました:

  1. 最初に仮想環境を作成します(フォーラムはvirtualenvを提案していますが、これにより問題が発生したため、代わりにvenvを使用しました)

    python -m venv C:/Python/NewEnv
    

これにより、ベースPython、pip、setuptoolsでC:/ Python/NewEnv内に仮想環境が作成されます

  1. 次に、新しく作成した環境に切り替えます

    C:/Python/NewEnv/Scripts/activate
    

コマンドプロンプトの前に新しい環境名(NewEnv)が付けられるため、環境が異なることがわかります。

  1. 最初にnumpy、次にscipy、次にpandasをインストールします

    pip install numpy==1.13.3
    pip install scipy==1.1.0
    pip install pandas==0.18.1
    pip install pypiwin32==223
    pip install pyinstaller==3.2
    

別のバージョンを試したため、これらのバージョンを使用する必要がありましたが、pandasの以降のバージョンでは、さらに問題が発生していました。

  1. これらがインストールされたら、プログラムをコンパイルできます

    C:/Python/NewEnv/Scripts/pyinstaller --onefile program.py
    
  2. これにより.specファイルが作成されます。隠しインポートを追加するには、このバージョンのpandasおよびpyinstallerで変更する必要があります。そうでない場合は、実行可能ファイルからpandas=をロードします失敗します(specファイルを作成するだけのpyinstallerコマンドがあるかどうかはわかりませんが、それがある場合は、それを実行します-ammendment#1を参照)

新しく作成された.specファイル内に非表示のインポート行があります。

    hiddenimports=[],

これを変更して、pandas._libs.tslibs.timedeltasを追加します

    hiddenimports=['pandas._libs.tslibs.timedeltas'],
  1. 次に、.specファイルに対してプログラムを再度コンパイルできます。

    C:/Python/NewEnv/Scripts/pyinstaller --onefile program.spec
    

これはあなたがいるディレクトリにプログラムをインストールすることに注意してください。pyinstallerを実行する前にディレクトリを変更してください。

Ammendmend#1:Pyinstallerフックにhook-pandas.pyを追加できることがわかりました。新しい環境にpyinstallerをインストールした後、実行してください

    echo hiddenimports = ['pandas._libs.tslibs.timedeltas'] > C:\Python\NewEnv\Lib\site-packages\PyInstaller\hooks\hook-pandas.py
1
Mitchell_h

純粋なpython環境、Anacondaなしが必要です。

それは、無用のパッケージが多すぎるからです。新しいpython環境を、できるだけ少ないパッケージで別のPCにインストールしてください!

次に、pyinstallerをもう一度使用してみます。この方法では、pyinstallerはファイルを200Mから8Mに減らしました。

PS:いくつかのパッケージが足りない場合は、pip install ...

0
captain

ファイルが非常に大きくなった理由は、会社の共有ドライブ(会社のポリシー)で作業していたためです。作業ディレクトリをローカルドライブに移動した後、問題は解消しました。私はvirtualenvの使用も開始し、スクリプトで使用されていない一部の依存関係を除外していました。すべて非常に小さく、.exeファイルを簡単に共有できました。

0
dylan_fan