同じ問題を抱えていて、@ Esaの答えを試したことのある人は、ディレクトリ外で実行すると動作しないことがあります。これはPyinstallerが引き続き相対パスを検索し、インクルードされたファイルを使用しないために発生します。これは、ファイルをロードする前に、あなたのコード内の正しいパスを見つけることによって固定することができます。
if getattr(sys, 'frozen', False):
Path = sys._MEIPASS #This is for when the program is frozen
else:
Path = os.path.dirname(__file__) #This is when the program normally runs
これは、ファイルの実際のパスを発見し、例えば、すべてのファイルに対して実行する必要があります。
pygame.image.load(os.path.join(Path, 'Path\\to_file\\from_root'))
sys._MEIPASS
ですキーは、プログラムがフリーズしたときにプログラムがフリーズしたときのパスを見つけるので、ファイルは別の場所に保存されます。
.exeファイルを生成すると、.specファイルもルートディレクトリとともに作成されます。そこでは、次のようにこれを編集する必要があります。
- あなたは
datas
がNone
に等しいどのよう
- お知らせ以下のようなファイル構造が表示されるはずです。これを編集する必要があります。
これは、現在のルートディレクトリで.specファイルです。今、私たちは何をすべきか
# -*- mode: python -*-
block_cipher = None
#you will have to add things here later
a = Analysis(['file.py'],
pathex=['C:\\path\\to\\root\\folder'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='game_file',
debug=False,
strip=False,
upx=True,
console=True , icon='icon_file.ico')
は、我々はすべて私たちのファイルを追加します:場所このadded_files
block_cipher
以下が、Analysis()
以上、例えば:
added_files = [
('file1.png', '.') #The '.' represents root folder
('file2.png', '\\folder') #loads file2.png from root\folder
]
Analysis()
の内部には、datas
の後にNone
が変更され、added_files
に変更されました。また、最終的なファイルの主な異なるオプションがあることに気づくでしょう。これらのファイルは必要に応じて編集できますが、 "onefile"オプションを変更することはできません。これは.specファイルが作成されたときに行われます。
最後に、この新しいEXEファイルを作成するCMDであなたのルートフォルダに移動し、これを入力する:
pyinstaller "PY_FILE_NAME.spec"
最終exeファイル、フォルダ内にあるか否かが、ルートの\ distの\ Executable_name.exeにする必要がありますまたはroot \ dist \ Executable_name \ Executable_name.exe
プログラムがクラッシュしたときに例外トレースバックを取得していますか?情報のない問題を診断するのは難しいです。私の最初の推測は、 'img.png'はあなたのプログラムが期待している場所にないので、読み込むことができないということでしょう。 – Blckknght
私は 'fatal error:main returned -1'を取得しました。 'img.png'を' .exe'と同じ場所に追加しようとしましたが、動作しません。あなたが言ったことから、私はちょうど 'img.png'がPyInstallerと同じ場所にある必要があるという考えを得ました...テストしよう:編集しないでください。 –
現在の作業ディレクトリを出力する行を追加する価値があります。そうすれば、アプリケーションがファイルを探している場所を具体的に見ることができます。 'import os; print os.getcwd(); ' –