1. 程式人生 > 實用技巧 >用VScode程式碼除錯Python

用VScode程式碼除錯Python

Python擴充套件支援許多型別的Python應用程式的除錯,包括以下一般功能:

  • 觀看視窗
  • 評估表示式
  • 當地人
  • 引數
  • 擴大孩子
  • 斷點
  • 條件斷點
  • 暫停(進入)正在執行的程式
  • 自定義啟動目錄

要熟悉這些常規功能,請檢視VS Code除錯文章。本文僅討論那些特定於Python的注意事項。

選擇一個配置

要選擇除錯配置,請選擇邊欄中的除錯檢視,然後從下拉列表中選擇一個選項:

在除錯時,狀態列顯示左下角的當前配置,當前的除錯直譯器位於右側。選擇配置會顯示列表,您可以從中選擇不同的配置:

預設情況下,偵錯程式使用與python.pythonPathVS Code其他功能相同的設定。要使用不同的直譯器,請pythonPath

在偵錯程式設定中設定該值。或者,在狀態列上選擇指定的直譯器以選擇不同的直譯器。

注:偵錯程式設定不支援相對路徑,包括依賴主python.pythonPath設定時。要解決此問題,請使用環境變數,或者建立一個變數,例如${workspaceFolder}解析到您的專案資料夾,然後在該路徑中使用該變數,如in"python.pythonPath": "${workspaceFolder}/venv/bin/python"

要檢視所有配置,請launch.json通過選擇配置下拉列表旁邊的齒輪圖示開啟:

下一節將介紹預設或標準的“Python:當前檔案”配置。本文還介紹了除錯特定應用程式型別下的其他配置。

注意:如果您想嘗試新的實驗性偵錯程式,請參閱Issue 538(GitHub)上的說明。

標準配置和選項

標準配置為launch.json

{
    "name": "Python: Current File",
    "type": "python",
    "request": "launch",
    "program": "${file}",
}

以下各節介紹各種設定的自定義配置。

name

提供出現在VS Code下拉列表中的除錯配置的名稱。

type

標識要使用的偵錯程式的型別;將此設定留給pythonPython程式碼。

request

指定開始除錯的模式:

  • launch
    :在中指定的檔案上啟動偵錯程式program
  • attach:將偵錯程式附加到已經執行的程序。有關示例,請參閱遠端除錯。

program

提供python程式入口模組的完全限定路徑。推薦值為${file},它使用編輯器中的活動檔案。但是,對於具有多個檔案的程式,您可以指定程式的啟動檔案。例如:

"program": "/Users/Me/Projects/PokemonGo-Bot/pokemongo_bot/event_handlers/__init__.py",

您還可以依賴工作區根目錄中的相對路徑。例如,如果根是/Users/Me/Projects/PokemonGo-Bot那麼你可以使用以下內容:

"program": "${workspaceFolder}/pokemongo_bot/event_handlers/__init__.py",

pythonPath

指向Python直譯器用於除錯目的。如果未指定,則預設為python.pythonPath設定中標識的直譯器,這相當於使用該值${config:python.pythonPath}。要使用不同的直譯器,請改為指定其路徑。

您可以通過將指定特定於平臺的路徑pythonPath命名的父物件中osxwindows或者linux。例如,PySpark的配置使用以下值:

"osx": {
    "pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit\""
},
"windows": {
    "pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit.cmd\""
},
"linux": {
    "pythonPath": "^\"\\${env:SPARK_HOME}/bin/spark-submit\""
},

args

指定傳遞給Python程式的引數,例如:

"args": [
    "--quiet", "--norepeat"
],

stopOnEntry

設定為true時,在除錯程式的第一行中斷開偵錯程式。如果省略(預設)或設定為false,則偵錯程式將程式執行到第一個斷點。

console

指定如何顯示程式輸出。

顯示輸出的地方
"none" VS程式碼除錯控制檯
"integratedTerminal"(預設) VS程式碼整合終端
"externalTerminal" 獨立控制檯視窗

cwd

指定偵錯程式的當前工作目錄,它是程式碼中使用的任何相對路徑的基礎資料夾。如果省略,預設為${workspaceFolder}(在VS程式碼中開啟的資料夾)。

作為一個例子,說${workspaceFolder}包含一個py_code資料夾包含app.py,和一個data資料夾包含salaries.csv。如果啟動偵錯程式py_code/app.py,則資料檔案的相對路徑根據以下值而變化cwd

CWD資料檔案的相對路徑
省略或${workspaceFolder} data/salaries.csv
${workspaceFolder}/py_code ../data/salaries.csv
${workspaceFolder}/data salaries.csv

