我的電腦環境:先安裝py2再安裝py3,平時我工作中是使用python2,如何保證兩個版本共存且讓程式碼來選擇要使用的版本。
在cmd中輸入python,進入的是py2的環境,但是通過pip install模組是安裝到了python3目錄下
工作中使用pytho2,在學習python新特性時,有個便捷的方法可以切換到python3。希望可以通過雙擊py檔案來執行,而且可以區分不同的版本來執行
在安裝python3時不要勾選新增安裝目錄到環境變數中,下面這幾個都不要新增到環境變數的path中
C:\Python38
C:\Python38\Scripts
同時不要把這幾個目錄新增到環境變數的path中
C:\Users\zhaoqingqing01\AppData\Local\Programs\Python\Python38\
C:\Users\zhaoqingqing01\AppData\Local\Programs\Python\Python38\Scripts\
在py指令碼的第一行指定python的版本,記住要雙擊執行python指令碼,而不要通過在cmd中呼叫 python xx.py來執行,因為python3沒有新增到環境變數,在cmd中會以python2來執行
不要修改改python3目錄下的python.exe的名字,否則指令碼中指定的python3版本會找不到python.exe
加上這行之後對於只安裝python3的環境也是不會出錯的。
參考資料:python2 和 python 3和多版本如何共存_KM (netease.com)
在安裝python3.8.10時會有一個選項py launcher,這個py launcher是什麼呢?install global "py" launcher to make it easier to start python
這個py.exe程式安裝到了C:\Windows\py.exe
注意:只有python3才有py.exe
py -2 xxx.py
, 還可以py -3.5 xxx.py
範例:
C:\Windows\System32>py -3
Python 3.8.10 (tags/v3.8.10:3d8993a, May 3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
C:\Users\zhaoqingqing01>py -2
Python 2.7.18 (v2.7.18:8d21aa21f2, Apr 20 2020, 13:19:08) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
安裝目錄下這三個pip的MD5都是一樣的,說明是三個相同的檔案
正確的方法為py2或py3單獨安裝庫,參考文章:《為不同版本python安裝pip的正確做法 - 趙青青 - 部落格園 (cnblogs.com)》
py -2 -m pip install XXXX
py -3 -m pip install XXXX
在我安裝python2 x64版本之後,#! python3 這條指令就失效了,列印出來的sys.version為python2 x64
測試程式碼:
#! python3
# coding=utf-8
import sys
import os
print(sys.version)
os.system('pause')
#輸出結果:2.7 (r27:82525, Jul 4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)]
然後我把python2 x64的版本解除安裝後,.py檔案的開啟方式就丟失了,所以可以認為是它修改了.py的開啟方式。
把py檔案的開啟方式修改為py.exe後一切都正常了,我是同時安裝了python2和python3,然後檢視py.exe的版本號是3.x
是否需要在C:\Windows\下放python.exe才能正常識別#!python2和#!python3?
這個exe的原始碼如下(編譯為32位元的C程式):
int main(int argc, char *argv[])
{
std::string s = "py ";
for (int i = 1; i < argc; ++i)
{
s += " ";
s += argv[i];
}
printf(s.c_str());
printf("\n");
system(s.c_str());
return 0;
}