如何在纯Python应用程序包中更改OSX菜单栏中的应用程序名称?

如何在纯Python应用程序包中更改OSX菜单栏中的应用程序名称?,python,macos,wxpython,bundle,py2app,Python,Macos,Wxpython,Bundle,Py2app,我正在尝试为wxPython应用程序创建一个纯Python应用程序包。我使用Apple docs中描述的文件创建了.app目录,其中包含一个Info.plist文件等。“普通”应用程序与此捆绑包之间的唯一区别在于入口点(CbundleExecutable)是一个脚本,它以以下行开头: #!/usr/bin/env python2.5 一切正常,除了OSX菜单栏中的应用程序名仍然是“Python”,尽管我在Info.plist中设置了CbundLename(实际上我复制了py2app的结果) 我

我正在尝试为wxPython应用程序创建一个纯Python应用程序包。我使用Apple docs中描述的文件创建了.app目录,其中包含一个Info.plist文件等。“普通”应用程序与此捆绑包之间的唯一区别在于入口点(CbundleExecutable)是一个脚本,它以以下行开头:

#!/usr/bin/env python2.5
一切正常,除了OSX菜单栏中的应用程序名仍然是“Python”,尽管我在Info.plist中设置了CbundLename(实际上我复制了py2app的结果)

我怎样才能改变这个?我到处都读到,菜单栏名称只由CbundLename决定。Python解释器如何在运行时改变这一点


注意:我以前使用过py2app,但是结果太大了(>50MB而不是当前的100KB),而且它在Leopard和SnowLeopard之间甚至不可移植。。。因此,“手动”创建纯Python应用程序包似乎比转换py2app的输出容易得多。

Info.plist
中名为
LSHasLocalizedDisplayName
的键更改为
true
,如下所示:

<key>LSHasLocalizedDisplayName</key>
<true/>
哪个有台词

CFBundleName="name in the menu bar";
CFBundleDisplayName="name in the Finder";
Python开发工具附带的“buildapplet.app”实际上是一个纯Python应用程序包。它做了以下工作:

  • Python解释器被放置(或链接)到
    MacOS/
    目录中
  • 可执行脚本(
    Foo.app/Contents/MacOS/Foo
    )设置一些环境变量,并调用
    os.execve()
    到此解释器
可执行脚本如下所示(假定程序的入口点位于
Resources/main.py
):


实际上,如果您创建一个到python可执行文件的软链接并使用它,而不是可执行文件本身(在MyApp.app/Contents/MacOs/-script中),那么一切似乎都正常工作。我个人使用“#!/bin/sh”脚本,而只使用“exec”命令。(I您可能仍然必须使用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"

谢谢你的回答!。。。但是没有运气:(我也尝试添加CbundleLocalizations键,但没有成功。我注意到缺少分号(它给出了警告),所以这不是问题。结果是:对我来说,“查找器中的名称”部分起作用,但“菜单栏中的名称”部分不起作用部分,这是我最关心的。测试这些解决方案尤其令人沮丧,因为Mac往往会缓存您应用程序的早期版本。因此,在每次测试之前,“touch Foo.app”是一个有用的命令。对不起,这里到底有什么变化?我也有同样的问题!
#!/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)
#! /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"