class LastFinder:
def find_spec(self, modulename, path=None, target=None):
imported.remove(modulename)
print(
"\nMissing module! ",
f"Tried to import: {modulename}\n",
"Last few last imports:\n\t",
"\n\t ".join(imported[-10:]),
)
could_not_be_imported.append(modulename)
然后,它将打印每个丢失的模块,以及最近几个成功导入的模块和您试图导入的模块的列表。例如:
Missing module! Tried to import: bottleneck
Last few last imports:
pandas.core.ops.common
pandas.core.ops.docstrings
pandas.core.ops.mask_ops
pandas.core.ops.methods
pandas.core.missing
pandas.core.array_algos.quantile
pandas.core.sorting
pandas.core.arrays.boolean
pandas.core.arrays.masked
pandas.core.nanops
3条答案
按热度按时间h5qlskok1#
用
-v
启动python解释器:然后只对旧模块执行grep。
m2xkgtsf2#
编辑foo.bar模块,添加以下代码:
当foo.bar被导入时,程序将在pdb模式下停止在pdb.set_trace()处,在那里您可以调试您的代码。例如,您可以使用“w”命令打印完整的调用堆栈。
k10s72fa3#
我将首先介绍一般的解决方案,然后展示如何将其调整为适合于这个特定的用例。
通用溶液
现在有更简单的方法来调试这些东西,利用python导入系统的新功能。基本上只需添加你自己的模块查找器(MetaPathFinder)到**
sys.meta_path
**。下面是一个导入pandas
的脚本示例,列出了imported
中所有成功的导入和could_not_be_imported
中所有不成功的导入:包含成功导入的列表为**
imported
**:和**
could_not_be_imported
**:注:两个列表中可能存在重复项,所有模块均按导入顺序列出。请根据需要进行修改。
特定用例:查找错误导入
将
LastFinder
修改为:然后,它将打印每个丢失的模块,以及最近几个成功导入的模块和您试图导入的模块的列表。例如:
在这种情况下,这意味着
pandas.core.nanops
是不成功导入之前的最后一个成功导入。因此,从pandas.core.nanops.__file__
检查中断导入的位置将非常容易。(在文件中查找"bottleneck"
)。在我的示例中,我发现:这是如何工作的?
python导入系统遍历
sys.meta_path
来寻找一个spec finder,这个spec finder有find_spec
方法返回None
以外的东西,如果返回了None
,那么sys.meta_path
中的下一个finder将被用于导入。