如何获取模块内部模块的引用?

Ram*_*hum 143 python self-reference

如何从该模块中获取对模块的引用?另外,如何获得包含该模块的包的引用?

tru*_*ppo 194

import sys
current_module = sys.modules[__name__]
Run Code Online (Sandbox Code Playgroud)

  • 重新加载重用相同的模块对象; 没有创建新的模块对象,因此在重新加载时它仍然是正确的. (12认同)
  • 除非重新加载模块,否则这将不完全正确; 我认为没有任何地方可以保证参考,如果有的话,重装不会真的有用,对吗? (3认同)

Mic*_*ael 16

如果该模块中有一个类,则__module__该类的属性是该类的模块名称.因此,您可以通过访问模块sys.modules[klass.__module__].这也适用于功能.

  • 实际上,似乎(至少)对于一个函数,`__module__`属性不是一个模块,而是一个字符串; 因此`inspect.getabsfile(func .__ module __)`失败,带有"_TypeError:'os'不是模块,类,方法,函数,回溯,框架或代码对象_"; 而`inspect.getabsfile(sys.modules [o .__ module __])`似乎过去了. (4认同)

Uri*_*Uri 12

另一项技术,不导入sys模块,可以说 - 取决于你的口味 - 更简单:

current_module = __import__(__name__)
Run Code Online (Sandbox Code Playgroud)

请注意,没有导入.Python只导入一次模块.

  • 该解决方案不适用于我的代码。它不是创建对模块的引用,而是创建对包的引用。我是唯一一个有这种行为的人吗? (4认同)
  • 根据文档字符串:“从包导入模块时,请注意,当 fromlist 为空时 __import__('AB', ...) 返回包 A,但当 fromlist 不为空时返回子模块 B。” 还建议在同一位置使用 importlib.import_module 代替,它没有此行为。 (4认同)
  • @sangorys - 我也在 Python 3.9 上看到了这种行为(获取对包而不是模块的引用) (3认同)
  • 不要使用这个答案,它会让你因为不直观的行为而发疯,比如有时会导入比你指定的更高的模块。详细信息:stackoverflow.com/a/37308413/210867 (2认同)

pki*_*kit 10

您可以使用获取当前模块的名称 __name__

模块参考可以在sys.modules字典中找到.

请参阅Python 文档

  • 我很欣赏doc链接. (4认同)

Bra*_*ndt 5

根据@truppo 的回答这个答案(和PEP366):

引用“this”模块

import sys
this_mod = sys.modules[__name__]
Run Code Online (Sandbox Code Playgroud)

参考“这个”

import sys
this_pkg = sys.modules[__package__]
Run Code Online (Sandbox Code Playgroud)

__package____name__如果来自(顶部),则相同__init__.py