2010-08-27 60 views
21

有沒有一種標準的方法來確保Python腳本將被python2而不是python3解釋?在我的發行版中,我可以使用#!/ usr/bin/env python2作爲shebang,但似乎並非所有發行版都發布了「python2」。我可以明確地調用python的特定版本(例如2.6),但是這會排除那些沒有該版本的人。有沒有一種標準的方法來確保Python腳本將被python2而不是python3解釋?

在我看來,這將越來越成爲一個問題,當發行版將開始把python3作爲默認的python解釋器。使用sys模塊

回答

7

在一個非常漫長的過渡時期內,這是一個混亂的問題。不幸的是,除了一旦啓動Python腳本本身以外,沒有一種能夠保證正在調用哪個Python版本的防呆,跨平臺方法。很多(如果不是絕大多數)發佈Python 3的發行版都確保通用python命令默認爲別名,而最新的Python 2版本是別名,而python3是別名最新的Python 3.這些發行版不應該被鼓勵去做所以。但是不能保證用戶不會覆蓋它。我認爲在可預見的未來可用的最佳做法是讓包裝商,分銷商和用戶假設python引用Python 2,並在必要時在腳本中構建運行時檢查。

+0

如果有必要,正如kwatford在他的評論中指出的那樣,在安裝時在包的'setup.py'腳本中包括一個檢查,或者從'setuptools','Distribute','pip'等。通常會將腳本的shebang行更改爲指向安裝的Python實例。 – 2010-08-27 22:21:45

+2

恕我直言,總是應該有可用的符號鏈接'python2'爲了使未來,[明確區別shebangs](http://unix.stackexchange.com/questions/26573/python-python2-or-python-python3-how- python-py2k) – 2011-12-12 23:41:09

+1

@Grzegorz:Python PEP 394對該主題是開放的,並且可能在未來的Python 2更新中實現:http://bugs.python.org/issue12627 – 2011-12-13 00:15:55

11

http://docs.python.org/library/sys.html#sys.version_info

您可以確定正在運行的Python的版本,並拋出一個異常或退出或任何你喜歡。

更新:

你可以用它來調用適當的解釋器。例如,設置一個小腳本來檢查你,並在shbang中使用它。它會檢查運行的python版本,如果不是你想要的,尋找你想要的。然後它會在該版本的python中運行該腳本(或者如果沒有發現任何問題,則會失敗)。

+1

見我來jathanism評論。 – 2010-08-27 19:00:26

0

據我所知,不同的發行版將位於驅動器的不同位置。下面是一些可以想到的建議 -

  1. 您可以使用UNIX別名來創建指向不同發行版的快捷方式。例如:alias py2 =「/ usr/bin/python2.X」。所以當你運行你的腳本時,你可以使用py2 xx.py
  2. 或者其他方式可以修改你的PYTHON_PATH環境變量。
  3. 或者如果我沒有錯,sys模塊中有一個規定來獲取當前的python版本號。你可以適當地處理這個交易&。

這應該這樣做...

+3

我正在發佈一個python應用程序,我的問題是確保**所有用戶**使用python2.x來運行我的應用程序。 – 2010-08-27 18:03:17

7

使用sys.version_info你可以做一個簡單的測試值,反對它。例如,如果你只是想支持版本2.6或更低:

import sys 
if sys.version_info > (2,6): 
    sys.exit("Sorry, only we only support up to Python 2.6!") 
+1

這不是我想要的,我希望自動選擇好的解釋器,而不是在選擇了錯誤信息時打印錯誤消息: -/ – 2010-08-27 19:00:01

+0

對於您的問題的確切答案是:「不,沒有標準方法確保python腳本將被python2解釋,而不是python3。「 你要求的是確保Python2被選爲3以上。你沒有指定你想要自動選擇正確的解釋器。 您可能能夠確實這樣做的唯一方法就是在程序被調用之前(例如使用shell腳本)執行檢查,然後運行您的Python代碼以針對所需的Python解釋器。 – jathanism 2010-08-27 21:30:21

+2

期待「好的翻譯自動選擇」是荒謬的。一個文件不能強制哪個程序運行它。 – 2010-08-28 05:02:47

-1

我相信這將做你想做的,即測試非特定版本的Python小於3.X(只要它不不包含from __future__ import print_function聲明)。

try: 
    py3 = eval('print') 
except SyntaxError: 
    py3 = False 

if py3: exit('requires Python 2') 
... 

它通過測試,看是否print是相對於一個聲明,因爲它是在Python3內置功能。當它不是函數時,eval()函數將引發異常,這意味着代碼正在Python 3.0之前的解釋器上運行,並帶有上述警告。

2

不完全相同的情況,但我工作的公司有一個可以運行Python腳本的應用程序(包括許多功能)。在涉及各種平臺上Python安裝的衆多支持問題之後,我們決定只安裝我們自己的Python解釋器和應用程序。這樣我們就知道它的安裝位置以及它的版本。這種方法對您的需求來說可能太重量了(Python包只佔我們應用程序的10%左右),但它確實可行。

+0

這實際上是這是一個很好的方法,它可以將所有這些嚴格要求所需的滾動排除在外。 – jathanism 2010-08-27 21:31:24

2

取決於您如何分配它,我猜。

如果您使用的是正常setup.py文件來管理您的分配,把它彈了出來,如果用戶試圖在Python 3

安裝它安裝完成後,通過創建控制檯腳本的家當(比如說),setuptools可能會與用來安裝它的特定解釋器相關聯。

如果您對安裝有些奇怪,您可以在您使用的任何安裝腳本中查找python解釋器並存儲選項。您可能首先檢查是否所謂的「python」是2.x.如果沒有,請檢查「python2.7」,「python2.6」等,看看有什麼可用的。

0

您可以使用自動工具選擇Python 2解釋器。 Here是如何做到這一點。保證一個正確的shebang可能會很難做到優雅; here是一種方法。它可能會更易於只是有輕擊包裝腳本,wrapper.sh.in看起來像:

#!/bin/bash 
PYTHON2="@[email protected]" #That first link enables this autotool variable 
"$PYTHON2" "[email protected]" #Call the desired Python 2 script with its arguments 

呼叫wrapper.sh(一./configure後),如:

./wrapper.sh my_python2_script.py --an_option an_argument 
相關問題