从python字符串加载模块而不执行代码

从python字符串加载模块而不执行代码,python,python-3.x,Python,Python 3.x,我正在尝试做类似的事情: 有时我会阅读用户提供的源代码: module = imp.new_module('AppModule') exec_(s, module.__dict__) sys.modules['AppModule'] = module return module 有时从文件导入 module = __import__(module_name, fromlist=_fromlist) return module 这些模块被加载来映射对象,并将在IDE中使用 我的问题是:如果在之

我正在尝试做类似的事情:

有时我会阅读用户提供的源代码:

module = imp.new_module('AppModule')
exec_(s, module.__dict__)
sys.modules['AppModule'] = module
return module
有时从文件导入

module = __import__(module_name, fromlist=_fromlist)
return module
这些模块被加载来映射对象,并将在IDE中使用

我的问题是:如果在
之外有任何方法调用,如果\uuuu name\uuuu=='\uuuuu main\uuuu':
此代码正在执行,并且可以与IDE交互


如何导入忽略正在执行的方法的模块?

导入模块的过程要求执行其代码。解释器创建一个新名称空间,并通过使用新名称空间作为全局名称空间来执行模块的代码来填充它,之后您可以访问这些值(请记住,
def
class
语句是可执行的)


因此,您可能需要教育您的用户不要编写与IDE交互的模块?

我并不完全理解您的问题,但请记住,当您导入模块时,您基本上是从该文件(如果是文件)导入所有代码,如果您有一些方法(您调用)或一些全局代码,他们将被处决。为了避免这种情况,只需删除所有全局代码或对某个函数的任何调用,并在需要时从主文件中调用它们。模块中定义的所有内容,包括函数、类、全局变量,都是执行定义它们的语句的结果。这也递归地应用于class.thx中定义的所有内容。我将尝试使用另一种方法来分析源代码。这并不完全正确,您可以使用
ast
从模块中提取一些数据而不执行:也许我是在逐字逐句地解释“如何导入忽略正在执行的方法的模块?”。但我相信你的方法会得到一个有趣的答案。当然,我们不应该忘记,
def
class
都是可执行语句,所以“导入而不执行”并没有多大帮助。