在不使用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应用程序?

马雷克·德沃拉克(Marek Dvorak)

在我的设置中,同样的问题(缺少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个主要选项如何使其自动化:

  1. 在py2app设置文件中,在venv结构中实施TCL可用性检查,如果不可用,则从系统位置复制它
  2. 直接在py2app中实现

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在不占用键盘的情况下将击键发送到非活动的GUI应用程序

在不使用JSON的情况下将数组发送到Web服务

在没有应用程序休眠的情况下,每5分钟将Android GPS坐标发送到PHP中的WebService上

如何在不使用角度5的* ngFor的情况下将数据从父组件发送到子组件

如何在Java中不使用XMLHttpRequest的情况下将数据发送到服务器?

如何在不使用parse.com创建频道的情况下将推送通知发送到特定设备?

有没有办法在不使用 Webhook 的情况下将 POST 请求发送到 slack?

使用Python和py2app创建独立的macOS应用程序

如何在不使用Flask的情况下将Python应用程序绑定到Heroku上的端口?

是否可以在不使用Google Play / App Store的情况下分发Ionic应用程序?

如何在不使用Playstore或App Store的情况下升级Flutter应用程序?

使用PHP将电子邮件从APP Engine应用程序发送到Gmail地址

通过Mac应用程序将通知发送到iPad应用程序

如何在不使用 ORM 的情况下将 Nestjs 应用程序连接到 postgreSQL?

在不使用git的情况下将Rails应用程序部署到Heroku?

如何在不使用 SQLAlchemy 的情况下将 Flask 应用程序部署到 Heroku?

py2app pyqt缺少库,应用程序无法在Mac OS X上启动

如何在不使用Confluent的情况下使用Kakfa Connect将数据从Kafka发送到AWS S3?

如何在不使用 VCL 样式的情况下将颜色应用于 Delphi 10.2 Tokyo 应用程序?

如何在不提交表单的情况下使用ajax将数据发送到servlet

与蓝牙经典配对后,我可以在不使用 GATT 连接的情况下将数据发送到 ble 4.2 或 ble 5 模块吗

如何在不使用 React 中的父子关系的情况下将数据发送到另一个组件

如何在不使用SendMessage的情况下将“ Message”发送到.Net中的另一个进程?

如何在不使用ASP.NET Core的情况下将Json数据从控制器发送到javascript?

如何使机器人在不使用命令的情况下将消息发送到特定渠道中的特定行会

如何在不使用任何模板引擎的情况下将某些上下文从节点服务器发送到html模板

如何在不使用密码的情况下将电子邮件从MVC4发送到我的gmail?

如何获取Web客户端处理表单,以在不使用客户端脚本的情况下将页面ID信息发送到服务器

dart/flutter:如何使用 Flutter 前端与 C/C++ 后端将 iOS 应用程序发送到 App Store?