用Python和py2app写独立的Mac OS X 应用
2016-03-20 01:20
746 查看
文/lovexiaov(简书作者)
原文链接:http://www.jianshu.com/p/afb6b2b97ce9
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
virtualenv环境:
现在,创建一个简单的Tkinter应用,并其命名为
importsys
ifsys.version_info<(3,0):
#Python2
importTkinterastk
else:
#Python3
importtkinterastk
root=tk.Tk()
root.title("Sandwich")
tk.Button(root,text="MakemeaSandwich").pack()
tk.mainloop()
这个小应用是这个样子:
app_screen.png
Github。使用pip安装py2app:
创建
py2app包含了
fromsetuptoolsimportsetup
APP=['Sandwich.py']
DATA_FILES=[]
OPTIONS={'argv_emulation':True}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app':OPTIONS},
setup_requires=['py2app'],
)
为了方法测试和开发,py2app提供了“别名模式”,该模式通过与开发文件象征性的链接构建应用。
此命令创建了如下文件和文件夹:
这并不是一个独立的应用,并且通过别名模式构建的应用不适用于其他机器。
别名模式下构建的应用直接引用了源码文件,所以任何对
位于
此命令会将你的应用打包为
原版的py2app有一个bug,会出现“StackOverflow或者使用我的py2appfork。
此时此刻,最简单的打包并发布应用的方法是在Finder中右击该应用选择“创建归档”。
fromsetuptoolsimportsetup
APP=['Sandwich.py']
DATA_FILES=[]
OPTIONS={
'argv_emulation':True,
'iconfile':'app.icns'
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app':OPTIONS},
setup_requires=['py2app'],
)
你可以在网上找到icns格式的图标(例如:IconFinder或者freepik)。
Apple'sRuntimeConfiguratinGuidelines。
下面是一个有更多修改的例子:
#-*-coding:utf-8-*-
fromsetuptoolsimportsetup
APP=['Sandwich.py']
APP_NAME="SuperSandwich"
DATA_FILES=[]
OPTIONS={
'argv_emulation':True,
'iconfile':'app.icns',
'plist':{
'CFBundleName':APP_NAME,
'CFBundleDisplayName':APP_NAME,
'CFBundleGetInfoString':"MakingSandwiches",
'CFBundleIdentifier':"com.metachris.osx.sandwich",
'CFBundleVersion':"0.1.0",
'CFBundleShortVersionString':"0.1.0",
'NSHumanReadableCopyright':u"Copyright©2015,ChrisHager,AllRightsReserved"
}
}
setup(
name=APP_NAME,
app=APP,
data_files=DATA_FILES,
options={'py2app':OPTIONS},
setup_requires=['py2app'],
)
通过设置,应用会拥有下面的信息:
get_info.png
原文链接:http://www.jianshu.com/p/afb6b2b97ce9
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
前提
创建一个普通文件夹,并创建一个#Createacustomdirectory $mkdirSandwichApp $cdSandwichApp #Usevirtualenvtocreateanisolatedenvironment $virtualenvvenv $.venv/bin/activate
现在,创建一个简单的
Sandwich.py:
这个小应用是这个样子:
app_screen.png
安装py2app
原版的py2app由于ModuleGraph更新了版本产生了一个bug。我fork了该工程,解决了bug,然后放到了$pipinstall-Ugit+https://github.com/metachris/py2app.git@master
创建setup.py
文件
py2app包含了py2applet工具,此工具可以帮你创建setup.py文件:
$py2applet--make-setupSandwich.py
Wrotesetup.py
setup.py文件是对应用的基本定义:
APP=['Sandwich.py']
DATA_FILES=[]
OPTIONS={'argv_emulation':True}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app':OPTIONS},
setup_requires=['py2app'],
)
如果你的应用使用的其他文件,比如JSON文件,文本文件,图片等,你应该将他们包含在DATA_FILES中。例如:[/code]
DATA_FILES=['testdata.json','picture.png']
创建开发版和测试版的应用
py2app基于在setup.py文件的定义创建独立应用。
为了方法测试和开发,py2app提供了“别名模式”,该模式通过与开发文件象征性的链接构建应用。
$pythonsetup.pypy2app-A
此命令创建了如下文件和文件夹:
.
├──build
│└──bdist.macosx-10.10-x86_64
│└──python2.7-standalone
│└──app
│├──Frameworks
│├──collect
│├──lib-dynload
│└──temp
├──Sandwich.py
├──dist
│└──Sandwich.app
│└──Contents
│├──Info.plist
│├──MacOS
││├──Sandwich
││└──python->/Users/chris/Projects/chris/python-gui/tkinter/env/bin/../bin/python
│├──PkgInfo
│└──Resources
│├──__boot__.py
│├──__error__.sh
│├──lib
││└──python2.7
││├──config->/Users/chris/Projects/chris/python-gui/tkinter/env/bin/../lib/python2.7/config
││└──site.pyc->../../site.pyc
│├──site.py
│└──site.pyc
└──setup.py
这并不是一个独立的应用,并且通过别名模式构建的应用不适用于其他机器。
别名模式下构建的应用直接引用了源码文件,所以任何对
Sandwich.py文件作的修改在应用下次启动时会立刻生效。
位于
dist/Sandwich.app的开发应用可以和其他.app应用一样,在Finder中或通过open命令(
$opendist/Sandwich.app)启动。你可以在终端执行如下命令启动你的应用:
$./dist/Sandwich.app/Contents/MacOS/Sandwich
构建发布版应用
当测试通过后,你可以通过调用pythonsetup.pypy2app来生成发布版。确保旧的
build和
dist文件类都被删除了:
$rm-rfbuilddist
$pythonsetup.pypy2app
此命令会将你的应用打包为
dist/Sandwich.app。由于该应用是自包含的,在任意时刻,如果你修改了代码,数据文件,选项等,你都可以再次运行py2app命令重新构建。
原版的py2app有一个bug,会出现“
AttributeError:'ModuleGraph'objecthasnoattribute'scan_code'”或者
load_module。如果你遇到此错误,请参考
此时此刻,最简单的打包并发布应用的方法是在Finder中右击该应用选择“创建归档”。
添加一个图标:
在OPTIONS字典中添加
"iconfile":"youricon.icns"即可:
APP=['Sandwich.py']
DATA_FILES=[]
OPTIONS={
'argv_emulation':True,
'iconfile':'app.icns'
}
setup(
app=APP,
data_files=DATA_FILES,
options={'py2app':OPTIONS},
setup_requires=['py2app'],
)
你可以在网上找到icns格式的图标(例如:
应用高级设置
你可以通过修改Info.plist来调用应用的信息各行为。最完整的对可用的键的引用是
下面是一个有更多修改的例子:
fromsetuptoolsimportsetup
APP=['Sandwich.py']
APP_NAME="SuperSandwich"
DATA_FILES=[]
OPTIONS={
'argv_emulation':True,
'iconfile':'app.icns',
'plist':{
'CFBundleName':APP_NAME,
'CFBundleDisplayName':APP_NAME,
'CFBundleGetInfoString':"MakingSandwiches",
'CFBundleIdentifier':"com.metachris.osx.sandwich",
'CFBundleVersion':"0.1.0",
'CFBundleShortVersionString':"0.1.0",
'NSHumanReadableCopyright':u"Copyright©2015,ChrisHager,AllRightsReserved"
}
}
setup(
name=APP_NAME,
app=APP,
data_files=DATA_FILES,
options={'py2app':OPTIONS},
setup_requires=['py2app'],
)
通过设置,应用会拥有下面的信息:
get_info.png
相关文章推荐
- Android---Intent传递对象、对象数组
- Xcode 6 新建工程运行在 iOS 7 上下有黑边的问题
- 向Android Studio中添加jar包
- mybatis 关联对象mapper.xml的写法
- Android -BroadcastReceiver广播机制
- Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
- 共享池部分-library cache、library cache object handle、library cache object、shared cursor、session cursor和解析
- android中fragment实现
- iOS开发笔记 - 界面调试神器Reveal
- iOS 自定义的CodeSnippets添加tab自动移动
- App开放接口api安全性—Token签名sign的设计与实现
- 设计模式:Web App 系统架构(二)
- JS中的call、apply、bind方法
- 移动端适配问题
- android学习笔记——使用Intent传递对象
- android学习笔记——灵活使用Log打印日志
- android学习笔记——全局获取Context的技巧
- android学习笔记——Localtion服务之LocationManager
- android学习笔记——Intent的解析(Intent的隐式调用)
- android学习笔记——回调机制