繁体   English   中英

PyCharm里面有“Edit and Continue”吗? 将代码重新加载到正在运行的程序中,如 Eclipse / PyDev?

[英]Is there "Edit and Continue" in PyCharm? Reload code into running program like in Eclipse / PyDev?

大家好 Python 开发者!

在 Eclipse 中,使用 PyDev 可以在调试时编辑 Python 文件。 保存后,PyDev 调试器会将更新后的代码重新加载到正在运行的程序中,并使用我的新代码。 我怎样才能在 JetBrains PyCharm(使用社区版)中做同样的事情?

Eclipse / 当我这样做时,PyDev 会这样写一个 output:

pydev debugger: Start reloading module: "MyWidget" ... 
pydev debugger: Updated function code: <function close at 0x055F4E70>
pydev debugger: reload finished

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

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

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

在此处输入图片说明

then select the line, right click and choose Execute Line in Console... which will change the value of test_value to be the array with a 5. Now, the if statement on line 4 becomes true on the value 5. This will then trigger the syntax error on line 5.当它闯入调试器时,您意识到它应该是 5 而不是 55。与其重新启动,您可以将第 1 行更改为然后选择该行,右键单击并选择 Execute Line in Console... 这会将 test_value 的值更改为具有 5 的数组。现在,第 4 行的 if 语句在值 5 上变为真。这将触发第 5 行的语法错误。

, select the line and choose Evaluate Expression... from the right button context menu.现在,如果您想确保语法正确,您可以更改第 5 行以 ,选择该行并从右键上下文菜单中选择 Evaluate Expression...。 当您单击 Evaluate 时,结果将显示在对话框中(或者在这种情况下,因为它是一个打印命令,在控制台中)

在此处输入图片说明

现在我已经解决了这两个问题,我可以在第二次通过时成功运行代码,而不是如果我不使用这些技术可能需要多次通过。 如果您在代码中发现一个需要一段时间来设置的错误,这些技术确实会带来回报。

显然,这是一个非常人为的示例,但希望这说明了如何在调试时同时使用 Evaluate Expression... 和 Execute Line...代码。

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

毕竟,我为我的问题找到了一个有用且可接受的解决方法。 它适用于 PyCharm 社区版 3.1.2,我认为它也适用于商业版。 我使用 Python 2.7.6、PySide (Qt) 和一个主窗口和 20 多个小部件、选项卡等对一个中等规模的项目进行了测试。 按着这些次序...

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

PyCharm 调试视图

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

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

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

您可以通过安装 Reloadium 插件来添加热重载功能。 https://plugins.jetbrains.com/plugin/18509-reloadium

使用示例 (gif)

它也可以在没有 pycharm 的情况下使用。更多详细信息: https://github.com/reloadware/reloadium

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM