是否有可能检测python中模块的导入方式



假设模块foo包含变量bar,线程baz自动更新bar:

from threading import Thread
import sys
bar = 0
class baz(Thread):
  def run(self):
    while True:
      setattr(sys.modules[__name__], 'bar', getattr(sys.modules[__name__], 'bar')+1);
baz().start()
#Note: Globals is intentionally not used instead of getattr and setattr

因为这个线程的更新在__main__中是不可读的(因为当然在__main__中复制了foo中的值),是否有可能找出模块是否被from foo import *import foo导入,并根据结果,在setattr和getattr中自动更改__name__为__main__?本主题的答案给出了一种通过__main__中的代码检测它的方法,但我希望模块自己检测它。这有可能吗?

No。一个原因是一个模块可以从许多地方被导入多次。可以在一个地方导入import foo,在另一个地方导入from foo import *。在第二次导入时不会"发生"任何事情(将使用sys.modules中已经导入的模块),因此您的模块无法检测它。

最新更新