有没有办法以字符串形式导入Python模块?

有没有办法以字符串形式导入Python模块?,python,python-3.x,module,python-import,Python,Python 3.x,Module,Python Import,比方说,我在代码中定义了一个字符串: module_string = """ def add(x, y): return x + y def multiply(x, y): return x * y """ 有没有办法有效地做到以下几点: from module_string import add, multiply ,脚本将仅在包含输入脚本的目录(或未指定文件时的当前目录)中以.py文件的形式搜索模块。”然后在

比方说,我在代码中定义了一个字符串:

module_string = """
def add(x, y):
    return x + y

def multiply(x, y):
    return x * y
"""
有没有办法有效地做到以下几点:

from module_string import add, multiply

,脚本将仅在包含输入脚本的目录(或未指定文件时的当前目录)中以
.py
文件的形式搜索模块。”然后在
PYTHONPATH
或依赖于安装的默认目录中查找模块

一个明显的方法是将字符串写入一个后缀为
.py
的文件,然后导入它。虽然这样做有效,但它确实会在工作目录中创建一个实际的文件和一个
\uuuuupycache\uuuu
目录,这可能是不需要的

虽然可以使用
exec()
简单地将字符串作为代码执行,但如果模块字符串定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

有没有什么方法可以让字符串像Python中的可导入模块一样工作,而不必在工作目录中生成一堆文件和目录?或者模块必须作为文件存在是绝对必要的?有没有什么方法可以通过
StringIO
对象或类似的东西来假装这一点


上下文:我希望能够从Github Gist中的文件动态导入模块,并在Gist经过修订时动态更新导入的类/函数。我通过使用Github的REST API通过
请求
模块将Gist作为字符串读取,但我需要找到一些方法来实现这一点要作为代码本身中的模块导入的字符串

如果我的问题更多的是,我希望听到关于如何实现预期目标的其他建议



PS:假设我已经考虑了所有与此问题相关的网络安全问题(据我所知,SO上的一些人会迫切地关注这一方面)。

执行下载的代码可能不是一个好主意,但如果你真的想这样做的话

>>> module_string = """
... def add(x, y):
...     return x + y
... 
... def multiply(x, y):
...     return x * y
... """
>>> exec(module_string)
>>> add(1,2)
3

我理解这个问题,但在将其加载为模块之前,在Gist中获取该文件并将其存储在本地不是更有意义吗?如果没有其他方法通过字符串导入模块,那么这就是我必须使用的方法。但是我想找到一种不将任何文件保存到磁盘的方法。可能会有100个Gist,我需要ish导入(对于我心目中的项目,其他人将编写和编辑这些GIST)。也许有人会证明我错了,但我认为没有一种可靠的方法比使用临时文件更可取。如果必须解决这个问题,我会研究如何创建临时文件,使它们显示在正确的位置并自动清理(使用
tempfile
库)。@Grismar使用
temp
目录是一个有趣的建议,但是如何让Python的模块导入器查看temp目录呢?我想,您可以使用
sys
来更改
PYTHONPATH
以包含temp目录,但这感觉像是一个丑陋的解决方案(可能并不比在当前目录中创建文件好多少)!@Grismar作为上下文管理器!OP已经写道“虽然可以使用exec()以代码的形式简单地执行字符串,但如果[…等],这并不能回答问题。”。