python - pserve 在 VSCode python 调试器中启动后立即退出
问题描述
我有一个 python-2.7 env Pyramid 1.4 应用程序,我一直在 OS X 上开发(撰写本文时为 10.14.5)。激活环境后,我可以从命令行启动 pserve 并测试应用程序。我希望能够从 VSCode 中进行调试。我已经使用 Pyramid 设置配置了调试器launch.json
:
{
"name": "Python: Pyramid Application",
"type": "python",
"request": "launch",
"args": [
"${workspaceFolder}/development.ini"
],
"pyramid": true,
"jinja": true
}
每当我从 VSCode (F5) 中启动调试器时,所有预期的命令都会运行并且它们看起来是合法的:
$ source /my/app/path/env/bin/activate
$ cd /my/app/path ; env PYTHONIOENCODING=UTF-8 PYTHONUNBUFFERED=1 /my/app/path/env/bin/python /my/home/.vscode/extensions/ms-python.python-2019.4.12954/pythonFiles/ptvsd_launcher.py --default --client --host localhost --port 63836 /my/app/path/env/lib/python2.7/site-packages/pyramid-1.4-py2.7.egg/pyramid/scripts/pserve.py /my/app/path/development.ini
没有错误,但启动器命令退出并且调试器永远不会激活。pserve没有在后台运行。调试工具栏短暂地出现在编辑器窗口的顶部,但不到一秒钟后就消失了(所以我想有一个简短的调试会话由于某种原因而结束)
我尝试在 development.ini 中更改选项以使用不同的金字塔服务器主服务器
[server:main]
; use = egg:waitress#main
use = egg:pyramid#wsgiref
host = 0.0.0.0
port = 6666
没有不同
VSCode python 页面上的信息很少。
我会很好地将代码添加到我需要调试的文件中(我的后备是pdb
),但我很想利用 VSCode 中很棒的调试器。
请注意,如果我手动(而不是按 F5)输入
cd /my/app/path ; env PYTHONIOENCODING=UTF-8 PYTHONUNBUFFERED=1 /my/app/path/env/bin/python /my/home/.vscode/extensions/ms-python.python-2019.4.12954/pythonFiles/ptvsd_launcher.py --default --client --host localhost --port 63836 /my/app/path/env/lib/python2.7/site-packages/pyramid-1.4-py2.7.egg/pyramid/scripts/pserve.py /my/app/path/development.ini
在终端中 - 我socket.error: [Errno 61] Connection refused
假设因为 VSCode 的调试器已经关闭。
如果我在同一个 VSCode 终端窗口中运行以下命令
/my/app/path/env/lib/python2.7/site-packages/pyramid-1.4-py2.7.egg/pyramid/scripts/pserve.py /my/app/path/development.ini
我的服务器启动正常并服务请求。所以它似乎与 ptvsd 启动器有关。
有任何想法吗?
解决方案
我想出的解决方案(可行)是将我的金字塔设置更改launch.json
为如下所示:
{
"name": "Python: Pyramid Application",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/env/bin/pserve",
"args": [
"${workspaceFolder}/development.ini"
],
// "pyramid": true
// "jinja": true
"debugOptions": [
"RedirectOutput",
]
}
基本上我强制调试器通过手动设置启动 pserve。这行得通,我能够打断点并查看变量值。