解决Shell与Python传递URL字典时的‘无效标识符’错误
解决Shell传递Python字典环境变量时的"Not valid identifier"错误
问题背景
原本实现是在Shell脚本中传递emp_code环境变量,Python脚本根据该变量读取内置字典输出对应URL,运行正常。尝试将字典移至Shell脚本作为环境变量传递时,出现"Not valid identifier"错误。
错误原因分析
- Shell变量定义格式错误:
export _emp_url= '中等号后多余空格,且多行字符串的引号嵌套、换行处理不符合Shell语法规范。 - Python解析错误:直接将环境变量的字符串值当作字典使用(
{Emp_url}[_emp_code]),无法将字符串解析为字典对象。 - 原Python代码存在语法小错误:
is filed应改为isfile,Print需小写为print。
正确解决方案
方案一:用Python字典格式传递,通过ast.literal_eval解析
修改后的trigger.sh:
export emp_code='IT' # 单行定义字典字符串,注意等号后无空格,引号正确嵌套 export _emp_url="{'IT':{'Emp_url':'www.it.com'},'Prod':{'Emp_url':'www.prod.com'},'Qa':{'Emp_url':'www.qa.com'}}" py /C/Users/LocalDB/emp.py
若需要多行排版,可使用反斜杠转义换行:
export emp_code='IT' export _emp_url='\ {"IT":{"Emp_url":"www.it.com"},\ "Prod":{"Emp_url":"www.prod.com"},\ "Qa":{"Emp_url":"www.qa.com"}}' py /C/Users/LocalDB/emp.py
修改后的emp.py:
import os import ast from os import listdir from os.path import isfile, join _emp_code = os.environ['emp_code'] # 将环境变量中的字符串解析为Python字典 emp_url_dict = ast.literal_eval(os.environ['_emp_url']) Emp_url = emp_url_dict[_emp_code] print(Emp_url)
方案二:用JSON格式传递(更推荐,解析更安全)
JSON格式与Python字典兼容,且解析逻辑更通用,避免引号嵌套问题。
修改后的trigger.sh:
export emp_code='IT' # JSON格式需使用双引号,注意字符串整体用单引号包裹 export _emp_url='{"IT":{"Emp_url":"www.it.com"},"Prod":{"Emp_url":"www.prod.com"},"Qa":{"Emp_url":"www.qa.com"}}' py /C/Users/LocalDB/emp.py
修改后的emp.py:
import os import json from os import listdir from os.path import isfile, join _emp_code = os.environ['emp_code'] # 解析JSON字符串为Python字典 emp_url_dict = json.loads(os.environ['_emp_url']) Emp_url = emp_url_dict[_emp_code] print(Emp_url)
关键修正点
- Shell中
export变量时,等号与变量值之间不能有空格 - 传递复杂字符串时,需保证Shell语法下的引号嵌套正确,或使用JSON这种通用格式
- Python需通过
ast.literal_eval或json.loads将环境变量的字符串值解析为字典对象,不能直接当作字典使用 - 修正原Python代码中的语法错误:
is filed→isfile,Print→print
内容的提问来源于stack exchange,提问作者Balaji R B
相关产品推荐
相关产品推荐

