4

我正在尝试为 wxPython 应用程序创建一个纯 Python 应用程序包。我使用 Apple 文档中描述的文件、Info.plist 文件等创建了 .app 目录。“普通”应用程序和此捆绑包之间的唯一区别是入口点 (CFBundleExecutable) 是一个以以下内容开头的脚本线:

#!/usr/bin/env python2.5

一切正常,除了 OSX 菜单栏中的应用程序名称仍然是“Python”,尽管我在 Info.plist 中设置了 CFBundleName(实际上是我复制了 py2app 的结果)。完整的 Info.plist 可以在这里查看

我怎样才能改变这个?我到处读到菜单栏名称仅由 CFBundleName 确定。Python解释器怎么可能在运行时改变它?

注意:我之前使用的是 py2app,但结果太大(>50 MB 而不是当前的 100KB),而且它甚至不能在 Leopard 和 Snow Leopard 之间移植......所以创建一个纯 - Python 应用程序包“手动”而不是转换 py2app 的输出。

4

3 回答 3

3

Python 开发人员工具附带的“Build Applet.app”实际上是一个纯 Python 应用程序包。它执行以下操作:

  • 将 Python 解释器放置(或链接)到MacOS/目录中
  • 可执行脚本 ( Foo.app/Contents/MacOS/Foo) 设置一些环境变量并调用os.execve()此解释器。

可执行脚本如下所示(假设程序的入口点在 中Resources/main.py):

#!/System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python
import sys, os
execdir = os.path.dirname(sys.argv[0])
executable = os.path.join(execdir, "Python")
resdir = os.path.join(os.path.dirname(execdir), "Resources")
libdir = os.path.join(os.path.dirname(execdir), "Frameworks")
mainprogram = os.path.join(resdir, "main.py")

sys.argv.insert(1, mainprogram)
pypath = os.getenv("PYTHONPATH", "")
if pypath:
    pypath = ":" + pypath
os.environ["PYTHONPATH"] = resdir + pypath
os.environ["PYTHONEXECUTABLE"] = executable
os.environ["DYLD_LIBRARY_PATH"] = libdir
os.environ["DYLD_FRAMEWORK_PATH"] = libdir
os.execve(executable, sys.argv, os.environ)
于 2010-06-01T22:27:57.530 回答
3

将调用的键更改LSHasLocalizedDisplayNameInfo.plisttrue如下所示:

<key>LSHasLocalizedDisplayName</key>
<true/>

然后在可执行包中创建一个文件

foo.app/Contents/Resources/English.lproj/InfoPlist.strings

有线条

CFBundleName="name in the menu bar";
CFBundleDisplayName="name in the Finder";
于 2010-05-28T23:27:09.933 回答
1

实际上,如果您创建一个指向 python 可执行文件的软链接并使用它而不是可执行文件本身(在您的 MyApp.app/Contents/MacOs/-script- 中),一切似乎都可以正常工作。我个人使用“#!/bin/sh”脚本代替,只使用“exec”命令。(我可能仍然需要使用 wx.App.SetAppName(MyAppName)。)例如:

#! /bin/sh

export PYTHONPATH=/Applications/MyApp.app/Contents/Resources/[myPythonCode]
export DYLD_LIBRARY_PATH=/Library/Frameworks/Python.framework/Versions/2.6/lib
exec "/Applications/MyApp.app/Contents/MacOS/[SoftLinkToPythonExe]" "/Applications/MyApp.app/Contents/Resources/myAppMain.py"
于 2010-11-03T20:13:55.990 回答