簡體   English   中英

在 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 文件來構建圖形,但這不是我想要的。

免責聲明:這可能不是一個好主意,而且我對內部結構了解不多,所以我不能保證它不會破壞任何東西或在所有情況下都有效。

  1. 導入只發生一次,因此如果模塊DefGhi都包含import Abc ,則Abc中的代碼將只執行一次。
    • 因此,我們需要全局修改導入的執行方式。
    • import Abc評估為builtins.__import__("Abc", ...) ,因此我們可以覆蓋 function 以檢查要導入的模塊是否為Abc並采取相應措施。
  2. 我們可以在inspect.stack()中看到 import 語句,但只提供了 import 語句的文件名,而不是模塊。 所以如果Def.py調用import Abc ,我們得到Def.py的絕對路徑,但不知道它是否真的是子模塊Jkl.Def
    • 我的回答忽略了這種情況,只是在這種情況下報告Def
    • 如果Def只是一個子模塊,您可以嘗試這種方法來獲取實際的模塊。
      1. 假設絕對路徑為/home/testuser/modules/module1/Def.py實際模塊為module1.Def
      2. 試試__import__("Def") 如果有效, Def很可能是導入模塊(或者搜索路徑中存在另一個模塊Def ...)
      3. 在我們的例子中應該失敗,所以我們現在調用__import__("module1.Def") 這應該會成功,因此我們可以假設導入模塊是module1.Def

abcpy

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM