2012-09-26 30 views
3

我正在編寫必須在許多不同類UNIX版本上運行的腳本。 這些是用python 2.x編寫的。腳本Hashbang:如何獲得python 2解釋器?

不幸的是,一些較新的版本調用了這個風味二進制文件「python2」而不是「python」。因此,「#!/ usr/bin/env python」無法查找正確安裝的python解釋器。或者我得到的版本3解釋器(壞)或根本沒有解釋器(更糟糕!)

是否有一個聰明的方式來編寫一個python腳本,使得它將加載python2解釋器(如果已安裝),否則python解釋器if它的安裝?我不得不使用其他機制來檢測「python」是否是python3,但由於我在類似python的環境中,所以我可以忍受這一點。

我想我可以寫一個波紋發射器,稱之爲「findpython2」,並使用它作爲#!但這意味着我必須在搜索路徑中安裝findpython2,這絕對是次優的(這些腳本通常被稱爲絕對引用,因此它們不在路徑中)。

回答

6

充分利用著名的Perl hashbang招靈感,我想出了這個:

#!/bin/sh 
"""": 
python2 -c "" 2>/dev/null && exec python2 $0 ${1+"[email protected]"} 
python -c "" 2>/dev/null && exec python $0 ${1+"[email protected]"} 
echo "Could not find a python interpreter." 
exit 1 
""" 

print "hello python" 
+0

如果有人知道更好的方法來測試路徑中某個程序的存在,我很想知道。 – ninjalj

+1

也可以使用:'$(type -p python2)&& interp = python2 ||的interp =蟒; exec $ interp「$ 0」$ {1 +「$ @」}' –

+0

這實際上回答了這個問題。甜!此外,一個非常可怕的黑客:-) –

4

unix方式是指定python2 - 現在最好的發行版現在將2.x設置爲python2和3.x,作爲python3,鏈接哪個是主要的一個到python(在大多數發行版中,2.x)。因此,最好明確指定一個你想要的。

這是所有PEP 394定義的規定:

這PEP提供了一個約定,以確保Python腳本可以 繼續成爲整個* nix系統攜帶方便,無論默認 版本Python解釋器(即由 python命令調用的版本)。

  • python2會參考一些Python版本2.X的
  • python3會參考一些Python版本3.x的
  • 蟒蛇應該是指相同的目標python2,但可參考python3一些流血的邊緣分佈

因此,如果發行不這樣做是這樣,它本質上是對他們最終的錯誤。

+0

感謝您的回答。不幸的是,它忽略了時間的影響。一個重要的目標發行版是Ubuntu 10.04 LTS(該發行版仍有三年的支持)。它不安裝這些鏈接。不管你把它稱爲「bug」還是沒有,因爲這是我需要忍受的基本事實。另外,當試圖解決我的「實際」問題時,這個答案實際上並沒有回答這個問題。 –

+0

@JonWatte我的建議是提供一個修補腳本來創建該鏈接。 –

+0

我不想要root,我當然也不想要求在/ usr/bin中安裝任何東西。 –

0

如果您必須在python 2上運行,最好還請撥打口譯員python2。我認爲大多數UNIX發行版都具有從/usr/bin/python//usr/bin/python2到相應二進制文件的符號鏈接。

+0

見上 - 這個答案實際上並不回答我問的問題。 –

相關問題