python-55 パッケージ化された exe の実行

序文

こんな悩みはありませんか?

  • あなたのプロジェクトを使用するときに、他の人がさまざまな依存関係パッケージをインストールする必要があるかもしれません?
  • 他の人があなたのプロジェクトを使用している場合、その人は環境のインストール方法をまったく知らない可能性がありますか?
  • 共有サービス マシン、時々他の誰かが依存関係パッケージのバージョンを変更し、実行に失敗することがありますか?

毎回これをやるのは非常に時間がかかるので、以前はパッケージ化してexeファイルとして直接実行していたと思いました。

1.pyインストーラー

PyInstaller は、Python プログラムをスタンドアロンの実行可能ファイルに変換するツールです。PyInstaller を使用すると、Python プログラムを単一の実行可能ファイルにパッケージ化し、Python インタープリターなしでコンピューター上で実行できます。
PyInstaller を使用して Python プログラムを実行可能ファイルにパッケージ化する基本的な手順は次のとおりです。

1. PyInstaller がインストールされていることを確認します。インストールされていない場合は、次のコマンドを使用してインストールできます。

pip install pyinstaller

2. ターミナルまたはコマンド プロンプトを開き、Python プログラムが含まれるディレクトリに移動します。

3. 次のコマンドを実行して、Python プログラムを実行可能ファイルにパッケージ化します。

pyinstaller your_script.py

ここで、your_script.py は Python プログラムのファイル名です。

4. PyInstaller は、現在のディレクトリに dist という名前のフォルダーを作成します。このフォルダーには、生成された実行可能ファイルが含まれます。Windows では、実行可能ファイルには .exe 拡張子が付きますが、Linux と Mac では拡張子はありません。
スクリーンショット
5. コマンドビュー

pyinstaller --help
  • -F: すべてのファイルを 1 つの実行可能ファイルにパックします。
  • -D: 実行可能ファイルとすべての依存ファイルを含む、すべてのファイルをディレクトリにパックします。
  • -c: プログラムをコマンド プロンプトと結合して、コマンド プロンプトから実行できるようにします。
  • -d: デバッグ情報を実行可能ファイルにパックします。
  • –onefile: すべてのファイルを 1 つの実行可能ファイルにパックします。
  • -o: 出力ファイルの場所を指定します。
  • -w: ウィンドウ ファイルとしてパックされます。
  • -i:指定ico。

私が最もよく使用するものは次のとおりです。

pyinstaller -F -i xxx.ico xxx.py

2.exeのパッケージ化を練習する

pyinstaller -F -i ./desc/build.ico ppl.py

1、遇坑1:プラグインは登録済みです

依存関係を入力するのが一般的ですが、pytest などの落とし穴もあります

import pytest
from allure_pytest import plugin as allure_plugin
# pytest.main(argv)
pytest.main(argv, plugins=[allure_plugin])  # todo use package

パッケージ化するときに allure_plugin 依存関係を追加する必要がありましたが、IDE で実行すると再びエラーが発生したため、次のように変更する必要がありました。

import pytest
from allure_pytest import plugin as allure_plugin
pytest.main(argv)
# pytest.main(argv, plugins=[allure_plugin])  # todo use package

pytest.main(argv) は解決され、エラーは次のように報告されました:
ValueError: プラグインはすでに登録されています: allure_pytest=<module 'allure_pytest.plugin'
エラーのスクリーンショット


2. 落とし穴 2: OSError ハンドルが無効です

1. パッケージ化後に exe を実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "<string>", line 1, in <module>
OSError: [WinError 6] 句柄无效。

その後、loguru ログ モジュールがエラーを報告していることを確認しました。
私もこの問題を確認しましたが、実際には解決しませんでした。

2. そこで、実行時に loguru がログに使用されるかどうかを示すパラメータを追加します。
デフォルトでは、loguru が使用されます。パラメータ --colour=0 を追加すると、loguru が使用されないことになります。
コード変更の一部は次のとおりです。PplLog 印刷クラスは loguru と同じメソッドを使用するため、コードの変更は最小限です。
エラーのスクリーンショット
3. パッケージテストを行った結果、正常であることが判明しました。これが問題
の原因であるはずですが、より良い解決策が見つからないようなので、現時点ではこれを実行することしかできません。
スクリーンショットを実行する


3. まとめ

  • パッケージ化後は、ワンクリックでさまざまなマシンを実行できるので非常に便利ですが、変更内容によっては再パッケージ化が必要になったり、パッケージ化に関するさまざまな問題が発生したり、解決に時間がかかる場合があります。

  • Linux、Mac、その他のマシン上では、それをパッケージ化するためのホスト マシンが必要になる場合がありますが、現時点では、Windows 上で他のオペレーティング システムを任意にパッケージ化できることは見たことがありません。

  • コードインタープリターで実行する場合には問題ありませんが、依存関係が欠落している場合など、パッケージ化後に問題が発生しない可能性があります。

私のコードアドレス:
github
gitee

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_42675140/article/details/132776385