在 OSX 中,将应用程序名称从“python”更改

Posted

技术标签:

【中文标题】在 OSX 中,将应用程序名称从“python”更改【英文标题】:In OSX, change application name from "python" 【发布时间】:2011-02-18 23:42:43 【问题描述】:

我正在处理Orange,并且在 OSX (10.6.5) 中,菜单栏名称是“Python”而不是橙色。这是一个 python/qt 应用程序。我需要改变什么?

澄清一下:

qt 应用,不是 cli,不在终端中运行。

我的 info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDisplayName</key>
    <string>YOORANGE</string>
        <key>CFBundleExecutable</key>
        <string>Orange</string>
        <key>CFBundleIconFile</key>
        <string>orange.icns</string>
        <key>CFBundleIdentifier</key>
        <string>si.ailab.Orange</string>
        <key>CFBundleInfoDictionaryVersion</key>
        <string>6.0</string>
        <key>CFBundleName</key>
        <string>Orange</string>
        <key>CFBundleGetInfoString</key>
        <string>Orange, component-based data mining software</string>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleSignature</key>
        <string>Orng</string>
        <key>CFBundleShortVersionString</key>
        <string>1.0.0</string>
        <key>CFBundleVersion</key>
        <string>1.0.0</string>
        <key>CFBundleDocumentTypes</key>
        <array>
                <dict>
                        <key>CFBundleTypeExtensions</key>
                        <array>
                                <string>ows</string>
                        </array>
                        <key>CFBundleTypeName</key>
                        <string>Orange Canvas Schema</string>
                        <key>CFBundleTypeOSTypes</key>
                        <array>
                                <string>OWSf</string>
                        </array>
                        <key>CFBundleTypeIconFile</key>
                        <string>schema.icns</string>
                        <key>CFBundleTypeRole</key>
                        <string>Viewer</string>
                        <key>LSIsAppleDefaultForType</key>
                        <true/>
                </dict>
        </array>
</dict>
</plist>

这是 Orange 启动脚本,经过修改以尝试使用符号链接。显然有些工作有效:)

#!/bin/bash

BUNDLE_DIR=`dirname $0`/../
BUNDLE_DIR=`perl -MCwd=realpath -e 'print realpath($ARGV[0])' $BUNDLE_DIR`/
FRAMEWORKS_DIR="$BUNDLE_DIR"Frameworks/

CANVAS_FILE="$FRAMEWORKS_DIR"Python.framework/Versions/2.6/lib/python2.6/site-packages/orange/OrangeCanvas/orngCanvas.    pyw

cp "$FRAMEWORKS_DIR"Python.framework/Resources/Python.app/Contents/MacOS/Python-32,AWESOME
PYTHONEXECUTABLE="$FRAMEWORKS_DIR"Python.framework/Resources/Python.app/Contents/MacOS/AWESOME
PYTHONHOME="$FRAMEWORKS_DIR"Python.framework/Versions/2.6/

#DYLD_FRAMEWORK_PATH="$FRAMEWORKS_DIR"$DYLD_FRAMEWORK_PATH:+:$DYLD_FRAMEWORK_PATH
DYLD_FRAMEWORK_PATH="$FRAMEWORKS_DIR":"$BUNDLE_DIR"Resources/Qt4/lib$DYLD_FRAMEWORK_PATH:+:$DYLD_FRAMEWORK_PATH

export PYTHONEXECUTABLE
export PYTHONHOME

export DYLD_FRAMEWORK_PATH
export DYLD_LIBRARY_PATH="$BUNDLE_DIR"Resources/openbabel/lib/:"$BUNDLE_DIR"Resources/openbabel/lib/openbabel/2.2.3/:$    DYLD_LIBRARY_PATH

# LaunchServices passes the Carbon process identifier to the application with -psn paramter - we do not want it
if [[ "$1" == -psn* ]] ; then
 shift
fi

echo "$0"
echo "$PYTHONEXECUTABLE"
echo "$@"

exec -a "$0" "$PYTHONEXECUTABLE" "$CANVAS_FILE" "$@"

【问题讨论】:

【参考方案1】:

我想提出另一种解决方案。 它使用 Cocoa 设置应用程序名称, 无需摆弄符号链接。 在使用 PyQt 之前,在主模块中尽早运行它。

    if sys.platform.startswith('darwin'):
        # Set app name, if PyObjC is installed
        # Python 2 has PyObjC preinstalled
        # Python 3: pip3 install pyobjc-framework-Cocoa
        try:
            from Foundation import NSBundle
            bundle = NSBundle.mainBundle()
            if bundle:
                app_name = os.path.splitext(os.path.basename(sys.argv[0]))[0]
                app_info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
                if app_info:
                    app_info['CFBundleName'] = app_name
        except ImportError:
            pass

【讨论】:

+1,但这只会更改菜单栏中的应用程序名称(Apple 菜单旁边)。应用切换器(Command-Tab)中的应用名称仍然是“Python”。【参考方案2】:

简短的回答 - 这不是微不足道的,因为您正在运行 python 解释器,它是它自己的程序,具有自己的默认标题。

长答案- 如果您设置了环境变量 PYTHONSTARTUP,Python 解释器将在启动时执行一个 shell 脚本。您可以在此设置窗口标题。

    使用要在启动时执行的 shell 脚本的名称设置环境变量 PYTHONSTARTUP (http://docs.python.org/library/idle.html#startup) 在那个 shell 脚本中,运行 settitle [title]

要获得每次都会更改的标题,您必须在启动前执行一些额外的环境变量操作。

【讨论】:

在 shell 脚本中,字面意思是 [run settitle My Title] ?那(减号括号是确切的命令? @Gregg 这么认为。试试这个-link 那不是只设置终端标题,而不是应用标题吗? @Gregg 减去运行。如果这不起作用,你可能可以做到,但我不知道,我在 Windows 7 上写这个。主要是 python 可以让你在启动时运行任意东西。 正如 beer_monk 链接中的书所述,您必须自己创建“settitle”脚本。事实上,它只设置了运行 Bash 的 Terminal.app 的标题;这不是问题的答案。正确的解决方案:***.com/questions/16427221/…【参考方案3】:

这是作弊,但我相信它有效,

创建指向 python 应用程序的符号链接。

ln -s /opt/local/bin/python /opt/local/bin/orange

然后调用 orange 而不是 python 来启动你的脚本

【讨论】:

【参考方案4】:

事实证明,Contents/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/Info.plist 捆绑了一个更深层次的 Info.plist,它正在被调用。

【讨论】:

以上是关于在 OSX 中,将应用程序名称从“python”更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在扩展坞和应用程序切换器中更改 OSX 应用程序的名称?

OSX:如何本地化鼠标飞过扩展坞中的应用程序图标时出现的名称?

如何在 OS X 上的 PyQt4 中更改应用程序菜单名称

如何从 Mac 上的显示名称中找到字体的完整路径?

如何在 OSX 上的应用程序运行时获取更改名称的文件?

使用 osx 终端从外部硬盘驱动器中提取具有特定名称的子文件夹。