PyCharm中有“编辑并继续”功能吗?像Eclipse/PyDev一样在运行程序中重新加载代码?
大家好,Python开发者们!
在Eclipse配合PyDev的时候,我可以在调试的同时编辑Python文件。当我保存文件时,PyDev调试器会把更新后的代码加载到正在运行的程序里,并使用我新写的代码。我想知道在JetBrains的PyCharm(社区版)里怎么也能做到这一点?
在Eclipse / PyDev中,当我这样做时,会输出类似下面的内容:
pydev debugger: Start reloading module: "MyWidget" ...
pydev debugger: Updated function code: <function close at 0x055F4E70>
pydev debugger: reload finished
我查了设置和网上的信息,但没有找到任何提示。很高兴能听到任何想法。谢谢!
补充:我发现要在Eclipse/PyDev中使用这个功能,必须处于调试模式。我在PyCharm里测试了一下,但没有进行代码重载。
4 个回答
你可以通过安装Reloadium插件来添加热重载功能。点击这里查看插件
这个插件也可以在没有pycharm的情况下使用。更多详细信息可以查看这里:https://github.com/reloadware/reloadium
我有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文件。
PyCharm 无论是社区版还是专业版都不支持边编辑边继续,但我找到了一种在调试时的变通方法。
因为你可以在控制台或表达式评估器中运行任意代码,所以在很多情况下,你可以在不重启应用程序的情况下执行代码的更改。这虽然不完全像 Visual Studio 的边编辑边继续功能(我非常喜欢这个功能,希望 PyCharm 也能有),但它可以大大减少在修改代码后需要从头开始重启程序的麻烦,以查看新代码是否按预期工作。
让我来举几个我使用的技巧:
假设你有以下代码(里面有几个拼写错误/bug来说明这些技巧)
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。与其重启程序,你可以把第一行改成 test_value = [10,9,8,7,6,5,4,3,2,1],然后选择这一行,右键点击选择“在控制台中执行行...”,这样就会把 test_value 的值改成包含 5 的数组。现在,第四行的 if 语句在值为 5 时会变为真。接下来,这会触发第五行的语法错误。
如果你想确保语法正确,可以把第五行改成 print "found the value: " + str(i),选择这一行,然后从右键菜单中选择“评估表达式...”。当你点击评估时,结果会显示在对话框中(或者在这种情况下,由于这是一个打印命令,会显示在控制台中)。
现在我已经修复了这两个问题,我可以在第二次运行代码时成功执行,而不是可能需要多次尝试,如果我不使用这些技巧的话。这些技巧在你发现代码深处的 bug 时特别有用,因为那时设置环境可能需要花费一些时间。
显然,这只是一个非常简单的例子,但希望这能展示你如何在调试时利用“评估表达式...”和“在控制台中执行行...”来避免每次发现代码中的 bug 时都重启应用程序。
另外,如果你正在使用 Django,PyCharm(专业版)在你修改代码时会重新启动服务器。所以如果你在查看网页时发现问题,可以修改代码,然后切换回网页,当你这样做时,正在运行的应用程序或调试的应用程序会重新启动,刷新页面时新代码就会生效。再次强调,这并不是真正的边编辑边继续,但这是一个相对快速的修改和测试方法。
最后,我找到了一种对我问题有用且可行的解决方法。这种方法在 PyCharm Community Edition 3.1.2 中有效,我想商业版也应该可以。我在一个中型项目上测试过,使用的是 Python 2.7.6 和 PySide(Qt),项目里有一个主窗口和20多个小部件、标签等等。按照以下步骤操作...
- 在 PyCharm 中创建一个 Python 项目 :-)
- 在调试模式下运行你的代码(我还没尝试过发布模式)
- 在程序运行期间,编辑你导入的某个模块中的代码
- 让你的程序暂停。要做到这一点,你可以点击 PyCharm 调试视图中的“暂停”按钮,然后在应用程序主窗口中任何需要执行操作的地方点击一下(比如在标签头上)。如果你有一个长时间运行的任务且没有用户界面,可以在程序经常经过的地方设置一个断点。
- 在调试视图中,切换到控制台标签。在左侧有一个显示命令行的按钮,点击它。
- 在控制台中输入reload(MyModifiedModule),如果这个调用失败,就输入import MyModifiedModule再试一次。
- 在 PyCharm 中点击继续。
- 测试你修复过的代码。
这有一些限制... 它无法修复你主方法或主窗口中的更改,因为这些不会被重新创建。在我的测试中,我无法重新加载 Qt 的小部件。但对于像数据容器或工作者这样的类,它是有效的。
祝你好运,试试看,如果有经验也别犹豫分享出来。