Gregg Lind
Gregg Lind

Reputation: 21282

In OSX, change application name from "python"

I am working on Orange, and I am getting this nit where in OSX (10.6.5), the menubar name is 'Python' instead of orange. It's a python/qt app. What do I need to change?

To clarify:

my 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>

Here is the Orange startup script, modified to try to use a symlink. Clearly something work work :)

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

Upvotes: 6

Views: 3905

Answers (4)

B. Ehlers
B. Ehlers

Reputation: 121

I'd like to propose another solution. It uses Cocoa to set the application name, no need to fiddle with symlinks. Run it early in your main module, before using 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

Upvotes: 7

Gregg Lind
Gregg Lind

Reputation: 21282

As it turns out, there was a deeper Info.plist bundled in at Contents/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/Info.plist, that was being called.

Upvotes: 1

Rodaddy
Rodaddy

Reputation: 11

It's a cheat, but i believe it works,

Create a sym link to the python app.

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

then call orange not python to start your script

Upvotes: 1

beer_monk
beer_monk

Reputation: 956

Short answer- it's not trivial because you are running the python interpreter which is its own program with its own default title.

Long answer- Python interpreter will execute a shell script on startup if you have environment variable PYTHONSTARTUP set. You can probalby set the window title in this.

  1. set an environment variable PYTHONSTARTUP with the name of a shell script to execute on start up (http://docs.python.org/library/idle.html#startup)
  2. in that shell script, run settitle [title]

To get a title that changes every time you would have to do some extra environment variable stuff before launch.

Upvotes: 1

Related Questions