Python中的调试器冻结了自己的内置模块

时间:2019-02-20 11:44:44

标签: python debugging python-module python-idle

我认为此问题已在此处解决:Python spyder debug freezes with circular importing

但是我没有找到解决方案。

首次在Python中使用调试器。我正在使用IDLE。否则程序可以正常运行,但是当通过调试器运行时,它冻结了,我必须终止该程序。我发现问题是我导入了自己创建的脚本,这些脚本主要用作数据库。所以就是这样。

from ownScript import array

其中array只是列表列表,例如CSV文件。 我发现这是在本地使用数据的非常简单的方法,即使我将来肯定会实现其他方法。

如果我使用“ over”,它会冻结,但是如果我“逐步”执行错误操作,我会得到此提示:

Traceback (most recent call last):
  File "/Users/Adrian/Documents/testModuleCaller.py", line 5, in <module>
    import testModule
  File "<frozen importlib._bootstrap>", line 980, in _find_and_load
  File "<frozen importlib._bootstrap>", line 148, in __enter__
  File "<frozen importlib._bootstrap>", line 174, in _get_module_lock
  File "<frozen importlib._bootstrap>", line 59, in __init__
  File "<frozen importlib._bootstrap>", line 59, in __init__
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/bdb.py", line 88, in trace_dispatch
    return self.dispatch_line(frame)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/bdb.py", line 112, in dispatch_line
    self.user_line(frame)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/idlelib/debugger.py", line 24, in user_line
    self.gui.interaction(message, frame)
AttributeError: '_ModuleLock' object has no attribute 'name'

我知道调用脚本和导入模块是不同的事情。我检查了其他模块,例如re和sys,并尝试复制一些代码以避免该错误,但未成功。我还检查了importlib / _bootstrap.py,但不了解该如何处理_ModuleLock。

如我所见,我要么修改我的“模块”以执行与其他模块相同的工作,要么找到另一种在程序中处理数据的方法,或者使用其他解释器。

编辑: 因此,我进行了一些测试:通过缩短数据库(我要导入的列表),一切正常。因此,我使用原始大小进行了测试,它不会冻结,但是会花费很多时间,因此变得不切实际。就像您尝试打印很长的列表时一样,“ IDLE”会减慢很多速度。

总结:

  • 调试器不会冻结,但是在导入长数据集时非常慢
  • 我发布的错误实际上也来自其他任何模块,例如“ datetime”

有提高速度的解决方案吗?

2 个答案:

答案 0 :(得分:0)

回溯类似于 https://bugs.python.org/issue33065 中的回溯。我相信两者都是由于 idlelib 中的一行代码中的一个错误没有出现在回溯中。我刚刚应用了一个修复程序,该修复程序将在 3.8、3.9 和 3.10 的下一个版本中出现。在 https://stackoverflow.com/a/61891185/722804 中修复当前版本的方法。如果问题仍然存在,我想了解更多详情。

答案 1 :(得分:-1)

  

我发现问题是我导入的模块的大小

解决方案非常简单:不要将python模块用作数据库-至少不要在庞大的数据集上使用。

巨大的数据集将永远是PITA来处理的(是的,它们需要很长的时间来加载/传输,是的,它们很容易就吃光了您的所有内存),但这是我们拥有适当的数据库系统的原因(无论是否具有关系)-关系数据库不仅用于存储,而且还设计用于数据处理,并且通常进行了优化。

此外,如果您必须处理庞大的数据集,请准备好重新考虑一些代码,以便它可以使用惰性评估(生成器/惰性迭代器),并行化(多处理,映射/归约,...),在其中进行备忘录化很有道理,等等。