我想创建一个简单的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脚本复制到其中,并以调用Python脚本的方式配置其Info.plist。
答案 0 :(得分: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 :(得分:4)
答案 2 :(得分:0)
cxFreeze是最好的解决方案,因为它既简单又省时。
首先,使用python创建程序或应用程序,然后为您的应用程序制作setup文件。
然后根据您的要求使用构建命令python setup.py build
来构建应用程序,您需要进行一些更改以制作mac bundle或mac app refer this