gpt4 book ai didi

python - 如何检查为什么要导入 python 模块?

转载 作者:太空宇宙 更新时间:2023-11-03 14:30:07 25 4
gpt4 key购买 nike

我有一个很大的 python 模块库。有时,在导入模块时,我会看到导入了意想不到的模块。为此,我一直在使用 python -v 来查看导入了哪些模块。从联机帮助页:

-v     Print  a  message  each  time a module is initialized, showing the place
(filename or built-in module) from which it is loaded. When given twice,
print a message for each file that is checked for when searching for a
module. Also provides information on module cleanup at exit.

嗯,这不是真的。例如:

import portalmq # directory /home/blahblah/python_modules/portalmq
# /home/blahblah/python_modules/portalmq/__init__.pyc matches /home/blahblah/python_modules/portalmq/__init__.py
import portalmq # precompiled from /home/blahblah/python_modules/portalmq/__init__.pyc

如您所见,-v 标志仅提供有关导入了哪些模块的信息,但没有提供有关哪个导入语句、哪个文件/行触发导入的信息。使用 -vv 不会改变任何东西(显示了一个已尝试模块的列表,但没有说明为什么首先尝试导入)

但我需要确切地知道:哪个导入语句、哪个文件/行触发了这些导入。我怎样才能得到这些信息?

最佳答案

导入钩子(Hook)!只需将此代码添加到您的主脚本入口点,即可在执行 sys.meta_path.append 后跟踪每次导入。

import traceback

class TracingFinder:
def find_module(self, fullname, path=None):
print 'loading module', fullname
traceback.print_stack()

import sys
sys.meta_path.append(TracingFinder())

测试:

def foo():
import test
import this

foo()

输出:

loading module test
File "moo.py", line 15, in <module>
foo()
File "moo.py", line 12, in foo
import test
File "moo.py", line 6, in find_module
traceback.print_stack()
loading module this
File "moo.py", line 15, in <module>
foo()
File "moo.py", line 13, in foo
import this
File "moo.py", line 6, in find_module
traceback.print_stack()

关于python - 如何检查为什么要导入 python 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12813238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com