如何使用exec()在字符串函数中使用内置模块



我正在运行一个websocket python文件。在其中,我使用imp模块在函数中创建了内置模块,我在另一个函数中使用exec()执行字符串函数。我使用这些内置模块作为exec()中的全局参数。但是当我在string函数中使用这些模块时,它会抛出以下错误

'module' object has no attribute 'pose'

但是,在string函数之外使用这些模块可以完美地工作并返回预期的值。但是如何在函数内部使用呢?.

这是完整的代码

import imp
import sys
import time
def generate_modules():
destination_module = imp.new_module("destination")
destination_module.destination = imp.new_module("destination")
destination_module.destination.pose = "Hello World"
# Define GUI module
gui_module = imp.new_module("GUI")
gui_module.GUI = imp.new_module("GUI")
gui_module.GUI.robotPose = lambda: "robotPose"
sys.modules["destination"] = destination_module
sys.modules["GUI"] = gui_module
return gui_module,destination_module
#Main function
def process_code():
gui_module,destination_module = generate_modules()
builtin_modules = {"GUI": gui_module,"destination":destination_module,"time": time}
globl = globals()
global_functions = globl.copy()
global_functions.update(builtin_modules)
sequential_code = """from GUI import GUI
from destination import destination
def generatepath():
data = destination.pose
pose = GUI.robotPose()
return data"""
dic = {}
exec(sequential_code,global_functions,dic)
func = dic["generatepath"]
value = func()
return value
process_code()

谢谢你,任何帮助都是感激的

根据exec文档:

如果exec获得两个单独的对象作为全局对象和局部对象,代码将被执行,就像它嵌入在类定义中一样。

值得注意的是,类作用域的成员在任何嵌套作用域中都不可见。from destination import destination产生的别名只在顶层作用域中可见,在函数内部不可见。

一个简单的解决方案是省略locals字典:

...
exec(sequential_code,global_functions)
func = global_functions["generatepath"]
...

相关内容

  • 没有找到相关文章

最新更新