【python】打包成MAC APP

【python】打包成MAC APP,第1张

写了一个python小程序,想打包成可执行的APP,看网上写的教程很简单,大概就是下面这个样子。

1.生成setup.py文件

生成的默认setup.py内容如下:

2.打包

执行后会生成一个build和dist文件夹,dist下的main.app就是生成的可执行程序,双击即可运行。

但实际上,稍稍复杂一点的工程庆毁按照默认的setup.py打包,执行的时候都是会出错的。

原本的设想是会把工程包按原本的目录结构全部打包,但实际上需要用到的图片,音源,文本等等,在执行的时候都会报错找不到,因为都是要手动配置到setup.py里才能被打包。

如果不知道自己的APP为什么会报错,可用以下命令执行APP,就可以看到报错信息:

所以需要修改setup.py如下:

具体的参数解释: 官方文档

icns的生成参考: 【MAC】生成MAC APP图标icns

================================

追加一个打包后运行时遇到的一个让我解决了很久的问题。

报错信息如下:

查了很多信息,应该是动态链接库的问题,当你的依赖库里又去引用另一个库的时候,会出现这种找不到的情况。但是网上的解决办好判法我都没有试成功,尤其我要保证我的APP去了任何一台机器都可以直接运行。所以最后尝试了最傻的办法。就是直接把这个找不到的库誉袜备打包进我的APP,虽然这个libffi.8.dylib应该是一个shared lib.

所以修改setup.py文件里追加如下设置:

重新打包后,libffi.8.dylib就会自动出现在Frameworks下面,本机双机运行正常,直接传到其它机器运行也正常了。

编写的程序必须要有GUI(图形用户界面),老困否则程序是不会有显示的。

具体流程

1. 下载py2app

在此推荐使用Pycharm,下载第三方库时很方便。具体为File >Default Settings >Prroject Interpreter >“+” 搜索所需的包即可。猛旦若使用其他IDE,可通过终端输入

pip install py2app

easy_install py2app

注:pip的安装路径要和interpreter的路径保持一致,此处可能出现版本不一致的情况

2. 创建setup.py文件

cd /Users/apple/Desktop/function

py2applet --make-setup function.py

在此后,会显示

Wrote setup.py

但如显示

-bash: py2applet: command not found

说明未找到py2app中py2applet的位置,需手动输入,执行以下命令(重新进入终端,否则路径还在工作区)

sudo find / -name "py2applet" -type f

一般会搜索一段时间,在本人机器上地址为

/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/bin/py2applet

这样的话,最初的命令变为

cd "工程路径"

"py2applet地址" --make-setup "python文件名"

不出意外的话,会显示

Wrote setup.py

说明setup文件已建立,其中具体内容会在以后提到。

3. 发布应用

接上一步,输入

rm -rf build dist

python setup.py py2app

一个简单的小程序侍知念就完成了,”.app”文件会在工程文件目录下的dist文件夹中。

下为demo中命令行中所有命令

Apples-MacBook-Pro:~ apple$ cd /Users/apple/Desktop/helloworld

Apples-MacBook-Pro:helloworld apple$ /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/bin/py2applet --make-setup helloworld.py

Wrote setup.py

Apples-MacBook-Pro:helloworld apple$ rm -rf build dist

Apples-MacBook-Pro:helloworld apple$ python setup.py py2app

running py2app

.........

.........

Done!

Apples-MacBook-Pro:helloworld apple$

到此为止,已完成小程序的发布。

4. 代码及结果

import Tkinter as tk

root = tk.Tk()

root.title("hello")

tk.Button(root, text="Helloworld!").pack()

tk.mainloop()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12401926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存