代码之家  ›  专栏  ›  技术社区  ›  Mike

python,将python代码的字符串导入为模块

  •  16
  • Mike  · 技术社区  · 14 年前

    在Python中,您可以这样做:使用字符串文件名导入模块,并在本地名称空间上为其名称空间分配变量。

    x = __import__(str)
    

    我想知道是否有一个相关的函数将采用一个字符串的python代码,而不是一个带有python代码的文件的路径,并将其名称空间作为变量返回。

    例如,

    str = "a = 5";
    x = importstr(str)
    print x.a
    #output is 5
    

    我知道我可以将字符串写入一个文件,然后使用 __import__ 但如果可能的话,我想跳过中间文件。

    原因是我正在尝试用Python进行元编程,这似乎是我正在做的一个很好的解决方案。

    4 回复  |  直到 9 年前
        1
  •  14
  •   Jeremy Brown    14 年前

    这里有一个 example 使用 imp module

        2
  •  5
  •   Remi    13 年前

    这里是 如何将字符串作为模块导入 :

    import sys,imp
    
    my_code = 'a = 5'
    mymodule = imp.new_module('mymodule')
    exec my_code in mymodule.__dict__    
    

    因此,现在可以访问模块属性(以及函数、类等),如下所示:

    mymodule.a
    >>> 5
    

    若要忽略任何下一次导入尝试,请将模块添加到 sys :

    sys.modules['mymodule'] = mymodule
    
        3
  •  4
  •   kirbyfan64sos    9 年前

    不幸的是, imp 模块最近被否决了(我不知道为什么)。

    相反,您应该这样做:

    from types import ModuleType
    import sys
    
    mod = ModuleType('my_module', 'doc string here')
    exec('a = 1', mod.__dict__)
    print(mod.a) # prints 1
    # add to sys.modules
    sys.modules['my_module'] = mod
    

    或者你可以使用 PyExt RuntimeModule.from_string :

    from pyext import RuntimeModule
    
    mod = RuntimeModule.from_string('a = 1')
    print(mod.a) # 1
    
        4
  •  2
  •   Tarantula    14 年前

    这是你要找的东西吗?

    my_namespace = {}
    exec "a = 5" in my_namespace
    print my_namespace["a"]