我正在尝试从该模块内部获取导入模块的确切模块名称。像这样的东西:
def install():
print 'Local module name is %s' % __localModuleName__
当我跑:
import myModule as mm
mm.install()
它会打印
Local module name is mm
我正在尝试制作的脚本将自身安装到外部应用程序 Maya 中。 Maya 评估我在 python 中按需传递的字符串。现在,我正在尝试给 Maya 字符串
"myModule.run()"
.在这种情况下,我必须知道 myModule
的确切名称。当myModule.install()
是第一次运行。 __name__
如果用户使用 import myModule as otherModule
导入模块,则不够具体.如果有更好的方法来做到这一点而不涉及使用确切的模块名称,我很想知道。就像以某种方式转换
myModule.run
的引用一样成一个字符串,我可以存储在 Maya 中,然后解压缩。我一直在尝试使用 inspect
模块来查找这些信息,但我一直在寻找它不起作用的情况,我不得不回去再摆弄它。也显得有些凌乱。这就是我现在正在使用的,如果 myModule
则不起作用来自 __main__
.MODULENAME = None
fr = inspect.currentframe()
try:
while fr and not MODULENAME:
if fr.f_globals:
for name, obj in fr.f_globals.iteritems():
if hasattr(obj, '__file__') and inspect.ismodule(obj) and obj.__file__ == __file__:
MODULENAME = name
fr = fr.f_back
except:
pass
finally:
del fr
如果没有好的解决方案,我打算把上面的去掉,告诉用户我的模块不能用
import myModule as ...
导入。 .
最佳答案
这可以工作的唯一方法是这样的:
import some.plugin as wanna_have
wanna_have.install(globals(), "wanna_have")
这是为什么?这里需要导入模块的命名空间和导入模块的命名空间,第一个需要你传递 globals()。防止这种情况的唯一方法是在 install() 方法中上升一个堆栈帧,假设调用代码是具有别名的代码。当您使用签名
install(importer=None, imported=__name__)
传递所有这些东西的需要可以减少到使用“as”的情况,或者调用者不是一帧。
关于python - 从该模块中查找模块的本地名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826991/