3

私はexeにコンパイルしたいかなりの「重い」Pythonプログラムを持っています。

プログラムにはかなりの量のインポートがありますが、PyQT4フレームワークを使用して、スプラッシュスクリーンが表示されている間にこれらのインポートをロードします。
pyinstaller(cmd内)を使用して、このプログラムを単一の.exeファイルにコンパイルします。

python %pycompile_file% --onefile --noconsole --icon=Icon.ico Script.pyw

ただし、かなりの量のモジュールがインポートされている間(特にsympyを含む)にスプラッシュスクリーンが表示されるように設定されていても、Pythonを実行すると即座に適切な時間枠で表示されますが、
生成された.exeを実行すると、スプラッシュスクリーンが表示されるまでに深刻な遅延が発生します。これは、プログラム全体が読み込まれる前のごく短時間しか表示されません。

私の疑惑は、.pywから.exeにコンパイルすると、実際の「コード」が高速化されますが(したがって、スプラッシュスクリーンが短くなる理由)、プログラムの実行の実際の「開始」が遅くなることです。

.exeが「それほど遅く起動しない」ようにこれを修正するにはどうすればよいですか?

(--onefileへのコンパイルが大きく貢献していると思いますが、.exeファイルをすべての.dllから1つ上のフォルダーにする必要があり、pyinstallerにこれを実行させる方法がわかりません)

ありがとう!


Windows 7
python 2.7.2
pyinstaller
PyQt4

4

2 に答える 2

4

PyinstallerはPythonコードをネイティブコードに変換せず、Pythonバイトコードとバイトコードインタープリターを1つのファイルにパックするだけです。起動のオーバーヘッドがなくなると、実際の処理はまったく同じ速度で行われます。

Pyinstallerの--onefileモードでは、すべてのライブラリをロードする前に一時ディレクトリに解凍する必要があるため、アプリの起動が遅くなります。PyQTの場合、これらのライブラリはかなり大きいため、遅延が顕著になります。DLLを解凍する必要がないように、1ディレクトリモードを使用すると、はるかに高速になります。

于 2012-02-07T12:05:57.290 に答える
0

解決済み;

.dllをコンパイル済みの.exeにアーカイブしないでください。
コードによってインポートされたすべてのファイル(ユーザーが.dllをナビゲートせずに操作できるようにする)を1レベル上に保持し、.exeから1つ上の作業ディレクトリを持つ.exeへのショートカットを作成します。

pywin32を使用してこのようなショートカットを作成できます。

于 2012-02-08T09:49:49.853 に答える