如何从字符串中的代码加载模块?

我有一些字符串形式的代码,并且想在不写入磁盘的情况下将其做成一个模块。


当我尝试使用imp和StringIO对象执行此操作时,我得到:


>>> imp.load_source('my_module', '', StringIO('print "hello world"'))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: load_source() argument 3 must be file, not instance

>>> imp.load_module('my_module', StringIO('print "hello world"'), '', ('', '', 0))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: load_module arg#2 should be a file or None

如何在没有实际文件的情况下创建模块?或者,如何在不写入磁盘的情况下将StringIO包装在文件中?


更新:


注意:这个问题也是python3中的问题。


我尝试加载的代码仅部分受信任。我已经用ast进行了研究,并确定它不会导入任何东西或做我不喜欢的任何事情,但是当我有可以修改的局部变量在运行时,我不太相信它可以运行它,并且我不相信自己的代码不会妨碍我尝试导入的代码。


我创建了一个仅包含以下内容的空模块:


def load(code):

    # Delete all local variables

    globals()['code'] = code

    del locals()['code']


    # Run the code

    exec(globals()['code'])


    # Delete any global variables we've added

    del globals()['load']

    del globals()['code']


    # Copy k so we can use it

    if 'k' in locals():

        globals()['k'] = locals()['k']

        del locals()['k']


    # Copy the rest of the variables

    for k in locals().keys():

        globals()[k] = locals()[k]

然后,您可以导入mymodule并调用mymodule.load(code)。这对我有用,因为我确保所加载的代码不使用globals。此外,global关键字只是解析器指令,不能引用exec以外的任何内容。


这确实是import对模块的太多工作,而不需要写入磁盘,但是如果您想这样做,我相信这是最好的方法。


PIPIONE
浏览 395回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python