python-3.x - 在没有 python 的情况下将 py2app 应用程序发送到 Mac
问题描述
我有一个 tkinter 应用程序,我想将它分发给我的同事,他们没有安装 python。我将 py2app 与以下 setup.py 文件一起使用
from setuptools import setup
import sys
sys.setrecursionlimit(5000)
#APP would be the name of the file your code is in.
APP = ['Doughnut_stress.py']
DATA_FILES = ['C20.icns']
#The Magic is in OPTIONS.
OPTIONS = {
'packages': ['tkinter', 'matplotlib'],
'includes': ['tkinter'],
'argv_emulation': False,
'iconfile': 'C20.icns', #change app.icns to the image file name!!!
'plist': {
'CFBundleName': 'Axial bearing program',
'CFBundleDisplayName': 'Axial bearing program',
'CFBundleGetInfoString': "Calculates C20 axial bearing",
'CFBundleVersion': "0.0.0",
'CFBundleShortVersionString': "0.0.0",
'NSHumanReadableCopyright': u"Copyright © 2020, Component 2.0 A/S, All Rights Reserved"
}
}
setup(
app=APP,
name='Axial bearing program', #change to anything
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
然后我用
python setup.py py2app
将程序编译成应用程序。注意我已将 python 符号链接到 python3。我的 python 3 是 3.7.5 版本,是通过 MacPorts 安装的。py2app 是 0.20 版,tkinter 是 8.6 版
该程序编译良好,我可以从终端运行它,或者只需双击应用程序文件,它就可以按预期工作。
但是,当我将它发送给我的同事并尝试通过双击应用程序从他的计算机上打开它时,我会弹出一个窗口,我可以在其中选择“打开控制台”或“终止”。如果我通过终端运行程序(通过运行 APP_NAME.app/Contents/MacOS/APP_NAME),我会收到以下错误
Traceback (most recent call last):
File "/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/Resources/__boot__.py", line 416, in <module>
_run()
File "/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/Resources/__boot__.py", line 394, in _run
exec(compile(source, path, "exec"), globals(), globals())
File "/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/Resources/Doughnut_stress.py", line 31, in <module>
root = Tk()
File "tkinter/__init__.pyc", line 2023, in __init__
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
/opt/local/lib/tcl8.6 {/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/lib/tcl8.6} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/lib/tcl8.6} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/Contents/library} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/library} {/Users/prm/Downloads/Component 2.0 axial bearing program.app/tcl8.6.9/library} /Users/prm/Downloads/tcl8.6.9/library
This probably means that Tcl wasn't installed properly.
2020-01-20 15:54:28.439 Component 2.0 axial bearing program[34251:2906750] Component 2.0 axial bearing program Error
我还可以在 APP_NAME.app/Contents/MacOS/python 中运行包含的 python 文件,这会产生此错误
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
Current thread 0x000000010d0f8dc0 (most recent call first):
Abort trap: 6
前段时间有人在 Reddit 上发布过这个问题,但没有给出答案https://www.reddit.com/r/learnpython/comments/c1on6f/py2app_in_a_mac_without_python/
我该如何解决这个问题,以便分发我的 python 应用程序?
解决方案
我的设置中存在相同的问题(缺少 init.tcl):
- macOS 10.15.5,带有 Python 3.7.7 解释器的 venv(包括 TCL8.6),py2app 0.21
- 事实证明,py2app既没有将TCL复制到venv也没有复制到.app,因此生成的.app在Python安装目录(/Library/Frameworks/Python.framework/Versions/3.7/lib/tcl8.6)中找到了TCL在我的设置上。
- 但是,这在没有安装 Python 的设置中不可用 ->错误
解决方案
当我手动复制时:
- /Library/Frameworks/Python.framework/Versions/3.7/lib/tcl8
- /Library/Frameworks/Python.framework/Versions/3.7/lib/tcl8.6
- /Library/Frameworks/Python.framework/Versions/3.7/lib/tk8.6
至
- path_to_venv/lib
py2app 将从那里获取它并将其存储在此位置的 .app 中:
- path_to_project/dist/myApp.app/Contents/Resources/lib/
从这里可以通过python代码找到
下一步
我看到 2 个主要选项如何使其自动化:
- 在 py2app 设置文件中,检查 venv 结构中的 TCL 可用性,如果不可用,则从系统位置复制它
- 直接在py2app中实现
推荐阅读
- javascript - 切换活动后 BLE Web 服务断开连接
- python-3.x - Django 3.1.3 字段 'id' 需要一个数字,但得到了 '{{ \r\nchoice.id }}'
- php - 将 css 类分配给 php 代码以获得简码
- django-rest-framework - 通过电子邮件和社交网络进行 DRF 注册和身份验证
- terraform - 带有时区的地形设置时间
- python - 如何让图像在 10 倍内变亮?蟒蛇,OpenCV
- assembly - 是否有任何寄存器来检查 armv8 机器上是否支持霓虹灯?
- android - 如何创建带圆角的圆形进度条
- python - 基本加密程序
- python - 如何发送一封电子邮件,其中包含由 python 中的不和谐机器人创建的邀请,以获得最大使用量?