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

2024-04-27 10:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,所有的Python开发人员!

在使用PyDev的Eclipse中,可以在调试时编辑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进行了测试,但没有重新加载。


Tags: 文件代码程序编辑开发人员function事情debugger
3条回答

毕竟,我为我的问题找到了一个有用且可接受的解决方法。它在PyCharm社区版3.1.2中工作,我想它在商业版中也会工作。我使用Python2.7.6、PySide(Qt)在一个中等规模的项目上进行了测试,其中有一个主窗口和20多个小部件、选项卡等等。遵循以下步骤。。。

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

PyCharm Debug View

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

愿原力与你同在,当你尝试这一点时,不要犹豫添加你的经验。

谢谢你。

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语句上设置一个断点,然后在调试器中运行代码。

enter image description here

当它进入调试器时,您会意识到它应该是5而不是55。您可以将第1行更改为test_value=[10,9,8,7,6,5,4,3,2,1]然后选择该行,右键单击并在控制台中选择“执行行”。。。将test_value的值更改为5的数组。现在,第4行的if语句在值5上变为true。这将触发第5行的语法错误。

现在,如果要确保语法正确,可以将第5行更改为print“找到值:”+str(i),选择该行并选择Evaluate Expression。。。从右键上下文菜单。当您单击Evaluate时,结果将显示在对话框中(或者在本例中,因为它是一个打印命令,所以显示在控制台中)

enter image description here

现在我已经解决了这两个问题,我可以在第二个过程中成功地运行代码,而不是在不使用这些技术的情况下可能需要多次传递。如果您在代码中发现一个需要花费一段时间才能设置的bug,那么这些技术真的会有回报。

很明显,这是一个非常做作的例子,但希望这说明了如何使用这两个求值表达式。。。在控制台中执行行。。。在不必每次在代码中发现错误时重新启动应用程序的情况下进行调试。

另外,如果您碰巧使用了Django,那么PyCharm(professional)将在您更改代码时重新启动服务器。因此,如果您在查看网页时发现问题,可以更改代码并切换回该网页,这样,正在运行的应用程序或已调试的应用程序将重新启动,并且在刷新网页时新代码将运行。同样,不是真正的编辑和继续,而是一个相当快速的方式作出改变和测试。

我有商业版的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文件。

相关问题 更多 >