如何使用 VSCode 调试器调试 Python console_script 命令行应用程序?
How can I debug Python console_script command line apps with the VSCode debugger?
我有一个 Python 包 package_name
,它提供了一个命令行应用程序 command-line-app-name
作为 console_script
:
setup.py
:
setup(
...
entry_points={"console_scripts": ["command-line-app-name=package_name.cli:main"]},
...
)
virtualenv 位于 <project>/.venv
并由 pipenv
管理。 pipenv
托管 venvs 应该支持 VSCode 调试集成。我创建了一个调试器配置 launch.json
文件,将 Python 路径设置为 venv (pythonPath
):
{
// 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: command-line-app-name",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"program": "command-line-app-name",
"linux": {
"pythonPath": "${workspaceFolder}/.venv/bin/python",
"args": ["-r", "/home/florian/gitlab/package_name/data/Test_MRM.d"]
},
"windows": {
"pythonPath": "${workspaceFolder}/.venv/Scripts/python.exe",
"args": ["-r", "D:\MassHunter\Data\demo_0000.d"],
},
"console": "integratedTerminal"
}
]
}
Windows 和 Linux 特定的 venv python 可执行文件和命令行参数应该不会产生影响。如果我 运行 我得到的调试器:FileNotFoundError: [Errno 2] No such file or directory: '/home/florian/gitlab/package-name/command-line-app-name'
。似乎我以某种方式误解了文档。我试图寻求帮助 w.r.t。 vscode-python as well as debugpy 没有成功。如何调试控制台脚本命令行应用程序(而不是包模块)?
console_scripts
无法调试out-of-the-box。解决方案是直接调用入口点函数 ("program": "${workspaceRoot}/package_name/cli.py",
)。这就需要在相应的模块中添加if __name__ == '__main__':
成语(这里是:cli.py
)。在我的例子中,使用的命令行参数解析器是 click
。然而,pseudo-code 应该与其他命令行解析器库非常相似。
package_name/cli.py
:
@click.command()
@click.option(...)
def main(<args>, <kwargs>):
...
if __name__ == '__main__':
main() # pylint: disable=no-value-for-parameter
.vscode/launch.json
:
{
// 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: command-line-app-name",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"program": "${workspaceRoot}/package_name/cli.py",
"linux": {
"pythonPath": "${workspaceFolder}/.venv/bin/python",
"args": ["-r", "/home/florian/gitlab/package_name/data/Test_MRM.d"]
},
"windows": {
"pythonPath": "${workspaceFolder}/.venv/Scripts/python.exe",
"args": ["-r", "D:\MassHunter\Data\demo_0000.d"],
},
"console": "integratedTerminal"
}
]
}
注意:用于管理 venv 的工具有所不同。如果使用 pipenv
管理 venv,此解决方案确实有效。如果使用 poetry
.
管理 venv,则该解决方案不起作用
这里有一个 launch.json
可以帮助我调试 mkdocs 插件:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Module",
"type": "python",
"request": "launch",
"console": "integratedTerminal",
"module": "mkdocs",
"args": ["serve"]
}
]
}
mkdocs 提供了 mkdocs
入口点,它接受多个参数,例如 build
和 serve
。 launch.json
允许我在 mkdocs 插件 python 文件中设置一个断点,并在 运行 mkdocs build/serve 进程之后停在该断点处。
我有一个 Python 包 package_name
,它提供了一个命令行应用程序 command-line-app-name
作为 console_script
:
setup.py
:
setup(
...
entry_points={"console_scripts": ["command-line-app-name=package_name.cli:main"]},
...
)
virtualenv 位于 <project>/.venv
并由 pipenv
管理。 pipenv
托管 venvs 应该支持 VSCode 调试集成。我创建了一个调试器配置 launch.json
文件,将 Python 路径设置为 venv (pythonPath
):
{
// 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: command-line-app-name",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"program": "command-line-app-name",
"linux": {
"pythonPath": "${workspaceFolder}/.venv/bin/python",
"args": ["-r", "/home/florian/gitlab/package_name/data/Test_MRM.d"]
},
"windows": {
"pythonPath": "${workspaceFolder}/.venv/Scripts/python.exe",
"args": ["-r", "D:\MassHunter\Data\demo_0000.d"],
},
"console": "integratedTerminal"
}
]
}
Windows 和 Linux 特定的 venv python 可执行文件和命令行参数应该不会产生影响。如果我 运行 我得到的调试器:FileNotFoundError: [Errno 2] No such file or directory: '/home/florian/gitlab/package-name/command-line-app-name'
。似乎我以某种方式误解了文档。我试图寻求帮助 w.r.t。 vscode-python as well as debugpy 没有成功。如何调试控制台脚本命令行应用程序(而不是包模块)?
console_scripts
无法调试out-of-the-box。解决方案是直接调用入口点函数 ("program": "${workspaceRoot}/package_name/cli.py",
)。这就需要在相应的模块中添加if __name__ == '__main__':
成语(这里是:cli.py
)。在我的例子中,使用的命令行参数解析器是 click
。然而,pseudo-code 应该与其他命令行解析器库非常相似。
package_name/cli.py
:
@click.command()
@click.option(...)
def main(<args>, <kwargs>):
...
if __name__ == '__main__':
main() # pylint: disable=no-value-for-parameter
.vscode/launch.json
:
{
// 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: command-line-app-name",
"type": "python",
"request": "launch",
"stopOnEntry": false,
"program": "${workspaceRoot}/package_name/cli.py",
"linux": {
"pythonPath": "${workspaceFolder}/.venv/bin/python",
"args": ["-r", "/home/florian/gitlab/package_name/data/Test_MRM.d"]
},
"windows": {
"pythonPath": "${workspaceFolder}/.venv/Scripts/python.exe",
"args": ["-r", "D:\MassHunter\Data\demo_0000.d"],
},
"console": "integratedTerminal"
}
]
}
注意:用于管理 venv 的工具有所不同。如果使用 pipenv
管理 venv,此解决方案确实有效。如果使用 poetry
.
这里有一个 launch.json
可以帮助我调试 mkdocs 插件:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Module",
"type": "python",
"request": "launch",
"console": "integratedTerminal",
"module": "mkdocs",
"args": ["serve"]
}
]
}
mkdocs 提供了 mkdocs
入口点,它接受多个参数,例如 build
和 serve
。 launch.json
允许我在 mkdocs 插件 python 文件中设置一个断点,并在 运行 mkdocs build/serve 进程之后停在该断点处。