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