1. 程式人生 > >Windows10下解決多個版本Python共存問題初探

Windows10下解決多個版本Python共存問題初探

為何要在一個系統中裝多個Python版本

Python的主版本有2和3兩個,還有一些特殊的包要求特殊的版本號。軟體開發和測試中,可能會遇到不同開發對Python版本和包的要求不同,還可能要測試編寫程式碼在不同環境下的相容情況,或在同一機器上同時執行多個對版本要求和依賴包要求不同的Python環境。諸如此類,都需要解決多版本Python共存的問題。
以上問題可以分為兩類:

  1. 在系統中安裝多個獨立的Python版本,依據需要切換應用和測試環境。但這些Pyhton版本不是同時工作的。
  2. 要讓系統中多個Python版本能夠同時獨立執行,而各自的執行環境做到相互隔離,各自使用不同的版本,不同的依賴包。而這些獨立執行的py程式在資料上又是可互動或共享的。

有時,即使同一版本的Python下也會產生依賴包之間的衝突,這種情況下,我們就需要為不同的應用配置不同的依賴包,以避免相互衝突。這個問題更歸為第二類問題。

如何解決多版本共存問題

原理:系統如何找到指定版本的Python?

windows系統通過環境變數path來指向可執行檔案的位置。如果path中有多條路徑指向不同資料夾下的同名程式,則系統會以寫在前的為優先。
系統path可通過控制面板\系統和安全\系統\高階系統設定開啟檢視,也可在windows控制檯(cmd或power shell)中以pathset path命令檢視。
假設某一版本的Python安裝位置為:
d:\py\python26

,則要將該位置及其下的Scripts資料夾路徑d:\py\python26\Scripts新增到環境變數path中。

常見四種方法實現多版本共存的評述

1. 臨時性修改系統路徑

基於上述原理,針對第一類問題,對系統環境變數的修改可以用set命令進行臨時性更改。臨時性更改只對當前控制檯視窗有效。如

set path=%path%d:\py\python26;d:\py\python26\Scripts;

set命令不會修改windows的登錄檔,所以是臨時性的。只對當前控制檯視窗有效。

這種方法的好處同時也是壞處–臨時性。可以開多個命令視窗來同時執行多個不同版本的python程式。但總是每次都要設定,雖然可以用批處理檔案來簡化操作,但總歸麻煩。

2. 永久性修改系統路徑

