【问题标题】:Importing code from a dynamically created module in Python从 Python 中动态创建的模块导入代码
【发布时间】:2014-10-04 13:03:10
【问题描述】:

我有一个项目尝试动态创建一个新模块,然后在随后的exec 语句中尝试导入该模块。

import imp

s="""
class MyClass(object):
    def __init__(self):
        pass
    def foo(self):
        pass
"""

mod = imp.new_module("testmodule.testA")
exec s in mod.__dict__

exec "import testmodule.testA"

但这会引发此异常:

Traceback (most recent call last):
File "test.py", line 14, in <module>
exec "import testmodule.testA"
File "<string>", line 1, in <module>
ImportError: No module named testmodule.testA

我尝试了几件事:将它添加到 sys.modules,创建一个包含名称和模块的scope dict。但没有骰子。当我在 exec 语句中执行 print locals() 时,我可以看到 testmodule.testA,但我无法导入它。我在这里错过了什么?

谢谢。

【问题讨论】:

  • 您说您已经“尝试将其添加到 sys.modules”,这对于后续导入工作是必要的。但这没有显示在您的代码中。您是否真的按照下面 Martjin Pieters 的回答中所述执行此操作?

标签: python python-import python-exec


【解决方案1】:

您需要将您的模块添加到sys.modules 结构中,以便import 找到它:

import sys
sys.modules['testmodule.testA'] = mod

但是,您已经有了模块对象,再次导入它没有多大意义。 mod 是对 Python 将“导入”已经的内容的引用。

以下操作没有import调用:

mod.MyClass

如果您在 exec 调用中需要该模块,请将其添加到那里的命名空间:

exec 'instance = MyClass()' in {'MyClass': mod.MyClass}

【讨论】:

  • 嗯,第二个exec 语句就是一个例子。实际上,这将是某些代码的字符串序列化形式,需要第一个 exec 中的代码/模块。所以基本上,我正在生成一堆模块对象,然后运行一个使用生成的模块并充当某个进程的入口点的方法。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2013-03-25
  • 2015-10-17
  • 1970-01-01
相关资源
最近更新 更多