4

単純なPythonスクリプトを呼び出す単純なMacアプリケーションバンドルを作成したいと思います。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を構成したいと思います。

4

3 に答える 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)
于 2011-09-13T16:37:40.127 に答える
4

PyInstallerをチェックしてください。

Pythonスクリプトへのパスを指定すると、すべてのパッケージインポートが分析され、必要なバイナリファイルが抽出され、アーカイブに配置されます。

私はそれをかなり複雑なPythonプログラムに使用しましたが、うまくいきました。

于 2011-09-13T15:55:05.160 に答える
0

cxFreezeは、シンプルで時間を節約できるため、利用可能な最良のソリューションです。

まず、Pythonを使用してプログラムまたはアプリケーションを作成してから、アプリケーションのセットアップファイルを作成します。

次に、ビルドコマンドを使用してアプリをビルドします。要件に応じて、いくつかの変更を加えて、macバンドルまたはmacアプリにこれを参照python setup.py buildさせる必要があります。

于 2018-11-28T11:45:06.070 に答える