【问题标题】:Running code on import from dynamically generated module从动态生成的模块导入时运行代码
【发布时间】:2015-12-04 19:04:45
【问题描述】:

我已经使用this SO answer动态生成了一个模块x并注册到sys.modules。我希望在此模块上调用导入时自动运行一段代码。所以例如我想要print "you just imported module x"。所以它的行为类似于:

>>> import x
you just imported module x

我如何获得这种行为?

【问题讨论】:

  • 为什么不把它放在模块本身呢?即在示例中的 class Foo: 之前
  • 每次导入模块时都应该发生这种情况吗?如果是这样,您可能需要弄乱导入钩子才能做到这一点。
  • Padraic 没有给出所需的行为,因为打印代码是在调用 exec 时执行的,而不是在导入模块时执行的。

标签: python


【解决方案1】:

要简单地扩展所选答案中给出的示例,您可以这样做。

print "You just imported module {}".format(foo.Foo.__module__)

【讨论】:

  • 如果你这样做,然后运行示例exec foo_code in foo.__dict__ 中的行,打印将在你调用exec 时立即发生,这不会导致打印在import foo 上运行跨度>
  • 如果那是在被导入的模块中,那将是真的。我的理解是这段代码将进入模块中进行导入。
【解决方案2】:

当您导入模块时,将执行任何“孤儿”代码(未编写在类或函数内或 if __name__ == '__main__:' 块内的代码)。

【讨论】:

    猜你喜欢
    • 2019-04-13
    • 1970-01-01
    • 2020-02-04
    • 2013-01-22
    • 2018-03-01
    • 2020-10-17
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多