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

问题描述 投票:3回答:3

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

#!/usr/bin/env python2.5

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

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

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

python macos wxpython bundle py2app
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)

2
投票

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

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

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

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

哪条线

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

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"
© www.soinside.com 2019 - 2024. All rights reserved.