我正在尝试在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, inpydevd.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只是坐在那里"等待连接"
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中,您可以通过以下方式配置调试服务器:
运行 - > 编辑配置:打开"运行/调试配置"对话框
默认值 - >"Python远程调试":是要使用的模板
填写本地主机名和端口,你可能想要'使用路径映射',但更多关于以下所有这些......
"好"
本地主机名:表示服务器的名称- 在我的情况下是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
问题比默认值少,不仅会立即停止,所以你不确定它是否正常工作,而且还试图流式传输到stdin/out,这也可能让你感到悲伤.
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
完成.
实际上,它只是一个注释,但包含一些可能节省数小时的信息.
现在pip install pydevd
在ubuntu和centos 6上为我工作
如果你想真正调试防火墙和东西背后的远程服务器,你可以使用以下技巧:
ssh -R 8081:localhost:8081 user@remote-server.com
这允许远程代码连接到侦听localhost:8081的计算机
如果远程调试器不想启动,说它找不到套接字端口,请检查防火墙规则.请注意,带有"127.0.0.1"的规则与"localhost"不同.