2010-05-28 61 views
3

我正在嘗試爲wxPython應用程序創建一個純Python應用程序包。我使用Apple文檔中描述的文件和Info.plist文件等創建了.app目錄。「普通」應用程序與此捆綁包之間的唯一區別是入口點(CFBundleExecutable)是一個以下列行:如何在純Python應用程序包中的OSX菜單欄中更改應用程序名稱?

#!/usr/bin/env python2.5 

一切正常,只是在OSX菜單欄應用程序的名稱仍是「巨蟒」雖然我已經設置的Info.plist的CFBundleName(我複製py2app的結果,實際上)。 The full Info.plist can be viewed here

我該如何改變這種情況?我到處閱讀,菜單欄名稱僅由CFBundleName確定。 Python解釋器如何在運行時改變它?

注意:我之前使用py2app,但結果太大(> 50 MB而不是當前的100KB),它在Leopard和Snow Leopard之間甚至不能移植......所以它似乎很多更容易創建一個純Python應用程序包「手動」比轉換py2app的輸出。

回答

3

創建一個文件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) 
+0

對不起,這裏改變了什麼?我有同樣的問題! – 2011-02-18 20:44:57

2

更改一個在Info.plist稱爲LSHasLocalizedDisplayNametrue鍵,如:

<key>LSHasLocalizedDisplayName</key> 
<true/> 

,然後在可執行束

foo.app/Contents/Resources/English.lproj/InfoPlist.strings 

其具有線

CFBundleName="name in the menu bar"; 
CFBundleDisplayName="name in the Finder"; 
+0

感謝您的回答......但沒有運氣:(我也試圖添加與CFBundleLocalizations關鍵!沒有成功 – gyim 2010-05-29 00:07:42

+0

我注意到了缺少的分號(它給出了一個警告),所以這不是問題,結果如下:http://tinyurl.com/2wcqe9p – gyim 2010-05-29 06:27:30

+2

對於我來說,「Finder中的名字」部分起作用,但而不是「菜單欄中的名稱」部分,這是我最關心的問題,測試這些解決方案尤其令人沮喪,因爲Mac往往會緩存以前版本的應用程序,因此「touch Foo.app」是一個非常有用的命令,測試 – 2011-06-16 15:24:01

1

其實,如果你創建一個軟鏈接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" 
相關問題