You need to enable JavaScript to run this app. Python使用eval执行变量赋值语句报SyntaxError,涉及Jupyter %run传参场景
优惠活动
大模型
产品
解决方案
定价
更多

Python使用eval执行变量赋值语句报SyntaxError,涉及Jupyter %run传参场景

报错原因
  • 核心问题是eval()函数的能力边界限制:eval()仅支持执行Python表达式(比如运算、函数调用、变量取值等),而你生成的data_csv="data2.csv"属于变量赋值语句,不属于合法的表达式范畴,因此触发语法错误。
  • 次生问题:你的代码中使用了re模块但没有提前导入,运行时也会触发报错。
解决方案

这里提供2种可直接落地的修复方案:

方案1:使用globals()字典直接赋值(更安全,推荐)

直接拆分参数的键值对写入全局命名空间,避免执行动态代码的安全风险:

p = ['data_csv=data2.csv','master=lala','data_dir=./data']
for param in p:
    if '=' not in param:
        continue
    key, value = param.split('=', 1)
    # 可根据需要对value做类型转换,此处保留字符串原值
    globals()[key] = value

# 测试:直接打印变量即可验证赋值成功
print(data_csv)

方案2:替换eval()为exec()

exec()支持执行任意Python语句,可直接运行你生成的赋值字符串,仅建议在参数完全可信的场景下使用,避免代码注入风险:

import re
p = ['data_csv=data2.csv','master=lala','data_dir=./data']
parameters = list(
    map(lambda s: re.sub('$', '"', s),
        map(lambda s: s.replace('=','="'),
            filter(
                lambda s: s.find('=') > -1,
                p
            )
        )
    )
)

for parameter in parameters:
    exec(parameter)

额外优化建议

如果要实现Jupyter notebook之间的参数化运行,更规范的方式是在被调用的笔记本开头通过sys.argv接收%run传入的参数,不需要自行做字符串拼接解析:
被调用的notebook.ipynb开头添加代码:

import sys
# sys.argv[0]是被运行的笔记本名,后面的是传入的参数
params = {}
for arg in sys.argv[1:]:
    if '=' in arg:
        k, v = arg.split('=', 1)
        params[k] = v
# 后续直接从params字典取值即可

调用时直接使用%run notebook.ipynb data_csv=data2.csv master=lala data_dir=./data即可正常传参。

内容的提问来源于stack exchange,提问作者Romeo Kienzler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 06:33:00