为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2019-11-18 14:25:06
我有一些字符串形式的代码,并且想在不写入磁盘的情况下将其做成一个模块。当我尝试使用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对模块的太多工作,而不需要写入磁盘,但是如果您想这样做,我相信这是最好的方法。
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 394 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信