我需要一个函数,它返回调用该函数的模块的包的名称。获取模块的名称很容易:
import inspect
module_name = inspect.currentframe().f_back.f_globals['__name__']
并且剥离最后一部分以获得模块的包也很容易:
package_name = '.'.join(module_name.split('.')[:-1])
但是如果函数是从包中调用的__init__.py
,名称的最后一部分不应该被剥离。例如,如果从 调用foo/bar/__init__.py
,module_name
在上面的示例中将设置为'foo.bar'
,这已经是包的名称。
如何从模块名称或模块对象中检查它是指包还是模块?
我发现的最好方法是获取模块对象的__file__
属性(如果存在),并检查它是否指向名称为__init__
加扩展名的文件。但这对我来说似乎很脆弱。