debugOptions

一系列可能包含以下內容的附加選項:

選項描述
"RedirectOutput"(預設) 使偵錯程式將程式的所有輸出列印到VS Code除錯輸出視窗中。如果省略此設定,則所有程式輸出不顯示在偵錯程式輸出視窗中。該選項在使用時通常會被省略,"console": "integratedTerminal"或者"console": "externalTerminal"因為不需要在除錯控制檯中複製輸出。
"DebugStdLib" 啟用標準庫函式的除錯。
"Django" 啟用特定於Django Web框架的除錯功能。
"Sudo" 與...一起使用時"console": "externalTerminal",允許除錯需要提升的應用程式。捕獲密碼需要使用外部控制檯。
"Pyramid" 在除錯金字塔應用程式時使用。

env

為除偵錯程式始終繼承的系統環境變數之外的偵錯程式程序設定可選的環境變數。

envFile

包含環境變數定義的檔案的可選路徑。請參閱配置Python環境 - 環境變數定義檔案。

除錯特定的應用程式型別

配置下拉選單為常規應用程式型別提供了各種不同的選項:

組態描述
PySpark 使用PySpark而不是預設直譯器執行程式,使用pythonPath前面在pythonPath選項下顯示的特定於平臺的值。
Python模組 替換program設定"module": "module.name"以除錯特定模組。使用此配置時,請將該值替換為所需的模組名稱。
整合終端/控制檯 "console": "integratedTerminal"選項新增到標準配置。
外部終端/控制檯 "console": "externalTerminal"選項新增到標準配置。
Django的 指定"program": "${workspaceFolder}/manage.py""args": ["runserver", "--noreload", "--nothreading"]新增“Django”和“RedirectOutput”debugOptions。請注意,在除錯時不能自動重新載入Django應用程式。要除錯Django HTML模板,請新增斷點templates
燒瓶 請參閱下面的Flask除錯。
金字塔 刪除program,新增"args": ["${workspaceFolder}/development.ini"]並新增“金字塔”和“重定向輸出”debugOptions
沃森 指定"program": "${workspaceFolder}/console.py""args": ["dev", "runserver", "--noreload=True"]
Scrapy 指定"program": "~/.virtualenvs/scrapy/bin/scrapy",新增"console": "integratedTerminal"選項並新增"args": ["crawl", "specs", "-o", "bikes.json"]
附加(遠端除錯) 請參閱以下遠端除錯。

遠端除錯和Google App Engine還需要具體步驟。有關除錯單元測試(包括nosetest)的詳細資訊,請參閱單元測試。

要除錯需要管理員許可權的應用程式,請在中使用"console": "externalTerminal"幷包含“Sudo”debugOptions

燒瓶除錯

{
    "name": "Flask",
    "type": "python",
    "request": "launch",
    "stopOnEntry": false,
    "pythonPath": "${config:python.pythonPath}",
    "module": "flask",
    "cwd": "${workspaceFolder}",
    "env": {
        "FLASK_APP": "${workspaceFolder}/app.py"
    },
    "args": [
        "run",
        "--no-debugger",
        "--no-reload"
    ]
},

正如你所看到的,這個配置指定"stopOnEntry": false"env": {"FLASK_APP": "${workspaceFolder}/app.py"}"args": ["run", "--no-debugger","--no-reload"]。該"module": "flask"屬性被用來代替program

遠端除錯

