1. 程式人生 > 其它 >PYTHONPATH在vscode和pycahrm的區別?為什麼有的程式碼在vscode匯入報錯,pycahrm正常?

PYTHONPATH在vscode和pycahrm的區別?為什麼有的程式碼在vscode匯入報錯,pycahrm正常?

1.pycahrm執行程式碼

如果深層級資料夾中的py檔案匯入其他專案中的其他模組,

pycahrm將一個資料夾以專案方式開啟,那麼自動會把這個資料夾當做專案根目錄,所以import 不會報錯,如圖

如果深層級內層資料夾的py檔案匯入其他資料夾的模組,能匯入成功,是因為pycharm自動把專案根目錄加到PYTHONPATH能。因為你print(sys.path)就可以發現第0個當前指令碼的所在資料夾路徑,第1個是專案的根目錄。

主要是pycharm預設自動幫我們把專案根目錄新增到了PYTHONPATH,如圖中的兩個勾選項,如果去掉了就會和vscode一樣import報錯了。

2.vscode執行程式碼

使用vscode怎麼辦做到這pycahrm自動設定PYTHONPATH這一點呢。

在專案根目錄下 的 .vscode資料夾建立launch.json(這個檔案也可以在vscode介面自動生成建立)

在launch.json中寫上如下內容,主要是 PYTHONPATH那一行指定為你專案的根目錄,本人建議直接寫死為專案的絕對路徑,反正你又不是每天把專案程式碼資料夾在磁碟上整天移來移去得,寫死是最簡單穩固的。

網上別的人可能叫你這麼寫 ,

"env": {"PYTHONPATH":"${workspaceFolder};${env:PYTHONPATH}"},這樣還行看似比較萬能通用,但如果你vscode一個工作區開啟多個python專案,那麼就會別的python專案讀取的 sys.path[1] 不是自身專案的根目錄,而是第一個python專案的根目錄,造成混亂,照樣import報錯。所以本人推薦不要寫 ${workspaceFolder} 那麼魔幻,在每個python專案下的 .vscode/launch.json 直接寫死你每個python專案自身的根目錄是最好的。

{ // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [
{ "name": "Python: 當前檔案", "type": "python", "request": "launch",
"program": "${file}", "console": "integratedTerminal", "env": { "PYTHONPATH": "F:/coding2/distributed_framework;${env:PYTHONPATH}" } } ] }

使用ctrl + f5 執行程式碼可以自動先讀取執行launch.json裡面的配置,如果你在程式碼編輯區右鍵點選執行在終端中執行由於不先讀取launch.json的配置,所以仍然報錯,

所以需要ctrl+f5執行(或者點選vscode的頂部的執行按鈕,以非除錯模式執行)。

3. shell、cmd執行程式碼?

首先cd 到專案根目錄,然後linux 上 export PYTHONPATH=./ ,如果是winset PYTHONPATH=./ , 然後可以切換到任意資料夾,執行你需要執行的python xx.py

當然可以不先cd到專案根目錄,那就export PYTHONPATH=專案根目錄的絕對路徑 就行了。

4、為什麼老有笨豬喜歡在很多python指令碼硬編碼 sys.path.insert或者append?

這種人主要是不懂 PYTHONPATH的作用,造成到處手動硬編碼操作sys.path。

你不信去看看任意一個三方包python大神寫的框架或者庫,有誰那麼愚蠢這麼手動操作sys.path的?手動sys.path.insert是一廂情願一意孤行意淫的寫法。

可以這麼說,在控制檯命令列部署執行任何專案,把PYTHONPATH設定為專案根目錄路徑是最合適的,pycahrm預設幫我們這麼做了。你這麼做了,那麼你的程式碼執行邏輯就和pycahrn執行程式碼保持一致了。

反對極端面向過程程式設計思維方式,喜歡面向物件和設計模式的解讀,喜歡對比極端面向過程程式設計和oop程式設計消耗程式碼程式碼行數的區別和原因。致力於使用oop和36種設計模式寫出最高可複用的框架級程式碼和使用最少的程式碼行數完成任務,致力於使用oop和設計模式來使部分程式碼減少90%行,使絕大部分py檔案最低減少50%-80%行的寫法。