我创建了一个名为breakout.py的python文件,并希望使用pyinstaller创建一个exe。 python文件需要与python脚本位于同一目录中的文件ARCADECLASSIC.TTF才能运行。我也希望能够运行exe文件而不必拥有字体文件。我尝试了多个pyinstaller命令来尝试执行此操作。
我尝试了此命令pyinstaller --add-binary "ARCADECLASSIC.TTF;." --onefile breakout.py
,并收到了一个权限被拒绝的错误号13。
然后,我尝试编辑代码,以使字体文件位于名为fonts的目录中,并尝试运行此命令pyinstaller --add-binary "fonts/ARCADECLASSIC.TTF;fonts" --onefile breakout.py
,该命令没有错误,但是当我运行exe文件时出现错误,提示没有文件这样的命名字体/ARCADECLASSIC.TTF崩溃了。
我现在也尝试指定字体文件的完整目录,但仍然无法使用。
如果这有助于我的操作系统是Windows,并且在pyinstaller 4.0中使用的是python 3.8.5 64位,则为
。
首先是我正在尝试做的事情,其次是如果可能的话我该怎么做以及我在做什么错。
答案 0 :(得分:1)
您将需要创建一个.spec文件,并提及要包含在其中的内容,例如字体或其他图像。
# -*- mode: python -*-
block_cipher = None
a = Analysis(['your python file.py'],
pathex=['C:\\path\\to\\directory'], # just the directory not the file
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
a.datas += [('ttf file','path\\to\\ttf\\file', "DATA")]
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='Your App Name',
debug=False,
strip=False,
upx=True,
console=False # set True if command prompt window needed
)
包含游戏的实际python文件中。
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
每当您要加载字体时,都要这样做。
font = pygame.font.Font(resource_path("Font.ttf"), size)
在主python文件中保存完该文件后,在终端中输入您创建的spec文件。
pyinstaller yourspecfile.spec
这将创建您的可执行文件,并且它应该可以独立工作。
这是我上一个项目中的规格文件的外观 #--模式:python--
block_cipher = None
a = Analysis(['lol.py'],
pathex=['C:\\games\\snake'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
a.datas += [('8min.ttf','C:\\games\\snake\\8min.ttf', "DATA")]
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='Snake',
debug=False,
strip=False,
upx=True,
console=False)