Pyinstaller 无法访问数据文件夹
Pyinstaller Unable to access Data Folder
下面是我创建的 game.spec 文件。
当运行以下命令时,应用程序完美创建
pyinstaller --onefile game.spec
运行游戏时,找不到任何数据文件。进一步探索发现它搜索目录 /Users/username 中的所有数据文件,而不是从程序运行的绝对路径中搜索。
规范文件是否需要不同的写法?
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['game.py'],
pathex=['/Users/username/pythonenv/mygame'],
binaries=[],
datas=[('images','images'),
('fonts','fonts'),
('sounds','sounds'),
('pygame','pygame'),
('pygameMenu','pygameMenu'),
('pgzero','pgzero'),
('numpy','numpy'),
('pgzrun.py','.')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='game',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='game')
app = BUNDLE(coll,
name='game.app',
icon=None,
bundle_identifier=None)
当 pyInstaller(或 cx_Freeze、py2exe 等)生成可执行文件时,所有程序文件以及 PyGame、Python 和一堆其他东西都是压缩了。
当它是 运行 时,首先发生的事情是解压存档。在某处 解压缩。然后你的可执行文件被启动,但不是从解压的位置。
要解决此问题,您的脚本必须确定它 运行 所在的位置 - 即脚本的完整路径。然后使用这个位置找到所有程序的额外文件。
import sys
import os.path
if getattr(sys, 'frozen', False):
EXE_LOCATION = os.path.dirname( sys.executable ) # cx_Freeze frozen
else:
EXE_LOCATION = os.path.dirname( os.path.realpath( __file__ ) ) # Other packers
然后加载文件时,确定完整路径 os.path.join
:
my_image_filename = os.path.join( EXE_LOCATION, "images", "xenomorph.png" )
image = pygame.image.load( my_image_filename ).convert_alpha()
my_sound_filename = os.path.join( EXE_LOCATION, "sounds", "meep-meep.ogg" )
meep_sound = pygame.mixer.Sound( my_sound_filename )
也许可以使用 os.chdir( EXE_LOCATION )
设置一次目录,从而减少更改,但我认为最好注意路径。
下面是我创建的 game.spec 文件。 当运行以下命令时,应用程序完美创建
pyinstaller --onefile game.spec
运行游戏时,找不到任何数据文件。进一步探索发现它搜索目录 /Users/username 中的所有数据文件,而不是从程序运行的绝对路径中搜索。
规范文件是否需要不同的写法?
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['game.py'],
pathex=['/Users/username/pythonenv/mygame'],
binaries=[],
datas=[('images','images'),
('fonts','fonts'),
('sounds','sounds'),
('pygame','pygame'),
('pygameMenu','pygameMenu'),
('pgzero','pgzero'),
('numpy','numpy'),
('pgzrun.py','.')],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
[],
exclude_binaries=True,
name='game',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='game')
app = BUNDLE(coll,
name='game.app',
icon=None,
bundle_identifier=None)
当 pyInstaller(或 cx_Freeze、py2exe 等)生成可执行文件时,所有程序文件以及 PyGame、Python 和一堆其他东西都是压缩了。
当它是 运行 时,首先发生的事情是解压存档。在某处 解压缩。然后你的可执行文件被启动,但不是从解压的位置。
要解决此问题,您的脚本必须确定它 运行 所在的位置 - 即脚本的完整路径。然后使用这个位置找到所有程序的额外文件。
import sys
import os.path
if getattr(sys, 'frozen', False):
EXE_LOCATION = os.path.dirname( sys.executable ) # cx_Freeze frozen
else:
EXE_LOCATION = os.path.dirname( os.path.realpath( __file__ ) ) # Other packers
然后加载文件时,确定完整路径 os.path.join
:
my_image_filename = os.path.join( EXE_LOCATION, "images", "xenomorph.png" )
image = pygame.image.load( my_image_filename ).convert_alpha()
my_sound_filename = os.path.join( EXE_LOCATION, "sounds", "meep-meep.ogg" )
meep_sound = pygame.mixer.Sound( my_sound_filename )
也许可以使用 os.chdir( EXE_LOCATION )
设置一次目录,从而减少更改,但我认为最好注意路径。