Skip to main content
 首页 » 编程设计

python之在 OSX 中,将应用程序名称从 "python"更改为

2025年05月04日18zhenyulu

我正在研究 Orange ,我在 OSX (10.6.5) 中遇到了这个问题,菜单栏名称是“Python”而不是橙色。这是一个 python/qt 应用程序。我需要改变什么?

澄清一下:

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

我的信息.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 启动脚本,经过修改以尝试使用符号链接(symbolic link)。显然有些工作有效:)

#!/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" "$@" 

请您参考如下方法:

我想提出另一种解决方案。 它使用 Cocoa 来设置应用程序名称, 无需摆弄符号链接(symbolic link)。 在使用 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