您的位置:首页 > 移动开发

用Python和py2app写独立的Mac OS X 应用

2016-03-20 01:20 746 查看
文/lovexiaov(简书作者)
原文链接:http://www.jianshu.com/p/afb6b2b97ce9
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

前提

创建一个普通文件夹,并创建一个virtualenv环境:

#Createacustomdirectory
$mkdirSandwichApp
$cdSandwichApp

#Usevirtualenvtocreateanisolatedenvironment
$virtualenvvenv
$.venv/bin/activate

现在,创建一个简单的Tkinter应用,并其命名为
Sandwich.py


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

安装py2app

原版的py2app由于ModuleGraph更新了版本产生了一个bug。我fork了该工程,解决了bug,然后放到了Github。使用pip安装py2app:

$pipinstall-Ugit+https://github.com/metachris/py2app.git@master

创建
setup.py
文件

py2app包含了
py2applet
工具,此工具可以帮你创建setup.py文件:

$py2applet--make-setupSandwich.py
Wrotesetup.py

setup.py
文件是对应用的基本定义:

fromsetuptoolsimportsetup

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
。如果你遇到此错误,请参考StackOverflow或者使用我的py2appfork。

此时此刻,最简单的打包并发布应用的方法是在Finder中右击该应用选择“创建归档”。

添加一个图标:

OPTIONS
字典中添加
"iconfile":"youricon.icns"
即可:

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)。

应用高级设置

你可以通过修改
Info.plist
来调用应用的信息各行为。最完整的对可用的键的引用是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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: