Python 独立应用程序在启动时失败 (macOS)
Python standalone application failing when launched (macOS)
所以我使用 PyQt5 在 Python 3.8 中制作了这个简单的密码管理器,并且我一直在使用 'py2app' 模块来创建该程序的独立应用程序。但是,当我执行我的应用程序时(从终端和取景器),我得到一个简单的弹出窗口,上面写着“keysafe Error”。我的代码执行得很好,没有错误。我似乎无法弄清楚这里的问题。如果有帮助,我会在我的 macOS 日志中收到此消息:
Mar 16 10:29:01 my-MacBook-Air com.apple.xpc.launchd[1]: Coalition Cache Hit: app<application.org.pythonmac.unspecified.keysafe.5854321.5857989(501)> [78372]
Mar 16 10:29:01 my-MacBook-Air keysafe[16934]: keysafe Error
Mar 16 10:29:02 my-MacBook-Air com.apple.xpc.launchd[1] (application.org.pythonmac.unspecified.keysafe.5854321.5857989[16934]): Service exited with abnormal code: 255
我也一直在使用以下终端命令通过 py2app 生成我的独立应用程序:
cd <path_to_my_python_script>
py2applet --make-setup keysafe.py
python3 setup.py py2app
我真的不知道该怎么做,感谢所有帮助!
提前致谢!
更新:
如果您转到您的应用程序并在查找器中右键单击它,它将为您提供一个菜单选项。然后,单击 Show Package Contents
。之后,导航至 Contents > MacOS
,您将看到 python 脚本的 Unix Executable File
。 运行 文件,你可以找到你的错误是什么。
尝试之后,我在密码管理器中遇到了有关我命名为 exit
的函数的问题。我认为关键字 exit
可能与某种 MacOS 设置冲突,并将函数名称更改为 exit_
。在使用我更新的脚本创建另一个独立应用程序后,我再次 运行 Unix 可执行文件并得到一个新错误(因此 exit
关键字已修复)。我的新错误是:
Traceback (most recent call last):
File "{path}/Password Manager/dist/keysafe.app/Contents/Resources/__boot__.py", line 110, in <module>
_run()
File "{path}/keysafe.app/Contents/Resources/__boot__.py", line 84, in _run
exec(compile(source, path, "exec"), globals(), globals())
File "{path}/Password Manager/dist/keysafe.app/Contents/Resources/keysafe.py", line 1, in <module>
from cryptography.fernet import Fernet
File "<frozen zipimport>", line 259, in load_module
File "cryptography/fernet.pyc", line 16, in <module>
File "<frozen zipimport>", line 259, in load_module
File "cryptography/hazmat/primitives/padding.pyc", line 11, in <module>
File "<frozen zipimport>", line 259, in load_module
File "cryptography/hazmat/bindings/_padding.pyc", line 14, in <module>
File "cryptography/hazmat/bindings/_padding.pyc", line 10, in __load
File "imp.pyc", line 342, in load_dynamic
ModuleNotFoundError: No module named '_cffi_backend'
2021-04-04 10:30:46.115 keysafe[27312:1337934] keysafe Error
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
所以我终于找到了这个问题的答案!
首先要做的是打开你的 setup.py
文件,默认文件应该是这样的:
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
APP = ['my_program.py']
DATA_FILES = []
OPTIONS = {}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
然后,更改 OPTIONS = {}
以包含您的每一个导入
OPTIONS = {'includes': ['cryptography.fernet', 'PyQt5.QtWidgets',
'PyQt5.QtGui', 'PyQt5.Qt', 'PyQt5', 'PyQt5.QtCore', '_cffi_backend']}
这会手动导入您的模块,如果您遇到任何类似的错误,这应该会起作用!
所以我使用 PyQt5 在 Python 3.8 中制作了这个简单的密码管理器,并且我一直在使用 'py2app' 模块来创建该程序的独立应用程序。但是,当我执行我的应用程序时(从终端和取景器),我得到一个简单的弹出窗口,上面写着“keysafe Error”。我的代码执行得很好,没有错误。我似乎无法弄清楚这里的问题。如果有帮助,我会在我的 macOS 日志中收到此消息:
Mar 16 10:29:01 my-MacBook-Air com.apple.xpc.launchd[1]: Coalition Cache Hit: app<application.org.pythonmac.unspecified.keysafe.5854321.5857989(501)> [78372]
Mar 16 10:29:01 my-MacBook-Air keysafe[16934]: keysafe Error
Mar 16 10:29:02 my-MacBook-Air com.apple.xpc.launchd[1] (application.org.pythonmac.unspecified.keysafe.5854321.5857989[16934]): Service exited with abnormal code: 255
我也一直在使用以下终端命令通过 py2app 生成我的独立应用程序:
cd <path_to_my_python_script>
py2applet --make-setup keysafe.py
python3 setup.py py2app
我真的不知道该怎么做,感谢所有帮助! 提前致谢!
更新:
如果您转到您的应用程序并在查找器中右键单击它,它将为您提供一个菜单选项。然后,单击 Show Package Contents
。之后,导航至 Contents > MacOS
,您将看到 python 脚本的 Unix Executable File
。 运行 文件,你可以找到你的错误是什么。
尝试之后,我在密码管理器中遇到了有关我命名为 exit
的函数的问题。我认为关键字 exit
可能与某种 MacOS 设置冲突,并将函数名称更改为 exit_
。在使用我更新的脚本创建另一个独立应用程序后,我再次 运行 Unix 可执行文件并得到一个新错误(因此 exit
关键字已修复)。我的新错误是:
Traceback (most recent call last):
File "{path}/Password Manager/dist/keysafe.app/Contents/Resources/__boot__.py", line 110, in <module>
_run()
File "{path}/keysafe.app/Contents/Resources/__boot__.py", line 84, in _run
exec(compile(source, path, "exec"), globals(), globals())
File "{path}/Password Manager/dist/keysafe.app/Contents/Resources/keysafe.py", line 1, in <module>
from cryptography.fernet import Fernet
File "<frozen zipimport>", line 259, in load_module
File "cryptography/fernet.pyc", line 16, in <module>
File "<frozen zipimport>", line 259, in load_module
File "cryptography/hazmat/primitives/padding.pyc", line 11, in <module>
File "<frozen zipimport>", line 259, in load_module
File "cryptography/hazmat/bindings/_padding.pyc", line 14, in <module>
File "cryptography/hazmat/bindings/_padding.pyc", line 10, in __load
File "imp.pyc", line 342, in load_dynamic
ModuleNotFoundError: No module named '_cffi_backend'
2021-04-04 10:30:46.115 keysafe[27312:1337934] keysafe Error
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
所以我终于找到了这个问题的答案!
首先要做的是打开你的 setup.py
文件,默认文件应该是这样的:
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
APP = ['my_program.py']
DATA_FILES = []
OPTIONS = {}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
然后,更改 OPTIONS = {}
以包含您的每一个导入
OPTIONS = {'includes': ['cryptography.fernet', 'PyQt5.QtWidgets',
'PyQt5.QtGui', 'PyQt5.Qt', 'PyQt5', 'PyQt5.QtCore', '_cffi_backend']}
这会手动导入您的模块,如果您遇到任何类似的错误,这应该会起作用!