我有一些字符串形式的代码,并且想在不写入磁盘的情况下将其做成一个模块。
当我尝试使用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对模块的太多工作,而不需要写入磁盘,但是如果您想这样做,我相信这是最好的方法。
相关分类