我已经阅读了数十篇文章,包括pyinstaller文档,并且无法弄清楚为什么我的pyinstaller可执行文件总是返回pygame.error: Couldn't open data/items/switch.png
。
switch.png
是脚本应加载的许多图像中的第一个。
我正在从应用程序的根目录运行pyinstaller --add-data 'data:data' snake.py
。该导演中只有snake.py
和data
,其中data
包含图像和音乐文件的子文件夹。
snake.spec
显示datas=[('data', 'data')],
对我来说正确。
我也使用--onefile
修饰符尝试了此操作,但每次仍会得到相同的错误。
更新:
我已验证文件在捆绑包中。我正在使用--onedir
来解决此问题,并且'Dist'
目录中的目录结构反映了我的本机结构。使用--add-data="data:data"
时,在主.py文件旁边有一个“数据”文件夹,其中包含一个数据文件'database.xlsx'
和其余数据文件的子目录。我收到以下消息,指示系统无法访问第一个数据文件:
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "cronga.py", line 559, in <module>
File "pandas/io/excel/_base.py", line 304, in read_excel
File "pandas/io/excel/_base.py", line 824, in __init__
File "pandas/io/excel/_xlrd.py", line 21, in __init__
File "pandas/io/excel/_base.py", line 353, in __init__
File "pandas/io/excel/_xlrd.py", line 36, in load_workbook
File "xlrd/__init__.py", line 111, in open_workbook
FileNotFoundError: [Errno 2] No such file or directory: 'data/database.xlsx'
[11168] Failed to execute script cronga
logout
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
答案 0 :(得分:1)
.spec文件是什么样的?这是PyInstaller docs on adding data files。
基本上,您需要添加以下内容:
a = Analysis(...
datas=[ ('the.wav', '.') ],
...
)
这会将声音文件(the.wav)放入已编译应用程序的根目录(第二个参数“。”)。从您的问题来看,您似乎想复制整个数据目录。问题出在那些文件的相对路径上。
然后在应用程序中,您可以检查是从源代码运行还是作为已编译的可执行文件运行。我使用辅助功能:
def my_path(path_name):
"""Return the appropriate path for data files based on execution context"""
if getattr( sys, 'frozen', False ):
# running in a bundle
return(os.path.join(sys._MEIPASS, path_name))
else:
# running live
return path_name
因此,您的应用程序代码将类似于:
the_sound = pygame.mixer.Sound(my_path("the.wav"))
在尝试调试可执行文件时,它可以帮助打开命令行并从那里运行可执行文件,如果创建了控制台应用程序,则可能仍会看到回溯的情况。