代码之家  ›  专栏  ›  技术社区  ›  gyim

如何在纯Python应用程序包中更改osx menubar中的应用程序名称?

  •  3
  • gyim  · 技术社区  · 14 年前

    我正在尝试为Wxpython应用程序创建纯Python应用程序包。我用apple docs中描述的文件、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),而且它甚至不能在豹和雪豹之间移植…因此,与转换py2app的输出相比,“手工”创建纯python应用程序包似乎要容易得多。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Kuba hasn't forgotten Monica    6 年前

    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
  •  2
  •   Yuji    14 年前

    更改一个名为 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";
    
        3
  •  1
  •   Jeff Foran    13 年前

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