2013-01-04 94 views
5

我有數千個服務器(linux),一些只有python 2.x,一些只有python 3.x,我想寫一個腳本check.py可以在所有服務器上運行,就像$。/ check.py一樣,不需要使用$ python check.py或者$ python3 check.py,有沒有辦法做到這一點?可以使用python 2.x和python 3.x運行一個python腳本

我的問題是腳本check.py如何找到解釋無論解釋器python2.x和python3.x

+1

確定...只要你使用兩種語言的結構... –

+0

問題是如何寫第一行#/ usr/bin/env python [2.x | 3.x] to找到解釋器 – xielingyun

+0

爲什麼這是一個問題?只要運行'python';在只有2.x的系統上,或者在2.x和3.x下都是2.x;在只有3.x的系統上,它應該是3.x. – abarnert

回答

13

許多腳本都可以在2.x和3.x上運行。 (我有一羣我每天工作,並已將各種開源庫從2.x轉換爲雙版本。)

有幾件事情使它更容易:

  • 對於2.x用戶,要求2.7或至少2.6+。否則,例如,您不能使用參數引發異常或將其捕獲到變量以及其他此類嚴重限制中。
  • 對於3.x用戶,要求3.3+或至少3.2+。大部分無用的不兼容性(如u前綴被拿走)在3.2或3.3中被逆轉。
  • 使用six庫。
  • 使用__future__聲明。
  • 始終在你的腦袋一下是否意味着bytes(只有8位),unicode(必須編碼,如果你想8位),或str(無論大部分STDLIB的API的預期),以及encodedecode清晰必要。
  • 在您的代碼上定期運行2to3。 (但是不要盲目地做它所說的一切,例如,如果你使用d.keys()map(f, l),因爲你不在乎你是否得到list或沒有,你會得到一個警告,因爲2to3不知道你不關心。)

或者,而不是嘗試寫上都運行的代碼,編寫在2.X運行的代碼,但可以通過2to3將自動轉換爲運行3.x的代碼,使您的安裝過程的一部分(在setup.py,if sys.version_info >= (3, 0):執行2to3步驟)。

從您的編輯中,聽起來像您最關心的是要在#中放置什麼!線。對於:

/usr/bin/env python 

這是不能保證工作,但隨後env不能保證在第一工作場所...您可以在事實數着:

  • 在幾乎任何系統平臺/發行僅提供2.X,python是Python的2
  • 在幾乎任何系統平臺/發行耗材兩者python是Python的2
  • 在幾乎任何系統平臺/ d istro供應只有3。X(目前是非常罕見的,但可能最終會更常見),python是Python 3的

但是:

  • 在系統中,如果平臺供應既不,如果管理員只有安裝3.x,它可能會(截至2013年初)而不是可用作python。關於這一點你可以做的不多。

如果最後一個是一個嚴重的問題,你可以解決它通過添加一個啓動程序腳本,寫的SH,試圖python,然後嘗試python3如果失敗。

這樣做的好方法是將啓動腳本本身指定爲Python腳本中的shebang解釋器。 Linux可以處理這個問題,但它是可配置的,並且至少有一些發行版在默認情況下禁用它 - 而大多數其他的* nix系統不能這樣做。

如果還是不行,下一個最好的選擇是讓用戶運行啓動腳本,也就是說,告訴他們做./check.sh而不是./check.py,並check.sh數字出正確的Python解釋器和用於運行$python ./check.py用戶。

如果你想變得非常棘手,甚至可以將Python腳本作爲heredoc嵌入到shell腳本中,所以你只需要分發一個文件。他們運行./check.sh,它找到正確的Python並在heredoc上運行它。

+0

thx,我只是想這樣做,但它不是我的問題,我認爲運行python3只能使用#!/ usr/bin/env python3,錯誤 – xielingyun

+0

@xielingyun:最流行的平臺或者只安裝2 .x或者同時安裝。但是也有一些系統不兼容 - 正如我所說的,如果管理員只安裝3.x(特別是如果他從python.org安裝而不是使用distro軟件包),它可能不會作爲'python '。這對你來說是一個嚴重的問題嗎?如果是這樣,你究竟處理了哪個平臺? – abarnert

+0

@xielingyun:我編輯了答案,並提供了一些有關該案例的一般性幫助,但正如我所說的,它不適用於所有平臺。 – abarnert

0

考慮到Python 3.x都有不完全後向兼容的Python 2.x的兼容,必須確保腳本與兩個版本兼容。這可以通過2to3工具的幫助完成,但最終可能意味着運行兩個不同的Python腳本。