56

我正在尝试在 PyCharm(在 Windows 主机上)和运行我的 django 应用程序的 debian 虚拟主机之间进行调试。说明说安装 egg,添加导入,然后调用命令。我认为这些事情需要在 debian 主机上完成?

好的,那么,我应该将这两行放在哪个文件中?

from pydev import pydevd
pydevd.settrace('not.local', port=21000, stdoutToServer=True, stderrToServer=True)

我尝试将它放入 settings.py 但得到了这种东西......

File "/django/conf/__init__.py", line 87, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
File "/django/utils/importlib.py", line 35, in import_module
    __import__(name)
File "/settings.py", line 10, in <module>
    pydevd.settrace('dan.local', port=21000, stdoutToServer=True, stderrToServer=True)
File "/pycharm-debug.egg/pydev/pydevd.py", line 1079, in settrace
    debugger.connect(host, port)
File "/pycharm-debug.egg/pydev/pydevd.py", line 241, in connect
    s = StartClient(host, port)
File "/pycharm-debug.egg/pydev/pydevd_comm.py", line 362, in StartClient
    sys.exit(1)
SystemExit: 1

虽然 pycharm 只是坐在那里“等待连接”

4

3 回答 3

121

PyCharm(或您选择的 ide)充当“服务器”,您的应用程序是“客户端”;所以你首先启动服务器——告诉IDE“调试”——然后运行客户端——这是一些带有settrace语句的代码。当您的 python 代码点击settrace它时,它会连接到服务器 - pycharm - 并开始向它提供调试数据。

要做到这一点:

1.将库复制pydev到远程机器

所以我不得不将文件复制C:\Program Files\JetBrains\PyCharm 1.5.3\pycharm-debug.egg到我的linux机器上。我把它放在/home/john/api-dependancies/pycharm-debug.egg

2.将鸡蛋放入PYTHONPATH

希望您明白除非 python 可以找到它,否则您将无法使用鸡蛋。我想大多数人都使用easy_install,但在我的例子中,我明确地添加了它:

   import sys
   sys.path.append('/home/john/app-dependancies/pycharm-debug.egg')

这只是必要的,因为我仍然没有成功安装鸡蛋。这是我的解决方法。

3.设置调试服务器配置

在 PyCharm 中,您可以通过以下方式配置调试服务器:

  • 运行->编辑配置:打开“运行/调试配置”对话框
  • Defaults -> "Python Remote Debug": 是要使用的模板
  • 填写本地主机名和端口,您可能想要“使用路径映射”,但更多内容如下...
  • “好的”

    本地主机名:表示服务器的名称——在我的例子中是 windows 主机——或者实际上是 windows 主机的 IP 地址,因为我的远程机器不知道主机名。所以虚拟(远程)机器必须能够到达主机。 ping并且netstat对此有好处。

    端口:可以是您喜欢的任何空置的非特权端口。例如:21000不太可能被使用。

    现在不要担心路径映射。

4.启动调试服务器

  • 运行->调试:启动调试服务器 - 选择您刚刚创建的配置。

将出现调试控制台选项卡,您应该得到

 Starting debug server at port 21000

在控制台中,这意味着 ide 调试服务器正在等待您的代码打开与它的连接。

5.插入代码

这在单元测试中有效:

from django.test import TestCase
class APITestCase(TestCase):
    def test_remote_debug(self):
        import sys
        sys.path.append('/home/john/dependancies/pycharm-debug.egg')
        from pydev import pydevd
        pydevd.settrace('192.168.33.1', port=21000, suspend=False)

        print "foo"

在 django web 应用程序中,放置它的位置有点挑剔 - 似乎只有在完成其他所有操作后才能工作:

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

    sys.path.append('/vagrant/pycharm-debug.egg')
    import pydevd
    pydevd.settrace('192.168.33.1', port=21000, suspend=False)

同样,IP 地址是您运行 Pycharm 的地方;您应该能够从运行您的代码/网站的框中 ping 该 IP 地址。端口是你的选择,只要确保你告诉 pycharm 监听同一个端口。而且我发现suspend=False比默认设置的问题更少,不仅立即停止,因此您不确定它是否正常工作,而且还尝试流式传输到标准输入/输出,这也可能让您感到悲伤。

6.打开防火墙

默认情况下,Windows 7 防火墙将阻止您的传入连接。在远程主机上使用 netstat,您将能够看到 SYN_SENT 永远不会成为 ESTABLISHED,至少在您为应用程序 'pycharm' 添加一个例外到 Windows 防火墙之前是这样。

OS/X 和 Ubuntu 没有防火墙可打(默认情况下,有人可能会稍后应用)。

7.设置断点并运行代码

毕竟,当一切按计划进行时,您可以设置一个断点 - 在 settrace 运行后的某个地方 - pycharm 控制台将显示

Connected to pydev debugger (build 107.386)

在“调试器”选项卡下,变量堆栈将开始工作,您可以单步执行代码。

8. 映射

映射告诉 pycharm 在哪里可以找到源代码。因此,当调试器说“我正在运行文件 /foo/bar/nang.py 的第 393 行时,Pycharm 可以将该远程绝对路径转换为绝对本地路径......并向您展示源代码。

/Users/john/code/app/    /opt/bestprice/app/
/Users/john/code/master/lib    /opt/bestprice/lib/python2.7/site-packages

完毕。

于 2011-08-15T05:30:40.753 回答
12

实际上,它只是一个注释,但包含一些可以节省数小时的信息。

  1. 现在pip install pydevd 在 ubuntu 和 centos 6 上都为我工作

  2. 如果你想真正调试防火墙和其他东西后面的远程服务器,你可以使用以下技巧:

    ssh -R  8081:localhost:8081 user@remote-server.com
    

    这允许远程代码连接到您正在监听的机器 localhost:8081

  3. 如果远程调试器不想启动,说它找不到套接字端口,请检查您的防火墙规则。请注意,规则 with 与 127.0.0.1不同localhost

于 2016-08-16T15:04:25.000 回答
1

似乎由于某种原因调试器无法使用 PyCharm 连接到您的 Windows 主机。您在 stderr 中没有收到任何其他消息吗?如果还没有,请尝试再运行一次,但使用 sterrToServer=false。这可能表明它无法连接的真正原因。

于 2011-08-10T17:17:48.523 回答