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

2024-04-27 00:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在运行一个websocket python文件。在这种情况下,我使用imp module在一个函数中创建了内置模块,并在另一个函数中使用exec()执行一个字符串函数。 我将这些内置模块用作exec()中的globals参数。 但是当我在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()

谢谢,谢谢你的帮助


1条回答
网友
1楼 · 发布于 2024-04-27 00:58:08

根据^{} documentation的规定:

If exec gets two separate objects as globals and locals, the code will be executed as if it were embedded in a class definition.

值得注意的是,members of a class scope are not visible inside any nested scope.from destination import destination产生的别名仅在顶部作用域中可见,而在函数内部不可见

一个简单的解决方案是省略本地词典:

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

相关问题 更多 >