針對第一類問題,只要安裝多個Python時,每次安裝都不讓Windows作業系統自動配置Pyhton的工作路徑即可(在Python安裝時不要選自動新增路徑即可)。在要用到指定版本的Python時手工新增該版本Python所在路徑到系統環境變數path中即可。用完了再手工將這個路徑從系統環境變數path中刪掉。
系統環境變數的配置可用sysdm.cpl命令從控制檯開啟,也可從windows的控制面板的控制面板\系統和安全\系統\高階系統設定開啟`,編輯環境變數即可。
這種做法的缺點是:(1)配置要手工操作,麻煩;(2)由於配置是全域性的,所以不可能同時執行不同版本的python程式。

3. 修改python.exe的檔名

這種思路下,多個版本的python可執行檔案路徑都配置在系統環境變數path中,但是通過修改可執行檔案python.exe的檔名來進行區分。如將2版本的改名為python2.exe,將3版本的改名為python3.exe等等。對應的pip檔案也用pip2和pip3改名或拷貝重新命名。
這樣做的壞處是:其他應用程式中如果呼叫python的預設指令是python.exe的話,則要修改後方能指向對應的版本。這些不同python版本不是完全分離的,所以有潛在衝突的可能。

4. 使用Python啟動器py.exe

python安裝時候在電腦上會安裝核心啟動py.exe,通過傳遞引數可識別並對應啟動電腦上python版本。而且可極大解決的pip installa安裝時候的問題。即

py -2   //啟動2版本的
py -3   //啟動3版本的

python2下pip安裝命令如下:
py -2 -m pip install xxxxxx

python3下pip安裝命令如下:
py -3 -m pip install xxxxxx

這是Python原生的方法,但不能支援更多的版本,也無法解決其他應用程式中如果呼叫python的預設指令是python.exe的問題。

綜上4種方法,第1,2種是基本的。第3,4種或多或少存在與其他軟體的呼叫關係問題。所以不建議使用。

改進方法

用批處理進行臨時系統路徑設定

臨時性設定path的方法可以靈活更改呼叫python直譯器版本,並可在不同控制檯視窗同時呼叫不同的python版本,只是設定麻煩一點。可以用批處理檔案來簡化操作。

【例】我們要用Sublime Text編輯器來編輯和編譯執行python。當在Sublime Text編輯程式碼後,並選以python編譯,就可用ctrl+B編譯執行。但前題是Sublime Text要能找到(即知道呼叫直譯器的路徑),否則就要報錯。現要求開啟一個SublimeText編輯器,能分別對應除錯Pyhton2和3兩個版本的程式碼,如何做?

【解】
預設條件:設Sublime Text軟體解壓釋放在一個資料夾中,首先將Sublime Text的執行檔案sublime_text.exe所在資料夾路徑設定到系統path中。開啟一個控制檯視窗(win+R執行cmd.exe),執行subl即可開啟一個Sublime Text編輯器。

win+R執行cmd.exe

執行subl.exe

執行subl.exe

能開啟Sublime Text編輯器。由於在該控制檯中沒有python的執行程式路徑,執行python在該控制檯將報錯。所以Sublime Text也會報找不到python直譯器的錯誤。

這裡寫圖片描述

設定python路徑後再執行subl,Sublime Text就能正確找到Python直譯器了。
建立一個bat檔案如下:sublpy3.bat

set path=%path%D:\py\Python36x86;D:\py\Python36x86\Scripts;
subl.exe

以及sublpy2.bat

set path=%path%D:\py\Python27x86;D:\py\Python27x86\Scripts;
subl.exe

則,執行sublpy3.bat(可雙擊執行也可在控制檯執行)則開啟Python3作為直譯器。執行sublpy2.bat則以python2作為直譯器。

這裡寫圖片描述

用SETX長久修改系統環境變數

採用sysdm.cpl開啟系統環境變數設定對話方塊手工設定顯然可以,但不方便。這裡我介紹如何也採用批處理來修改登錄檔上的系統環境變數,從而改變python直譯器的版本指向。

windows的SETX指令可以實現此功能,但使用有一技巧:

我們這樣做:
1. 在系統環境變數中新增一個新的環境變數,例如命名為py。然後將py作為變數名加入到path變數中。
2. 用SETX改變py變數的取值即可。

這裡寫圖片描述

在命令列中寫:

D:\>SETX py "D:\py\Python27x86;D:\py\Python27x86\Scripts;"

則將python27版的路徑賦值給py

D:\>SETX py "D:\py\Python36x86;D:\py\Python36x86\Scripts"

則將python36版的路徑賦值給py

這樣修改了py並將結果寫入到登錄檔中,從而更改使用的python的版本。這樣的方法可以不更改python可執行檔案的名字,以使sublimetext等軟體的預設引數能夠工作。

注意:用SETX設定後,設定引數寫入登錄檔,但當前控制檯命令窗中的路徑不會更新。需重開新的控制檯命令窗才可看到更新結果。SETX預設修改的是當前使用者下的路徑變數,如要修改系統所有使用者的路徑變數,可加引數/M。

將以上方法做所批處理檔案即可。例如我們做3個bat檔案:
usepy3.bat

SETX py "D:\py\Python36x86;D:\py\Python36x86\Scripts"


usepy2.bat

SETX py "D:\py\Python27x86;D:\py\Python27x86\Scripts"

以及
donotuseanypy.bat

SETX py ""

這樣可以任意開關python的版本了。
設定後,從新的控制檯啟動subl即可正確找到直譯器版本。如從檔案中直接點選sublime_text.exe則可能仍不能正確找到python,那麼重新重新整理一下檔案管理器即可。

有沒有更好的辦法?

以上兩法可以解決多版本Python在windows中共存的問題。但其實還有更好的辦法。就是使用虛擬python環境。Python中有virtulenv包可用,在Python3.4以上還自帶了venv包完成與virtulenv包一樣的功能。

virtulenv包的原理還是為各版的python設定獨立的系統路徑變數,從而實現分離和共存。

設定了python的virtulenv環境後,通過控制檯視窗進入相應目錄,以activate.bat啟用之。以deactivate.bat退出之。啟用後從該視窗中執行subl即進入了對應該虛擬環境的sublimeText編輯器中。
例如:(//後為我的註釋)

D:\mypywork\py27work\Scripts>activate
//進入虛擬環境後,在碟符前有相應提示。(py27work)
(py27work) D:\mypywork\py27work\Scripts>subl  
//可以從這啟動sublime編輯器

(py27work) D:\mypywork\py27work\Scripts>deactivate    
//退出虛擬環境
D:\mypywork\py27work\Scripts>

下回再細講。