以下實驗所處的操作系統環境說明:
OS | 版本 |
---|---|
MacOS | Monterey 12.1 |
VSCode | October 2023 (version 1.84.2) |
一、背景
在 VSCode 中寫好 Python 腳本后,如果要運行起來,可以怎么做呢?
一般有以下幾種方式:
1、直接在 VSCode 中導航至需要運行的 Python 腳本下,運行該腳本:
- 方法 1:
點擊左上角處運行按鈕(三角箭頭圖標方向朝右);
- 方法 2:
2、在終端(如 Terminal)中運行。
可以方便的找到其存儲路徑,并打開 Terminal 等軟件將其運行起來。
python3 test_pass_params.py
二、問題
其中第 1種方式,在 Python 腳本不傳參時還可以,倘若腳本需要外部傳參
,如:
- KV 型參數:
python3 test_pass_params.py -d db_ecommerce -t ads_trade_stats
- 僅V型參數:
python3 test_pass_params.py ${pamam-1} ${pamam-2} ...
則行不通了。
那么如果想在VSCode中運行Python腳本文件時進行傳參,又該如何實現呢?
三、解決方案
嘗試方案1(Test Fail):
選擇VSCode中左側豎排第四個 Debug 按鈕,如果是首次在軟件中運行 Python 程序,則在運行和調試單元框里很可能看到的提示是如下這樣的。
我根據提示, 依次點擊超鏈接 1打開待運行 Python 腳本,之后點擊超鏈接 2打開其所在的文件夾。第3 步在很多PC 上會顯示“創建一個launch.json文件”的提示,很可惜在我的 PC 上json 字符所在位置不僅不是超鏈接,而且顯示的是翻譯過來的“啟動.json”字符。
我隨后在 Python 腳本所在的目錄中創建了這個 launch.json,并附上如下內容:
launch.json 代碼清單:
{"window.zoomLevel": 1,"launch": {"configurations": [{"name": "${workspace}/main.py", #調試列表里顯示的名字,隨意,建議寫當前調試的文件名"type": "python", #語言類型,默認是 Python"request": "launch", #應答類型, 默認即可"python": "/Library/Frameworks/Python.framework/Versions/3.9/bin/python3", #Python 可執行文件所在的位置"args": ["-d", "db_ecommerce", "-t", "ads_trade_stats"], #執行腳本的附加參數,默認生成是沒有的"program": "${file}", #變量,自動取當前光標所在的文件"console": "integratedTerminal", #顯示控制臺,默認用 VScode 自帶的,也可以用系統的"justMyCode": true, #true 只調試當前 py 文件,默認值; false 也調試引用的模塊"env": {"PYTHONPATH": "/Library/Frameworks/Python.framework/Versions/3.9/lib/"} #Python環境變量}]}
}
操作完畢后,通過如下方式運行該Python 腳本文件:
①、VSCode右上角點擊“運行”圖標
選擇:
- 在專用終端中運行 Python 文件
- 調試 Python 文件
②、在菜單“運行”選項中操作
選擇: - 啟動調試
- 以非調試模式運行
這 2 種方式,均沒有獲取到傳入的參數,測試以失敗告終。
經測試,將 launch.json更名為啟動.json,同樣失敗。
嘗試方案2(Test Succ):
選擇菜單“運行” --> “添加配置”:
選擇之后,在新生成的 settings.json 文件的生成模板中卻不到 Python 相關的配置選項,沒關系, 將上述 launch.json 中的文本內容,復制到這里即可。
通過這種方式生成的 settings.json 文件在我 PC 上的位置為:
/Users/xxxx/Library/Application Support/Code/User/settings.json
settings.json 代碼清單:
{"window.zoomLevel": 1,"launch": {"configurations": [{"name": "${workspace}/main.py","type": "python","request": "launch","python": "/Library/Frameworks/Python.framework/Versions/3.9/bin/python3","args": ["-d", "db_ecommerce", "-t", "ads_trade_stats"],"program": "${file}","console": "integratedTerminal","env": {"PYTHONPATH": "/Library/Frameworks/Python.framework/Versions/3.9/lib/"}}]}
}
配置后,記得保存。
之后再次按照如下這種方式運行該 Python 腳本,即可正確獲取到請求入參。
- “嘗試方案1(Test Fail)”–> “②、在菜單“運行”選項中操作”
注意:
經測試,如下方式不會引用到settings.json腳本中配置的python 請求入參配置參數(即 “args” 中內容)。
- “嘗試方案1(Test Fail)”–> “①、VSCode右上角點擊“運行”圖標”
調試時的打印語句,也正常輸出了:
# xxxx @ XXXXdeMacBook-Pro in ~/bin [11:28:39]
$ cd /Users/xxxx/bin ; /usr/bin/env /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/xxxx/.vscode/extensions/ms-python.python-2023.20.0/pythonFiles/lib/python/debugpy/adapter/../../debugpy/launcher 59555 -- /Users/xxxx/bin/test_pass_params.py -d db_ecommerce -t ads_trade_stats
>>>>target_database = db_ecommerce, target_table = ads_trade_stats
>>>> <mysql.connector.connection.MySQLConnection object at 0x10489f250>
>>>>fetchall = [('dt', 'date'), ('recent_days', 'bigint'), ('order_total_amount', 'decimal'), ('order_count', 'bigint'), ('order_user_count', 'bigint'), ('order_refund_count', 'bigint'), ('order_refund_user_count', 'bigint')]
>>>>list(iterator) = ['dt', 'recent_days', 'order_total_amount', 'order_count', 'order_user_count', 'order_refund_count', 'order_refund_user_count']
一些注意事項:
- setting.json中“args”請求參數如果這樣配置:
"args": ["-d db_ecommerce", "-t ads_trade_stats"]
在運行時,也可以獲取到參數,不過每一個參數前都會添加一個空格,如“ db_ecommerce”、“ ads_trade_stats”.
故推薦“args”中的 k、v 都使用"" 進行包裹,詳見setting.json全局配置腳本中的配置。
參考文獻:
- Python debugging in VS Code