[英]how to find list of modules which depend upon a specific module in python
[英]In Python, how to find out which module imports a specific module
例如,我有一個名為“Abc”的模塊。 在 Abc 中,我需要找出哪個模塊導入了“Abc”。 如果另一個名為“Egf”的模塊導入“Abc”,是否可以在“Abc”內打印出“Egf”? 如果有怎么辦?
我知道一個名為https://github.com/thebjorn/pydeps/blob/master/pydeps/depgraph.py的庫。 它可以通過讀取 pyc 文件來構建圖形,但這不是我想要的。
免責聲明:這可能不是一個好主意,而且我對內部結構了解不多,所以我不能保證它不會破壞任何東西或在所有情況下都有效。
Def
和Ghi
都包含import Abc
,則Abc
中的代碼將只執行一次。
import Abc
評估為builtins.__import__("Abc", ...)
,因此我們可以覆蓋 function 以檢查要導入的模塊是否為Abc
並采取相應措施。inspect.stack()
中看到 import 語句,但只提供了 import 語句的文件名,而不是模塊。 所以如果Def.py
調用import Abc
,我們得到Def.py
的絕對路徑,但不知道它是否真的是子模塊Jkl.Def
。
Def
。Def
只是一個子模塊,您可以嘗試這種方法來獲取實際的模塊。
/home/testuser/modules/module1/Def.py
實際模塊為module1.Def
__import__("Def")
。 如果有效, Def
很可能是導入模塊(或者搜索路徑中存在另一個模塊Def
...)__import__("module1.Def")
。 這應該會成功,因此我們可以假設導入模塊是module1.Def
。import builtins
from builtins import __import__ as builtin_import
import inspect
import os
def my_import(*args):
"""This function is intended to globally override builtins.__import__"""
module_to_import = args[0]
if module_to_import == "Abc":
# for indirect imports we need to find the actual import statement in the stack
for stackframe in inspect.stack():
if stackframe.code_context is None:
continue
code = stackframe.code_context[0]
if code.startswith(("import Abc", "from Abc")):
# name of importing file
importing_file = stackframe.filename # absolute path
importing_module = os.path.basename(importing_file).split(".")[0]
print("Imported Abc from module", importing_module)
break
else:
# This should not happen...
print("Abc was imported but I didn't find the import statement in the stack")
# perform the actual import
builtin_import(*args)
# globally replace __import__
builtins.__import__ = my_import
# the first import does not use the patched __import__, so we need to do it manually
__import__("Abc")
print("I am Abc")
import Abc
print("I am Def")
import Abc
print("I am Ghi")
import Abc
import Def
import Ghi
$ python3 main.py
Imported Abc from module main
I am Abc
Imported Abc from module Def
I am Def
Imported Abc from module Ghi
I am Ghi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.