Python中的调试器冻结了自己构建的模块

问题描述 投票:1回答:1

我认为这个问题在这里得到解决:Python spyder debug freezes with circular importing

但我没有得到解决方案。

第一次在Python中使用Debugger。我正在使用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”

任何增加速度的解决方案?

python debugging python-module python-idle
1个回答
-1
投票

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

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

巨大的数据集将始终是一个PITA来处理(是的,它们需要很长时间来加载/转移,是的,它们很容易吃掉你所有的ram),但是我们有一个合理的数据库系统(关系或不关系)的原因 - 而且不仅仅是对于存储,关系数据库也是为数据处理而设计的,通常都是非常优化的。

此外,如果您必须处理大型数据集,请准备重新考虑您的一些代码,以便它可以使用延迟评估(生成器/延迟迭代器),并行化(多处理,映射/缩减,...),在有意义的情况下进行记忆,等等

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