PyCharm远程调试 - 连接成功但无法开始调试
基础知识:
- 我有一个django项目,运行得很好(无论是在本地还是在远程服务器上)。
我在本地使用“远程调试”配置启动pycharm,一切看起来都正常。
Starting debug server at port 4000 Use the following code to connect to the debugger: import pydevd pydevd.settrace('<my local machines public ip addr>', port=4000, suspend=False) Waiting for connection...
在远程服务器上,我在
__init__.py
中放入了适当的pycharm-debug.egg调用(不过我也试过把它放在代码的其他地方)。我这样启动远程服务器:
python manage.py runserver <远程域名>:8000
,然后在本地的pycharm IDE/调试器中看到:"Connected to pydev debugger (build 133.1347)"
之后,事情就停在那里……我没有得到任何关于执行进度的反馈,也无法在pycharm IDE中“启动/继续/运行”任何东西。
在远程服务器上,如果我按
<ctrl-c>
,我看到:File "/<path here>/pycharm-debug.egg/pydevd.py", line 1256, in settrace File "/<path here>/pycharm-debug.egg/pydevd.py", line 1305, in _locked_settrace
我猜一切连接得都很好,但我看不到启动一切运行的方法。我设置了“suspend=False”,所以我本来期待它能启动。当我尝试访问远程服务器的页面时,我得到“未连接”的提示,所以显然网络服务器还没有运行(如果我用curl http://<远程服务器域名>:8000
,我得到curl: (7) Failed connect to <远程服务器域名>:8000; Connection refused
)。如果没有远程调试,这在我的本地开发机器或远程服务器上运行得都很好。
我哪里做错了呢? :) 谢谢!
详细信息:
在运行我想调试的代码/进程的远程服务器的主
__init__.py
中,我有:import os import sys BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR + '/pycharm-debug.egg') import pydevd pydevd.settrace('<my local machines public ip addr>', port=4000, suspend=False)
本地的pycharm IDE显示这个:
Starting debug server at port 4000 Use the following code to connect to the debugger: import pydevd pydevd.settrace('localhost', port=4000, suspend=False) (tried with <public ip addr> for this, too. Waiting for connection... ---- and then, after I start the remote server process: ---- Connected to pydev debugger (build 133.1347)
其他说明:
- 我在远程服务器上尝试过有和没有virtualenv的情况。
- 我在一个普通的Comcast电缆调制解调器路由器后面运行本地的pycharm IDE,并且为4000端口开启了端口转发(我测试过一个节点服务器连接到4000端口,当我从远程服务器用wget访问它时,运行得很好)。
我不知道该如何“推动”任何东西来让它们运行并让我开始调试。
谢谢你的帮助。
4 个回答
我需要关闭自动重载功能来解决这个问题:
./manage.py runserver --noreload
对我来说,去掉 suspend=False
这个参数就解决了问题。
文档上说 @param suspend: 是否在这个函数被调用时立即模拟一个断点。
如果你把这个参数留着,程序会连接上,但不会考虑这个断点。你基本上应该使用另一个 pydevd.settrace('ip.addr')
-> 注意没有 suspend
。
我也遇到过同样的问题,后来通过在“查看断点”窗口里关闭所有的Python异常断点来“解决”了这个问题。
为了帮助未来的搜索者……我成功地实现了远程调试,但不是通过这种方法。我刚在pycharm论坛上回答了一个类似的问题,所以想把我用的有效方法更新到这个问题中。
- 首先,去“PyCharm/Preferences/Project Interpreter”。
- 在对话框的顶部,你会看到一个选项,可以选择使用哪个Python解释器。旁边有一个齿轮图标。如果你点击这个齿轮图标,会看到一个“添加远程”的选项……你需要提供SSH的凭证(或者SSH密钥的路径)和远程服务器上Python解释器的安装路径(比如,
/usr/local/bin/python
)。 - 另外,我的“pycharm helpers路径”是(
/home/<username>/.pycharm_helpers
— 我不记得这个是自动创建的还是手动的)。 接下来,去“Run / Edit Configurations...”并添加一个“Django Server”(在对话框左上角有个加号)。
- 选择你新添加的远程Python解释器作为使用的解释器(它应该会出现在下拉列表中)。
- 在“env vars”部分,我需要指定我的主应用设置文件(比如,
DJANGO_SETTINGS_MODULE = <app>/settings.py
)。为了我的需求,我还需要设置HTTPS=1
。 - 将工作目录设置为你在远程服务器上Django项目所在的位置(比如,
/home/<username>/<xyz>/<appdir>
)。 设置本地目录到远程目录的路径映射(比如,
/Users/JohnQ/<xyz>/<appdir>=/home/<username>/<xyz>/<appdir>
)。因为我需要其他第三方服务器(比如FB等)能够通过HTTPS访问这个服务器,所以我在远程服务器上使用了“stunnel”——设置起来非常简单。
此外,设置部署确认也是个好主意,这样你可以右键点击上传文件的新版本(在“Tools / Deployment / Configurations...”下)。
- 创建一个新的配置,在连接部分只需使用SSH凭证或密钥路径。
- 在映射标签中,路径和你为远程服务器设置的路径映射是一样的。
- 对我来说,“服务器上的Web路径”就是“
/
”。创建后,你应该可以右键点击任何文件/目录并选择“上传到...”。注意,对于初次上传,我只是用scp把一个tar.gz文件上传到服务器上以节省时间,之后在调试期间的更改我才通过部署配置上传。
我已经愉快地使用这个方法进行远程调试大约4个月了,所以它运行得很好。