如何通过Python为Mac应用程序脚本创建应用程序包

4
我希望创建一个简单的Mac应用程序包,调用一个简单的Python脚本。我想使用Python完成这个任务。是否有一个简单的方法?我尝试使用py2app,但它似乎失败了,例如:
from setuptools import setup
setup(app=["foo.py"], setup_requires=["py2app"])

提供:

---------------------------------------------------------------------------
SystemExit                                Traceback (most recent call last)
/Users/az/<ipython console> in <module>()

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.pyc in setup(**attrs)
    138         ok = dist.parse_command_line()
    139     except DistutilsArgError, msg:
--> 140         raise SystemExit, gen_usage(dist.script_name) + "\nerror: %s" % msg
    141 
    142     if DEBUG:

SystemExit: usage: ipython [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
   or: ipython --help [cmd1 cmd2 ...]
   or: ipython --help-commands
   or: ipython cmd --help

error: no commands supplied
Type %exit or %quit to exit IPython (%Exit or %Quit do so unconditionally).

我也尝试了以下方法:

import py2app.build_app
py2app.build_app.py2app("foo.py")

还有一个错误 (TypeError: dist must be a Distribution instance),这也无法解决。(我不太确定如何使用 py2app.build_app.py2app,并且也没有找到很多示例/文档)。

也许对于我的用例来说,setuptools/py2app或其他工具都有些大材小用。我只想创建一个简单的空应用包,将 Python 脚本复制到其中,并以这样的方式配置它的 Info.plist,以便调用 Python 脚本。


你试过遵循http://packages.python.org/py2app/tutorial.html#create-a-setup-py-file吗?因为你所概述的步骤似乎与此不符,也不符合setuptools教程。 - millimoose
@Sii:我不想创建一个setup.py文件。我想在另一个Python脚本内部完成它。 - Albert
一种选择是使用OSX Automator:https://dev59.com/questions/qGw05IYBdhLWcg3waRCz#31638867 - ccpizza
3个回答

10

这正是我想要的,而且工作得很好:

#!/usr/bin/python

import sys
assert len(sys.argv) > 1

apppath = sys.argv[1]

import os, os.path
assert os.path.splitext(apppath)[1] == ".app"

os.makedirs(apppath + "/Contents/MacOS")

version = "1.0.0"
bundleName = "Test"
bundleIdentifier = "org.test.test"

f = open(apppath + "/Contents/Info.plist", "w")
f.write("""<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>English</string>
    <key>CFBundleExecutable</key>
    <string>main.py</string>
    <key>CFBundleGetInfoString</key>
    <string>%s</string>
    <key>CFBundleIconFile</key>
    <string>app.icns</string>
    <key>CFBundleIdentifier</key>
    <string>%s</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>%s</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>%s</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>%s</string>
    <key>NSAppleScriptEnabled</key>
    <string>YES</string>
    <key>NSMainNibFile</key>
    <string>MainMenu</string>
    <key>NSPrincipalClass</key>
    <string>NSApplication</string>
</dict>
</plist>
""" % (bundleName + " " + version, bundleIdentifier, bundleName, bundleName + " " + version, version))
f.close()

f = open(apppath + "/Contents/PkgInfo", "w")
f.write("APPL????")
f.close()

f = open(apppath + "/Contents/MacOS/main.py", "w")
f.write("""#!/usr/bin/python
print "Hi there"
""")
f.close()

import stat
oldmode = os.stat(apppath + "/Contents/MacOS/main.py").st_mode
os.chmod(apppath + "/Contents/MacOS/main.py", oldmode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)

1
你可以看一下Platypus,它可以从解释脚本创建Mac应用程序包装器。http://sveinbjorn.org/platypus - svth

4

请查看PyInstaller

你只需提供Python脚本路径,它就会分析所有的包导入,并提取所需的任何二进制文件并将其放置在一个归档文件中。

我曾将它用于相当复杂的Python程序,它为我工作得很好。


我不需要那些。我只想创建一个空的应用程序包。 - Albert
那么你的应用程序就不具备可移植性。 - jterrace
为什么不呢?请看我的回答。那应该是可移植的。 - Albert
2
如果用户的 /usr/bin/python 与您期望的不同怎么办?如果用户的 Python 安装缺少您需要的模块怎么办? - jterrace
我只使用标准(MacOSX)包含文件。无论如何,这并不是我问题的真正范围。当然,如果我需要额外的东西,我可以添加它。 - Albert

0

cxFreeze 是最好的解决方案,因为它简单易用且省时。

首先,使用 Python 创建您的程序或应用程序,然后为您的应用程序创建setup文件。

然后使用构建命令python setup.py build构建应用程序,根据您的要求进行一些更改,以制作 Mac 捆绑包或 Mac 应用程序请参阅此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接