以下实验所处的操作系统环境说明:
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