web-dev-qa-db-ja.com

Pyinstaller:-exeファイル+フォルダーを生成します(--onefileモードの場合)

今、私はPyinstallerを使用しています。 imgフォルダから画像を取得するスクリプトがあります。

/python
|----/img
|----|----icon1.ico
|----|----icon2.ico
|----maint.py

.exeを生成するためのスクリプトは

pyinstaller.py --windowed --noconsole --clean --onefile maint.py

問題は、.exeファイルのみが生成され、フォルダー/ img全体が省略されることです。

質問:.exeファイル+/imgフォルダーを自動的に取得するには、前の行にどの追加の構文を入力する必要がありますか?

2013年12月18日更新

つまり、pyinstaller.pyスクリプトの実行後、すべての引数を使用して、/ distフォルダーに表示する必要があります:.exeファイル+アプリケーション用に持っているすべてのアイコンまたはビットマップファイルを含む/ imgフォルダー

ありがとう

18
MigRome

2013年12月19日更新

ついに、私たちはそれを手に入れました!

0。現在のバージョンのPYInstaller + Python 2.67 with Sublime Text with Editorを使用しています。

1。 Pyスクリプトにファイル、アイコン、画像が必要な場合は、これらのファイルをプロジェクトフォルダーから取得する(開発中)か、一時データフォルダーを作成する(デプロイメントの場合)関数を含める必要があります。このスクリプトは、リソースを取得するために、相対パスを配置した部分のコードに正確に含まれている必要があります。このガイドラインに正確に従ってください: https://stackoverflow.com/a/13790741

2。前のコードの後で、pyinstallerコマンドを初めて実行する必要があります-質問の投稿に投稿します-。

3。次に、PYInstaller(PYinstaller /にあります)コマンドの実行後に生成された.specファイルを開き、「a.binaries」行の後に次の行をEXE()関数に追加します。

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          Tree('..\\python\\images', prefix='images\\'),
....

Tree(...)関数では、最初の引数は外部に配置するフォルダーであることに注意してください:whichこのフォルダーのすべてのコンテンツを含めることを意味します(AppStart.pyファイルへの相対パスを配置していることに注意してください) .EXEファイルのファイルのコンテナ。

4。その変更後、pyinstallerコマンドを再実行しますが、この場合は.SPECファイルを指しています。

pyinstaller.py --windowed --noconsole --clean --onefile AppStart\AppStart.spec

そして最後に、誰かが言ったように、すべての外部フォルダーをコピーして貼り付ける必要なしに、私のアプリを実行可能ファイルとして実行できます。 しかし、いつものように、私は良い実用的な方法を考えています。

ご協力ありがとうございました。

21
MigRome

これを機能させるには、多くの問題を解決する必要があります。例えば:

  • 適切なリソースパスを取得する
  • データの追加

最初の問題は(前述のとおり)実行モードに応じてパスを調整することで解決されます。

def app_path(path):
    frozen = 'not'
    if getattr(sys, 'frozen', False):
            # we are running in executable mode
            frozen = 'ever so'
            app_dir = sys._MEIPASS
    else:
            # we are running in a normal Python environment
            app_dir = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(app_dir, path)

ツリーの代わりに2番目の問題については、ワイルドカード演算子(*)を使用して必要なものを追加します。

added_files = [
         ( './pics/*', 'pics' ),
         ( './db/*', 'db' ),
         ]

次に分析では、

datas = added_files

完全な答えはかなり長いです。私は この記事 を書いたので、問題を解決するために私が経験したことを少し詳しく示します。