17

モジュール化するように設計された pygame プログラムを作成しています。私はファイルmain.pyのpygame2exeでexeを構築しています。これは基本的に実際のメインゲームをインポートして実行するだけです。私が望んでいるのは、すべての不変ファイルを含む単一のプログラムではなく、EXE から Python スクリプトを実行する一種のランチャーです。

これについて最善の方法は何ですか?imp を使用して、すべてのモジュールを暗黙的にインポートするのではなく、実行時に動的にインポートしようとしましたが、オブジェクトの継承が壊れているようです。

4

2 に答える 2

8

いくつかの実験の後、私は解決策を見つけました。

  1. sourceアプリケーションのメイン フォルダーに別のフォルダーを作成します。ここにソースファイルが配置されます。ファイル__init__.pyもフォルダに配置します。のようにメインファイルに名前を付けましょうmain_module.py

  2. そのすべての内容をデータ ファイルとして py2exe 構成に追加しますsetup.py。プログラムをコンパイルすると、これらのファイルは dist フォルダーに配置されます。

    data_files += [('source', glob('source/*.py'),)]
    setup(
          data_files=data_files,
          ....  # other options
         windows=[
              {
                "script": "launcher.py",
                "icon_resources": [(0, "resources/favicon.ico")]
              }
         )
    
  3. Make launcher.py- すべてのシステムと必要なライブラリ (pygame、pyqt など) をインポートするのがタスクです。次に、プログラムを実行します。

    import sys, time, os, hashlib, atexit  # std modules
    import PyQt5, ...   # foreign libraries
    sys.path.insert(0, 'source')
    exec('import main_module')
    
  4. これでインポートされますmain_module.py。モジュールをインポートすると、階層内の場所にもインポートされます。たとえば、 head は次のmain_module.pyようになります。

     import user_tweaks
     from user_data import parser
    

    これらのファイルはuser_tweaks.py、.user_data.pysourcemain_module.py

source再コンパイル プログラム自体を使用せずに、フォルダーの内容を変更することができます。プログラムが実行されるたびに、 の新しいコンテンツが使用されますsource

その結果、次のアプリケーション フォルダーが作成されます。

  • 別のランチャー - シンプルな .exe ファイル
  • 必要なすべてのモジュール
  • すべてのモジュールを含むアプリケーション。
于 2016-03-20T10:40:41.420 に答える
1

去年の夏、私は同じ問題に苦しんでいました - Pythonスクリプトから単一の.exeを構築してください。ただし、PyGame はありませんでしたが、いくつかの問題を追加した PyQt5 がありました。純粋な標準ツールはどれも役に立ちませんでした。

最後に、make + Py2exe + 7Zip + Resource Hacker というチェーンで問題を解決しました。このセットは、インストールを必要としないオンボードのすべてのリソースを備えた単一の.exeを提供したため、Windowsボックスのどこにでも配置して実行できます。

詳細な記事は次のとおりです: cx_Freeze、PyQt5、Python3 でビルドされた exe は ExtensionLoader_PyQt5_QtWidgets.py をインポートして実行できません

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2016-03-19T18:03:47.607 に答える