杰瑞科技汇

Python如何执行字符串中的Python代码?

在 Python 中,你可以使用 exec() 函数来执行字符串形式的 Python 代码,以下是几种常见的方法和注意事项:


使用 exec() 执行字符串代码

exec() 会动态执行字符串中的 Python 代码,类似于运行一个独立的脚本块。

示例:

code = """
print("Hello, World!")
x = 10
y = 20
print(f"x + y = {x + y}")
"""
exec(code)

输出:

Hello, World!
x + y = 30

在特定命名空间中执行

exec() 可以接受一个字典作为 globalslocals 参数,控制代码执行的上下文。

示例:

code = "x = x + 10"
x = 5
# 使用全局命名空间
exec(code, globals())
print(x)  # 输出: 15
# 使用自定义命名空间
namespace = {"x": 5}
exec(code, namespace)
print(namespace["x"])  # 输出: 15

安全性警告

exec() 会执行任意代码,可能带来安全风险(如注入恶意代码)。切勿对不可信的输入使用 exec()

危险示例:

user_input = input("Enter Python code: ")  # 用户输入 "__import__('os').system('rm -rf /')" 可能破坏系统
exec(user_input)  # 极度危险!

替代方案:eval() 表达式求值

如果只需要执行一个表达式(而非语句),可以使用 eval(),它返回表达式的值。

示例:

expression = "2 + 3 * 4"
result = eval(expression)
print(result)  # 输出: 14

动态函数(更安全的替代方案)

如果需要动态生成逻辑,但避免直接执行字符串代码,可以考虑动态创建函数:

示例:

def dynamic_function(x, y):
    return x + y
# 通过字符串动态生成函数
code = "lambda x, y: x * y"
func = eval(code)  # 或 compile() + exec()
print(func(3, 4))  # 输出: 12

使用 compile() 预编译代码

对于多次执行的代码,可以先编译再执行,提高效率:

示例:

code = "print('Compiled code')"
compiled = compile(code, "<string>", "exec")
exec(compiled)  # 输出: Compiled code

方法 用途 安全性
exec() 执行任意 Python 代码(语句) ⚠️ 高风险
eval() 执行单个表达式并返回值 ⚠️ 高风险
compile() 预编译代码后执行 ⚠️ 仍需谨慎
动态函数 通过字符串生成函数 ✅ 相对安全

建议:

  • 优先使用 eval()compile() 处理简单逻辑。
  • 避免对用户输入直接使用 exec()
  • 考虑使用更安全的替代方案(如配置文件、模板引擎等)。
分享:
扫描分享到社交APP
上一篇
下一篇