写了一个python小程序,想打包成可执行的APP,看网上写的教程很简单,大概就是下面这个样子。
1.生成setup.py文件
#main.py就是你实际工程里的主执行程序,我的叫main.py
py2applet –make-setup main.py
生成的默认setup.py内容如下:
屏幕快照 2022-03-19 下午12.57.47 下午.jpeg2.打包
#-A参数不会打包依赖库等,这样打包的程序(下称本地APP)只能在本机或者跟你本机配置一模一样的环境执行,一般要去掉,以保证在任何环境可以正常执行
python3 setup.py py2app -A
执行后会生成一个build和dist文件夹,dist下的main.app就是生成的可执行程序,双击即可运行。
但实际上,稍稍复杂一点的工程按照默认的setup.py打包,执行的时候都是会出错的。
原本的设想是会把工程包按原本的目录结构全部打包,但实际上需要用到的图片,音源,文本等等,在执行的时候都会报错找不到,因为都是要手动配置到setup.py里才能被打包。
如果不知道自己的APP为什么会报错,可用以下命令执行APP,就可以看到报错信息:
main.app/Contents/MacOS/main
所以需要修改setup.py如下:
DATA_FILES = []
OPTIONS = {
#指定要打包的第三方库
'includes': ['pygame'],
#指定APP里用到的图片,音效,文件等,
#可以指定文件夹,或是具体的文件
#指定文件夹就会把整个文件夹都打包
#这些内容如果放在上面的DATA_FILES里,也可以达到同等效果
'resources': ['resources'],
#APP执行时显示的图标,icns是MAC图标的标准文件
'iconfile': 'LOGO.icns',
#有待研究,暂时只设定了版本号
'plist': {'CFBundleShortVersionsString':'0.1.0'}
}
具体的参数解释:官方文档
icns的生成参考:【MAC】生成MAC APP图标icns
================================
追加一个打包后运行时遇到的一个让我解决了很久的问题。
报错信息如下:
ImportError: dlopen(/Users/chen/Documents/workspace/minesweeper/dist/main.app/Contents/Resources/lib/python3.9/lib-dynload/_ctypes.so, 2): Library not loaded: @rpath/libffi.8.dylib
Referenced from: /Users/chen/Documents/workspace/minesweeper/dist/main.app/Contents/Resources/lib/python3.9/lib-dynload/_ctypes.so
Reason: image not found
查了很多信息,应该是动态链接库的问题,当你的依赖库里又去引用另一个库的时候,会出现这种找不到的情况。但是网上的解决办法我都没有试成功,尤其我要保证我的APP去了任何一台机器都可以直接运行。所以最后尝试了最傻的办法。就是直接把这个找不到的库打包进我的APP,虽然这个libffi.8.dylib应该是一个shared lib.
所以修改setup.py文件里追加如下设置:
'frameworks': [ '/Users/chen/mambaforge/lib/libffi.8.dylib'],
重新打包后,libffi.8.dylib就会自动出现在Frameworks下面,本机双机运行正常,直接传到其它机器运行也正常了。
网友评论