2012-10-22 54 views
5

我剛剛開始使用Python,需要一點指導。Python模塊在終端中導入,但不通過Unix Shell

我正在使用Mac,但是我安裝了python的python.org版本以及原始的Apple安裝。

我想加載一些第三方模塊。當我在IDLE或通過終端運行腳本時,一切正常。當我嘗試將它作爲CRON作業運行時,出現錯誤,說它無法找到第三方模塊。

經過一番探索後,我一直相信它是PYTHONPATH/sys.path。我創建了一個測試腳本來顯示我的路徑。那麼,爲什麼當它通過終端窗口運行時直接作爲shell腳本獲得不同的路徑?

我的兩個問題是:

  1. 爲什麼他們有什麼不同?
  2. 如何獲得直接shell過程來查找第三方模塊?

這裏是我的sys.path輸出,當我在終端運行:

['/Library/Scripts', 
'/Library/Scripts/$', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-darwin', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-tk', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-old', 
'/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/lib-dynload', 
'/Library/Python/2.7/site-packages'] 

這裏是我的sys.path輸出,當我在shell中運行它(在這種情況下,我在AppleScript的用「做shell腳本」 的步驟。

"['/Library/Scripts', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', 
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', 
'/Library/Python/2.7/site-packages']" 
+2

你一定要看看virtualenv;它將幫助你處理不同版本的python和項目特定的路徑變量。 –

回答

4

它們爲什麼不同?

因爲您正在運行兩個不同的Python解釋器,並且它們具有不同的默認值sys.path值。

這是有意義的 - 它允許您修改Python.org安裝的標準(或站點)庫,而不會中斷系統安裝(或任何Apple提供的依賴於該安裝的工具)。

我猜,當你在終端運行python,你得到/usr/local/bin/python(您可以檢查通過鍵入which python)(在此框架內或可能爲Python.app/Contents/MacOS/python的地方),這大概是爲了/Library/Frameworks/Python.framework/Versions/7.3/bin/python鏈接。編譯python.org的python以設置sys.path /Library/Frameworks/Python.framework/Versions/7.3/。

同時,當您通過發射服務運行python,你可能得到/usr/bin/python,這是(希望)內置墊片周圍/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python,這是編譯建立sys.path周圍/System/Library/Frameworks/Python.framework/Versions/2.7/

原因python確實在這些情況下,不同的事情是,/usr/local/bin是不是在你的登錄PATH所有,而是由一條線在你~/.profile(或其他)文件添加到路徑的頭。該文件由終端中的shell會話讀取,而不是由Launch Services會話讀取。

如果您想在所有環境中使用相同的Python,則可以明確運行/usr/local/bin/python/usr/bin/python而不僅僅是python。(你也可以得到/usr/local/bin到您的登錄路徑,但是這是一個非常糟糕的主意,或把它弄出來你~/.profile的,但是這是一個有點不方便。)

作爲一個方面說明,這是一個跡象,表明你的蟒蛇。 org的安裝很破:

/Library/Frameworks/Python.framework/Versions/7.3/lib/python27.zip 

沒有Python 7.3。我強烈地考慮卸載並重新安裝python.org版本。

或者,更簡單地說,卸載它並將其卸載,然後使用內置的Python 2.7。如果您需要多個環境,請使用virtualenv而不是多個安裝。例如,如果Apple給你2.7.2,你確實需要2.7.3,那麼你需要另外安裝;否則,你只是讓事情變得更難,沒有任何好處。

+0

順便說一句,我相信上面的'7.3'框架版本來自Enthought Python OS X發行版,而不是破壞的安裝。他們使用自己的框架版本方案與python.org Pythons共存。 –

相關問題