2011-08-20 25 views
4

(高級道歉缺乏或正確的鏈接;系統不會讓我補充兩個以上)python.org發佈可以與Apple框架構建好嗎?

不幸的是,我學到了艱辛的道路,你不應該用默認的爛攤子Mac OS X中的Python安裝(特別是10.6.8)。

對於2.6.6(http://www.python.org/getit/releases/2.6.6/)和2.5.4(http://www.python.org/getit/releases/2.5.4/)使用python.org安裝程序後,我的Python版本比Apple提供的更成熟(這對於開發很有用),但已破壞核心系統功能(這對其他任何事情都是不利的)。當試圖運行namebench(https://code.google.com/p/namebench/),Blink(http://icanblink.com/)和Mercurial(https://www.mercurial-scm.org/)時,最明顯的中斷是。從我能收集到的信息來看,這是路徑。

在默認安裝中,路徑應該類似於this question中概述的內容。相反,我的是這樣的:

$ /usr/bin/python2.6 -V 
Python 2.6.6 

$ which python 
/usr/bin/python 
$ python 
Python 2.6.6 (r266:84374, Aug 31 2010, 11:00:51) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> for i in sys.path: 
...  print i 
... 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/pip-1.0.2-py2.6.egg 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload 
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages 

(這是一個類似的故事爲2.5,但是,爲了簡單起見,我將與2.6堅持。)

的問題似乎沒有列入的:

  • /Library/Python/2.6/site-packages/*.egg
  • /Library/Python/2.6/site-packages
  • /System/Library/Frameworks/Python.framework/Versions/2.6/ lib/python2.6
  • /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python

這就解釋了爲什麼眨眼和namebench找不到PyObjC(Is PyObjC pre-installed on OSX SL?)和Mercurial無法找到它模塊(在/Library/Python/2.6)

問題#4865在Python bug跟蹤器中部分地解決了這個特殊的問題,這個問題已經被固定用於版本2.7和更高版本。但是因爲它是「功能請求而不是錯誤修復」,所以沒有被移植到2.5和2.6。即使那時,看着提交的修復程序(http://hg.python.org/lookup/r70778),我不確定它是否解決了缺少對「Extras」目錄的引用。

據我所知,我可以通過手動修改site.py來手動添加Python路徑。我也可以使用PYTHONPATH環境變量。我寧願不改變site.py來造成任何進一步的破壞,並且修改PYTHONPATH只會對使用我的用戶帳戶從shell運行的腳本/應用程序有效。

我可以得到這些更新版本的Python引用與默認框架安裝相同的路徑嗎?如果是這樣,那麼最好的方法是什麼?如果沒有,是否有回滾到系統默認值的可接受方法?

+0

coffeebucket:歡迎來到SO!雖然額外的信息很好,但您的帖子中的某些鏈接是不必要的。您無需爲每件事都提供每個下載/項目頁面鏈接,如果需要進一步澄清,稍後有人可以在後面的評論中提出要求。 – orlp

+0

感謝爆破。我可能會有一些額外的信息帶走了。適用於未來的職位。 – coffeebucket

回答

3

您誤解了Python安裝在OS X上的工作方式。每個Python實例都有自己的site-packages目錄。框架安裝程序的標準位置在框架內./lib/pythonx.y/site-packages。因此,對於安裝到/Library/Frameworks/Python.framework中的python.org安裝程序,您會發現它的2個。6 site-packages here:

/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/ 

Apple對隨OS X發行版附帶的Python版本進行了一些修改。從OS X 10.5,系統蟒蛇被安裝在:

/System/Library/Frameworks/Python.framework

和蘋果選擇包括在每個版本中的非標準./Extras目錄一些額外的第三方軟件包。它還爲每個版本的site-packages目錄使用非標準位置。它們在/Library/Python/中創建,大概是這樣用戶安裝的軟件包不會修改任何內容/System/Library。所以對於Apple提供的Python 2.6,其site-packages目錄是:

/Library/Python/2.6/site-packages 

,並可以被認爲是具有./Extras已經擴大了包。

每個Python實例都有一個單獨的site-packages目錄。不同意並且通常不可能在不同實例的site-packages之間共享包,即使是相同次要版本的Python,即2.6。最明顯的問題是,C編譯器版本,OS X ABI(MACOSX_DEPLOYMENT_TARGET),SDK版本和/或用於構建Python解釋器並隨後由Distutils用於構建C的CPU體系結構經常存在差異包含在第三方軟件包中的擴展模塊。

在Mac OS X 10.6,蘋果提供的Python是使用內置的gcc-4.2和有針對性的只是爲OSX 10.6,並且包括3級CPU架構(i386x86_64,和ppc)。用於Python 2.6的python.org安裝程序也可以在較舊的系統上運行,因此目標爲10.3及更高版本,使用gcc-4.0,並且僅爲32位(i386ppc)。所以,一般來說,你不能爲其中一個Python運行C擴展模塊。

這意味着,一般來說,您需要爲每個Python安裝需要的第三方軟件包的單獨副本,如果它們尚未包含在該Python中。這包括基本項目,如easy_install(從setuptoolsDistribute)。 10.5+中的系統Pythons包括easy_install版本/usr/bin。如果你安裝了python.org Python,你需要爲它安裝一個單獨的版本;默認情況下,easy_install命令將安裝在Python的./bin目錄中;這是Distutils的默認位置。這就是爲什麼建議您將此目錄添加到您的shell PATH(並且Python 2的python.org安裝程序默認會自動執行此操作)。

Issue4865引入的更改並不是一個很好的解決方案,可能會因C擴展模塊而失敗。在未來的版本中,我不會依賴Python。

另外安裝python.org Python不會破壞系統中的任何Python,因爲它們是完全獨立的安裝,使用不同的文件系統位置。唯一可能改變的是當你鍵入一個特定的名字時,Python的哪個實例被調用。 主要由您的shell PATH環境變量的搜索順序來控制。如上所述,默認情況下,python.org安裝程序會更改該順序,但系統Python仍然可以使用其絕對路徑/usr/bin/python2.6。或者,您可以將更改恢復爲shell配置文件,例如.bash_profile

$ echo $PATH 
/Library/Frameworks/Python.framework/Versions/2.6/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin 
$ which python python2.6 
/Library/Frameworks/Python.framework/Versions/2.6/bin/python 
/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6 
$ python -V 
Python 2.6.6 
$ python2.6 -V 
Python 2.6.6 
$ /usr/bin/python -V 
Python 2.6.1 
$ /usr/bin/python2.6 -V 
Python 2.6.1 
# 
# remove python.org Python 2.6 from PATH 
# 
$ export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin 
$ which python python2.6 
/usr/bin/python 
/usr/bin/python2.6 
$ python -V 
Python 2.6.1 
$ python2.6 -V 
Python 2.6.1 
+0

感謝您的詳細說明。爲了節省重新創建蘋果的Python「環境」,我想這將是最容易的刪除python.org版本。我剛剛遇到了關於如何手動刪除python.org安裝([Issue7107](http://bugs.python.org/issue7107))的說明,但我有一些保留意見。特別是,在我的系統上'/ Library/Frameworks/Python.framework'是'/ System/Library/Frameworks/Python.framework /'的符號鏈接。我錯過了明顯的東西嗎?讓我知道是否應該爲這個問題創建一個單獨的問題。 – coffeebucket

+0

'/ Library/Framework/Python.framework'不應該是'/ System/Library/Frameworks /'的符號鏈接。我不確定你可能已經安裝了那個。消除它應該沒有危險。但是,如果是這樣的話,那麼你就不再安裝python.org版本了,因爲它明顯被這個符號鏈接覆蓋了(上面我的回答結束時的演示對你沒有幫助)。 –

+0

看看我的另一個非開發10.6.8機器,默認情況下鏈接肯定不存在。我不完全確定它是如何發生的。從符號鏈接的時間戳看來,它似乎是在我運行2.5.4安裝程序的同時創建的。然後2.6.6安裝程序安裝在2.6.1框架安裝的頂部。無論哪種方式,這都是壞消息。令人驚訝的是,在我執行python.org安裝之前,Time Machine擁有2.5和2.6的副本。如果您有任何其他建議可以從中恢復,我會很高興聽到他們的聲音。 – coffeebucket

相關問題