python - 从该模块中查找模块的本地名称

标签 python module namespaces

我正在尝试从该模块内部获取导入模块的确切模块名称。像这样的东西:

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/

相关文章:

C++中的python linspace

python - 如何在 python 3.7 中的 Tk Canvas 内创建按钮

javascript - 箭头函数不适用于模块?

Yii 包含 CSS 和 javascript 文件

c++ - 在 C++ 中使用声明

python - 并行化 pandas 函数 pd.concat

python - 我可以使用 tornado 管道化 HTTP 1.1 请求吗?

php - Magento 模型不会保存值

c# - 如何在调试中访问根命名空间

php - 是否有最佳实践方法来近似 WordPress 插件中的命名空间 PHP?