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

问题描述:

我正在尝试为wxPython应用程序创建一个纯Python应用程序包。我使用Apple文档中描述的文件和Info.plist文件等创建了.app目录。“普通”应用程序与此捆绑包之间的唯一区别是入口点(CFBundleExecutable)是一个以下列行:如何在纯Python应用程序包中的OSX菜单栏中更改应用程序名称?

#!/usr/bin/env python2.5 

一切正常,只是在OSX菜单栏应用程序的名称仍是“巨蟒”虽然我已经设置的Info.plist的CFBundleName(我复制py2app的结果,实际上)。 The full Info.plist can be viewed here

我该如何改变这种情况?我到处阅读,菜单栏名称仅由CFBundleName确定。 Python解释器如何在运行时改变它?

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

创建一个文件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) 
+0

对不起,这里改变了什么?我有同样的问题! – 2011-02-18 20:44:57

更改一个在Info.plist称为LSHasLocalizedDisplayNametrue键,如:

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

,然后在可执行束

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

其具有线

CFBundleName="name in the menu bar"; 
CFBundleDisplayName="name in the Finder"; 
+0

感谢您的回答......但没有运气:(我也试图添加与CFBundleLocalizations关键!没有成功 – gyim 2010-05-29 00:07:42

+0

我注意到了缺少的分号(它给出了一个警告),所以这不是问题,结果如下:http://tinyurl.com/2wcqe9p – gyim 2010-05-29 06:27:30

+2

对于我来说,“Finder中的名字”部分起作用,但而不是“菜单栏中的名称”部分,这是我最关心的问题,测试这些解决方案尤其令人沮丧,因为Mac往往会缓存以前版本的应用程序,因此“touch Foo.app”是一个非常有用的命令,测试 – 2011-06-16 15:24:01

其实,如果你创建一个软链接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"