PyCharm中有“编辑并继续”吗?将代码重新加载到Eclipse / PyDev中的运行程序中?

问题描述 投票:45回答:3

嗨所有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

我搜索了设置和网页,但找不到任何提示。任何想法都很高兴。谢谢。

编辑:我发现在Eclipse / PyDev中必须处于调试模式才能使用此功能。我在PyCharm中测试过,但没有重新加载。

python pycharm
3个回答
23
投票

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行以打印“找到值:”+ str(i),选择该行并从右键上下文菜单中选择“评估表达式...”。单击“评估”时,结果将显示在对话框中(或者在这种情况下,因为它是打印命令,在控制台中)

现在我已经修复了这两个问题,我可以在第二次传递时成功运行代码,而不是可能在我不使用这些技术时多次传递。如果您在代码中发现了需要一段时间才能设置的错误,这些技术真的会得到回报。

显然,这是一个非常人为的例子,但希望这能说明如何在调试时同时使用Evaluate Expression ...和Execute Line ...而不必在每次发现错误时重新启动应用程序。码。

此外,如果您正在使用Django,如果您对代码进行更改,PyCharm(专业)将重新启动服务器。因此,如果您正在查看您的网页并发现问题,您可以更改代码并切换回网页,就像您一样,正在运行的应用程序或已调试的应用程序将重新启动并且新代码刷新页面时将运行。同样,不是真正的编辑和继续,而是一种非常快速的方式来进行更改和测试。


19
投票

毕竟我为我的问题找到了一个有用且可接受的解决方法。它适用于PyCharm Community Edition 3.1.2,我认为它也适用于商业版。我在一个中等规模的项目中使用Python 2.7.6,PySide(Qt)测试了一个主窗口和20多个小部件,标签,等等。跟着这些步骤...

  1. 在pycharm上工作python项目:-)
  2. 在调试模式下执行代码(到目前为止没有尝试过Release)
  3. 在程序生命周期中导入的模块中编辑一些代码
  4. 让你的程序暂停。要实现这一点,您可以单击PyCharms Debug视图中的“Pause”按钮,然后单击应用程序主窗口中需要执行某些操作的任何位置(例如,在选项卡标题上)。如果您有一个很长的正在运行的任务而没有用户界面,那么您可以在程序经常出现的位置放置一个断点。
  5. 在“调试”视图中,切换到“控制台”选项卡。左侧的Show命令行上有一个按钮。点击这个。
  6. 在控制台中,如果此调用失败,请键入reload(MyModifiedModule),写入import MyModifiedModule并重试。
  7. 点击PyCharm中的简历。
  8. 尝试修复的代码。

这有一些限制......它不会修复主方法或主窗口中的更改,因为它不会再次创建。在我的测试中,我无法从Qt重新加载小部件。但它适用于数据容器或工作者等类。

当你尝试这个时,力量可以和你在一起,并且毫不犹豫地添加你的经验。

谢谢。


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文件。

© www.soinside.com 2019 - 2024. All rights reserved.