大家都是Python开发人员!
在带有PyDev的Eclipse中,可以在调试时编辑Python文件。在保存时,PyDev调试器会将更新的代码重新加载到正在运行的程序中并使用我的新代码。如何在JetBrains PyCharm(使用Community Edition)中执行相同的操作?
当我这样做时,Eclipse / PyDev会写出这样的输出:
pydev debugger: Start reloading module: "MyWidget" ...
pydev debugger: Updated function code: <function close at 0x055F4E70>
pydev debugger: reload finished
我搜索了设置和网络,但找不到任何提示。任何想法都很高兴。 THX。
编辑:我发现在Eclipse / PyDev中必须处于调试模式才能使用此功能。我在PyCharm中测试过,但没有重新加载。
答案 0 :(得分:21)
PyCharm不支持在社区版或专业版中编辑和继续,但这是我在调试时找到的解决方法。
由于您可以在控制台和/或表达式求值程序中运行任意代码,因此在很多情况下,您可以执行对代码的更改,而无需重新启动应用程序。这与编辑并继续(这是我在Visual Studio中非常喜欢的功能并且应该是Pycharm的一部分)完全不同,但是它有很长的路要走,以避免在更改后从头开始重新启动程序以查看是否新代码按预期工作。
让我举例说明我使用的几种技术:
假设你有以下代码(有几个错别字/错误来说明这些技巧)
test_value = [10,9,8,7,6,55,4,3,2,1]
for i in range(0,10):
if test_value[i] == i:
print "found the value: " + i
如果你运行这段代码,首先它会出错,因为你不能打印字符串加整数但我想匹配5,而不是数组中的55。所以我们走了。
在for语句中设置这样的断点并在调试器中运行代码。
当它进入调试器时,你意识到它应该是5而不是55.你可以将第1行改为 test_value = [10,9,8,7,6,5,4,而不是重新启动。 3,2,1] 然后选择该行,右键单击并选择Console中的Execute Line ...这将把test_value的值更改为带有5的数组。现在,第4行的if语句变为值为5时为true。这将触发第5行的语法错误。
现在,如果您想确保语法正确,可以将第5行更改为 print“找到值:”+ str(i),选择该行并选择“评估表达式”。 。从右键上下文菜单。单击“评估”时,结果将显示在对话框中(或者在这种情况下,因为它是打印命令,在控制台中)
现在我已经修复了这两个问题,我可以在第二次传递时成功运行代码,而不是可能在我不使用这些技术时可能需要多次传递。如果您在代码中发现了一个需要一段时间才能设置的错误,这些技术真的会得到回报。
显然,这是一个非常人为的例子,但希望这能说明如何在调试中同时使用Evaluate Expression ...和Execute Line ...而不必在每次找到时都重新启动应用程序代码中的错误。
此外,如果您正在使用Django,如果您对代码进行更改,PyCharm(专业)将重新启动服务器。因此,如果您正在查看您的网页并发现问题,您可以更改代码并切换回网页,就像您一样,正在运行的应用程序或已调试的应用程序将重新启动并且新代码刷新页面时将运行。同样,不是真正的编辑和继续,而是一种非常快速的方式来进行更改和测试。
答案 1 :(得分:17)
毕竟我找到了一个有用且可接受的解决方法来解决我的问题。它适用于PyCharm Community Edition 3.1.2,我认为它也适用于商业版。我在一个中等规模的项目中使用Python 2.7.6,PySide(Qt)测试了一个主窗口和20多个小部件,标签,等等。请按照以下步骤操作......
对此有一些限制......它不会修复主方法或主窗口中的更改,因为它不会再次创建。在我的测试中,我无法从Qt重新加载小部件。但它适用于数据容器或工作者等类。
当你尝试这个时,力量会和你在一起,并且毫不犹豫地添加你的经验。
谢谢。
答案 2 :(得分:5)
我有PyCharm的商业版本,只是尝试测试一个简单的python脚本。该脚本如下:
for i in range(0,100):
print i
我在调试模式下运行代码并在“print i”语句中放置了一个断点。当调试器在第一次迭代期间停止时,我将代码更改为如下所示:
for i in range(0,100):
print i
print 'hello'
PyCharm没有重新加载/重新编译已更改的脚本。鉴于这个简单的测试,我最好的猜测是PyCharm不会动态重新加载.py文件。