为什么我的pyinstaller可执行文件无法访问数据文件?

时间:2020-06-22 15:39:39

标签: pygame conda pyinstaller

我已经阅读了数十篇文章,包括pyinstaller文档,并且无法弄清楚为什么我的pyinstaller可执行文件总是返回pygame.error: Couldn't open data/items/switch.png

switch.png是脚本应加载的许多图像中的第一个。

我正在从应用程序的根目录运行pyinstaller --add-data 'data:data' snake.py。该导演中只有snake.pydata,其中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.

1 个答案:

答案 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"))

在尝试调试可执行文件时,它可以帮助打开命令行并从那里运行可执行文件,如果创建了控制台应用程序,则可能仍会看到回溯的情况。