img_l = pygame.image.load("img.png")
screen.blit(img_l)
使用Python Interpreter,它工作得很好,图像加载和main.py
运行没有问题,但是当我使用Pyinstaller将它变成一个文件.exe
时,.exe
崩溃。
我尝试了很少.spec
次修改,但很少有人能找到帮助。
任何想法都真诚地感激。
编辑:让它与之合作:
img_l = pygame.image.load(os.path.join('img.png'))
screen.blit(img_l, (0, 0))
现在它通过PyInstaller后可以正常工作:)
答案 0 :(得分:1)
抱歉,我对编程非常陌生。
我尝试运行.exe
时遇到类似(相同的?)错误
它说:
pygame.error: Couldn't open walkr1.png
我尝试了您使用的修复,但后来出现了错误:
pygame.error: Can't seek in this data source
图像文件位于包含主.py
文件的文件夹中的文件夹中。我已经尝试将文件移动到同一个文件夹但是没有用。我还尝试将数据文件添加到.spec
文件中,但这似乎不起作用......
想知道你是否可以提供帮助?
对不起,我知道这些可能都是非常愚蠢的问题。
答案 1 :(得分:1)
对于遇到同样问题且尝试过@ Esa的答案的其他人,您可能会注意到在目录外运行时有时无效。这是由Pyinstaller仍然试图找到相对路径而不是使用包含的文件引起的。这可以通过在加载文件之前在代码中找到正确的路径来解决:
pygame.image.load(os.path.join(Path, 'Path\\to_file\\from_root'))
这可以找到文件的实际路径,并且必须为每个文件完成,例如:
sys._MEIPASS
datas
是关键,因为它会在程序冻结时找到路径,就像程序被冻结一样,它的文件存储在其他地方。
生成.exe文件时,还会使用根目录创建.spec文件。在那里,你需要编辑如下:
None
如何等于# -*- 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')
。你必须编辑它。这是目前根目录中的.spec文件:
added_files
现在我们要做的就是添加所有文件:将此block_cipher
放在Analysis()
下面added_files = [
('file1.png', '.') #The '.' represents root folder
('file2.png', '\\folder') #loads file2.png from root\folder
]
以上,例如:
Analysis()
现在在None
内,我们将datas
后的added_files
更改为pyinstaller "PY_FILE_NAME.spec"
。您还会注意到最终文件有不同的主要选项。你可以在这里编辑这些,但你不能改变" onefile"选项,这是在创建.spec文件时生成的。
最后要制作这个新的exe文件,请转到cmd中的根文件夹并输入:
{{1}}
最终的exe,无论是否在文件夹中都应该在root \ dist \ Executable_name.exe或root \ dist \ Executable_name \ Executable_name.exe
中答案 2 :(得分:0)
让它合作:
img_l = pygame.image.load(os.path.join('img.png'))
screen.blit(img_l, (0, 0))
现在它通过PyInstaller后可以正常工作:)
答案 3 :(得分:0)
我遇到了同样的问题。由于某种原因,未为--onefile打包的可执行文件正确设置工作目录。我设法在程序开始时使用以下代码来解决它。 这类似于上面提出的解决方案,但我发现它稍微更优雅:) 如果我们以单个可执行文件的身份运行,它基本上会将工作目录强制到临时提取的目录。
import sys
import os
if getattr(sys, 'frozen', False):
os.chdir(sys._MEIPASS)