遠端除錯允許您在VS程式碼本地執行一個程式,同時在遠端計算機上執行它。在這種情況下,必須在兩臺計算機上都有原始碼。

  1. 在開發和遠端計算機上,安裝ptvsd 3.0.0(3.0.0完全版本- 更高版本尚不支援#514)。

  2. 在兩臺計算機的原始碼中,新增以下行,用適當的密碼替換_my_secret_以驗證遠端除錯,並用合適的IP地址(或)和埠號替換_地址_localhost

    import ptvsd
    ptvsd.enable_attach("my_secret", address = ('0.0.0.0', 3000))
    
    # Enable the line of source code below only if you want the application to wait until the debugger has attached to it
    #ptvsd.wait_for_attach()
    
    
  3. 僅在遠端計算機上,取消註釋上面的最後一行。您希望在開發機器上保留註釋行,以確保兩臺機器上的原始碼與行符合。

  4. 啟動遠端程式。

  5. 選擇附加(遠端除錯)(下面)配置,然後修改remoteRoot為指向該程式的遠端計算機上的位置,並修改hostport以及secret在上面新增的原始碼中的值匹配。

    {
        "name": "Attach (Remote Debug)",
        "type": "python",
        "request": "attach",
        "localRoot": "${workspaceFolder}",
        "remoteRoot": "${workspaceFolder}",
        "port": 3000,
        "secret": "my_secret",
        "host": "localhost"
    }
    
    

通過SSH進行除錯

視窗:

  1. 使用sshd_config或類似命令在遠端計算機上啟用ssh埠轉發。
  2. 建立一個PuTTY SSH隧道:
    1. 閱讀使用PuTTY設定SSH隧道(直到“開啟會話”部分)。
    2. 在“隧道”螢幕上,使用本地模式,源埠(本地計算機上的入口點埠)可能與目標埠(伺服器上的端點)不同。
    3. 目標地址應該是本地主機或127.0.0.1地址(這是遠端SSH伺服器用於建立隧道的地址)。

Linux的:

  1. ssh -L sourceport:localhost:destinationport user@remoteaddress

接下來,驗證您可以在SSH會話中看到提示。然後開啟VS Code並將埠配置為顯示在Tunnels螢幕上的除錯埠。

最後,啟動程式並按照上一節所述附加偵錯程式。

Google App Engine除錯

Google App Engine自己啟動一個應用程式,因此在VS Code偵錯程式中啟動它不是直接可能的。相反,我們需要在應用中使用ptvsd,然後以允許VS Code附加其偵錯程式的模式啟動Google App Engine。

  1. 下載ptvsd並將其檔案解壓縮到工作資料夾中的ptvsd資料夾中。(如果使用不同的資料夾,請修改pydev_startup.py步驟4中建立的檔案中的路徑)。

  2. tasks.json使用以下內容建立一個檔案:

    {
        "version": "2.0.0",
        "tasks": [
            {
                "label": "Launch Google App Engine",
                "command": "python",
                "type": "shell",
                "args": [
                    "/usr/local/google_appengine/dev_appserver.py",
                    "--python_startup_script=${workspaceFolder}/pydev_startup.py",
                    "--automatic_restart=no",
                    "--max_module_instances=default:1",
                    "${workspaceFolder}/app.yaml"
                ]
            }
        ]
    }
    
    
  3. 在Windows和Linux上,將第一項內容替換args為安裝Google App Engine的路徑(上面的原始碼中顯示的路徑適用於MacOS)。

  4. 在您的專案根目錄下建立一個名為pydev_startup.py的檔案,其中包含以下內容,並按照說明修改:

    import sys
    import os
    
    #Assuming that pdvsd is located in the working folder
    sys.path.append(os.getcwd())
    
    import ptvsd
    # Modify the secret and port number as desired; you're debugging locally so the values don't matter.
    # However, be sure the port is not blocked on your computer.
    ptvsd.enable_attach(secret = 'gae', address = ('0.0.0.0', 3000))
    
    #The debug server has started and you can now use VS Code to attach to the application for debugging
    print("Google App Engine has started, ready to attach the debugger")
    
    
  5. launch.json使用Attach(遠端除錯)配置作為模板建立配置。確保祕密和埠值與上面原始碼中的內容匹配。

  6. 新增"preLaunchTask": "python"launch.json

  7. 從命令面板中,執行“執行構建任務”命令。這將開啟任務輸出視窗,您可以在其中看到各種訊息。

  8. 一旦看到訊息“Google App Engine已啟動,準備好連線偵錯程式”,請使用遠端除錯配置啟動VS Code偵錯程式。

  9. 在需要的地方設定斷點,然後啟動瀏覽器以啟動應用程式。

故障排除

偵錯程式可能無法正常工作的原因很多。除錯控制檯經常會顯示具體原因,但有兩個具體原因如下:

  • python可執行檔案的路徑不正確:請檢查pythonPath使用者設定中的值。

  • 觀察視窗中的表示式無效(請參閱下面的示例):清除Watch視窗中的所有表示式並重新啟動偵錯程式。

    Traceback (most recent call last):
      File ".../visualstudio_py_debugger.py", line 1646, in loop
        cmd()
      File ".../visualstudio_py_debugger.py", line 1918, in command_execute_code
        thread.run_on_thread(text, cur_frame, eid, frame_kind, repr_kind)
      File ".../visualstudio_py_debugger.py", line 1246, in run_on_thread
        self.schedule_work(lambda : self.run_locally(text, cur_frame, execution_id, frame_kind, repr_kind))
      File ".../visualstudio_py_debugger.py", line 1238, in schedule_work
        self.unblock()
      File ".../visualstudio_py_debugger.py", line 1234, in unblock
        self._block_lock.release()
    RuntimeError: release unlocked lock
  • 來源:內蒙古SEO