Как изменить имя приложения в меню OSX в комплекте приложений на чистом Python? - PullRequest
3 голосов
/ 29 мая 2010

Я пытаюсь создать пакет приложений на чистом Python для приложения wxPython. Я создал каталог .app с файлами, описанными в документации Apple, с файлом Info.plist и т. Д. Единственное отличие между «обычным» приложением и этим пакетом состоит в том, что точка входа (CFBundleExecutable) представляет собой сценарий, который начинается со следующего строка:

#!/usr/bin/env python2.5

Все работает нормально, за исключением того, что имя приложения в строке меню OSX по-прежнему "Python", хотя я установил CFBundleName в Info.plist (на самом деле я скопировал результат py2app). Полный список Info.plist можно посмотреть здесь .

Как я могу это изменить? Я везде читал, что название меню определяется только CFBundleName. Как это возможно, что интерпретатор Python может изменить это во время выполнения?

Примечание: Ранее я использовал py2app, но результат был слишком велик (> 50 МБ вместо текущих 100 КБ), и он даже не был переносимым между Leopard и Snow Leopard ... так что, похоже, гораздо проще создать пакет приложений на чистом Python «вручную», чем преобразовывать вывод py2app.

Ответы [ 3 ]

3 голосов
/ 02 июня 2010

«Build Applet.app», поставляемый с инструментами разработчика Python, на самом деле представляет собой чистый пакет приложений 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 голосов
/ 29 мая 2010

Измените ключ с именем 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";
1 голос
/ 03 ноября 2010

На самом деле, если вы создаете мягкую ссылку на исполняемый файл 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"
...