python - pyinstaller 找不到添加的文件 - Mac OS
问题描述
我正在尝试使用 pyinstaller 3.6 在 Mac OS Catalina 10.15 上创建一个基于 python 3.7.7 的应用程序。我使用 Homebrew 和带有 pip 的 pyinstaller 安装了 python。
这个名为 GUI.py 的 Python 代码需要五个图像,这些图像存储在一个名为“resources”的文件夹中,并且所有内容都在“Project”文件夹中。所以项目的结构如下:
项目:
- 图形用户界面.py
- 资源:
- image1.png
- 图像2.png
- image3.png
- image4.png
- image5.png
GUI.py 用于定位图像的路径类似于“resources/image1.png”、“resources/image2.png”等其余图像。
我打开一个终端并输入以下内容:
pyinstaller --add-data /Users/user/Desktop/Project/resources/*:resources /Users/user/Desktop/Project/GUI.py
然后创建 dist 和 build 文件夹以及 GUI.spec 文件。
现在,当我转到 dist/GUI 文件夹并找到可执行文件时,问题就出现了。我双击它打开我的应用程序,但出现以下错误:
FileNotFoundError: [Errno2] No such file or directory: 'resources/image1.png'
但是,如果我打开终端并转到 GUI 可执行文件所在的 dist/GUI 目录并手动执行它:
./GUI
它运行良好,应用程序已打开。
当我将选项添加--nocnosole
到 pyinstaller 指令时,它也会发生同样的情况:
pyinstaller --add-data /Users/user/Desktop/Project/resources/*:resources --noconsole /Users/user/Desktop/Project/GUI.py
这会创建一个名为 GUI 的 Mac OS 应用程序,当我双击它时它不会打开。但是,和以前一样,如果我打开终端并转到 GUI/Contents/MacOS/,我会找到 GUI 可执行文件并手动执行它:
./GUI
然后它工作正常。
我不知道我是否正确添加了包含图像的资源文件夹,或者它是否是 pyinstaller 的 Mac OS 问题。
我添加了一些带有额外信息的注释:
- 我在 Windows 10 和 Ubuntu 18.04.1 中进行了相同的整个过程,并且运行良好。我可以创建包含在 dist 文件夹中的可执行文件并将其导出到其他计算机,它就可以工作。
- 我使用了另一种方法在 pyinstaller 命令中添加数据,但它仍然不起作用:
pyinstaller --add-data /Users/user/Desktop/Project/:. /Users/user/Desktop/Project/GUI.py
- 我按照Pyinstaller 添加数据文件中提供的解决方案,但没有任何效果
- python 应用程序是一个使用 tkinter、pyserial 和 PIL 的图形用户界面。此外,我使用了在 pyinstaller 命令中使用 -p 选项添加的自定义包,但在此处省略,因为它不是错误的来源。
我到处寻找解决方案,阅读 pyinstaller 提供的有关添加数据的文档,但我一无所获。
解决方案
这不是一个 python 问题,而是一个 Mac 问题。在 Mac 上启动应用程序时,启动应用程序的目录实际上是“/.app/Contents/MacOS/”。我的猜测是,要么您需要将资源目录放在该位置,以便应用程序在启动时可以找到它,要么您需要找到一种使用直接路径而不是看起来像您的相对路径的方法'重新使用。我对 pyinstaller 不是很熟悉,但鉴于您在上面使用的语法,我的猜测是这样的:
pyinstaller --add-data /Users/user/Desktop/Project/resources/*:/LibraryDir/PythonStuff/resources /Users/user/Desktop/Project/GUI.py
推荐阅读
- firebird - firebird gfix 扫不干净
- python - 默认情况下对 Python 绘图使用科学记数法
- java - Spring Boot:如何在运行时添加新的数据源
- reactjs - 在 React 中更改变量
- android - Firebase A/B 测试推出领导者
- hive - 如何在 Hive 的同一张表中将数据从一列复制到另一列?
- express - Google App Engine,内容安全政策问题
- gojs - 为什么 Go.js 不适用于内联脚本?
- python-3.x - 如何通过odoo中的新模块使用新的菜单项和操作自定义现有模块?
- mysql - MySql SUM(子查询)