在 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() 可以接受一个字典作为 globals 或 locals 参数,控制代码执行的上下文。
示例:
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()。 - 考虑使用更安全的替代方案(如配置文件、模板引擎等)。
