【问题标题】:How to change the app name in OSX menubar in a pure-Python application bundle?如何在纯 Python 应用程序包中更改 OSX 菜单栏中的应用程序名称?
【发布时间】:2010-05-28 20:20:59
【问题描述】:

我正在尝试为 wxPython 应用程序创建一个纯 Python 应用程序包。我使用 Apple 文档中描述的文件、Info.plist 文件等创建了 .app 目录。“普通”应用程序和此捆绑包之间的唯一区别是入口点 (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


    【解决方案1】:

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

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

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

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

    有线条

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

    【讨论】:

    • 感谢您的回答!...但运气不好:(我也尝试添加 CFBundleLocalizations 键但没有成功。
    • 我注意到缺少分号(它给出了警告),所以这不是问题。结果如下:tinyurl.com/2wcqe9p
    • 对我来说,“Finder 中的名称”部分有效,但不是“菜单栏中的名称”部分,这是我最关心的部分。测试这些解决方案尤其令人沮丧,因为 Mac 倾向于缓存您的应用程序的早期版本。因此,“touch Foo.app”在每次测试之前都是一个有用的命令。
    【解决方案2】:

    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)
    

    【讨论】:

    • 抱歉,这里到底发生了什么变化?我也有同样的问题!
    【解决方案3】:

    实际上,如果您创建一个指向 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 2017-09-03
      • 1970-01-01
      相关资源
      最近更新 更多