原则上,是的,但是所有支持这一点的内置工具都通过文件系统。
为此,您将不得不从任何地方加载源代码,使用 编译它compile
,然后exec
使用__dict__
新模块的 编译它。见下文。
我已经从互联网上留下了实际抓取的文本,并将解析 uris 等作为读者的练习(对于初学者:我建议使用requests
)
在pep 302术语中,这将是函数背后的实现loader.load_module
(参数不同)。有关如何将其与import
语句集成的详细信息,请参阅该文档。
import imp
modulesource = 'a=1;b=2' #load from internet or wherever
def makemodule(modulesource,sourcestr='http://some/url/or/whatever',modname=None):
#if loading from the internet, you'd probably want to parse the uri,
# and use the last part as the modulename. It'll come up in tracebacks
# and the like.
if not modname: modname = 'newmodulename'
#must be exec mode
# every module needs a source to be identified, can be any value
# but if loading from the internet, you'd use the URI
codeobj = compile(modulesource, sourcestr, 'exec')
newmodule = imp.new_module(modname)
exec(codeobj,newmodule.__dict__)
return newmodule
newmodule = makemodule(modulesource)
print(newmodule.a)
此时newmodule
已经是范围内的模块对象,因此您不需要导入它或任何东西。
modulesource = '''
a = 'foo'
def myfun(astr):
return a + astr
'''
newmod = makemodule(modulesource)
print(newmod.myfun('bat'))
ideone在这里:http: //ideone.com/dXGziO
使用 python 2 测试,应该可以使用 python 3(使用文本兼容的打印;使用类似函数的 exec 语法)。