在shell脚本中读取python变量?
我的
python文件有以下两个变量:
week_date = "01/03/16-01/09/16" cust_id = "12345" 我如何将其读入一个接受这两个变量的shell脚本? 我当前的shell脚本需要手动编辑“dt”和“id”.我想将python变量读入shell脚本,这样我就可以编辑我的python参数文件而不是那么多文件. shell文件: #!/bin/sh dt="01/03/16-01/09/16" cust_id="12345" 在一个新的python文件中,我可以导入参数python文件. 解决方法
考虑类似于以下内容:
#!/bin/bash # ^^^^ NOT /bin/sh,which doesn't have process substitution available. python_script=' import sys d = {} # create a context for variables exec(open(sys.argv[1],"r").read()) in d # execute the Python code in that context for k in sys.argv[2:]: print "%s " % str(d[k]).split(" ")[0] # ...and extract your strings NUL-delimited ' read_python_vars() { local python_file=$1; shift local varname for varname; do IFS= read -r -d '' "${varname#*:}" done < <(python -c "$python_script" "$python_file" "${@%%:*}") } 然后您可以将其用作: read_python_vars config.py week_date:dt cust_id:id echo "Customer id is $id; date range is $dt" …或者,如果您不想在阅读时重命名变量,只需: read_python_vars config.py week_date cust_id echo "Customer id is $cust_id; date range is $week_date" 好处: >不像一个天真的基于正则表达式的解决方案(这将解决Python解析的一些细节 – 尝试教sed处理原始和常规字符串,以及单引号和三引号,而不是将其变成毛球!)或者类似的方法使用Python子进程的换行分隔输出,这将正确处理任何对象,str()给出的表示没有您的shell脚本可以使用的NUL字符. 想想这样的场景: start_date = '01/03/16' end_date = '01/09/16' week_date = '%s-%s' % (start_date,end_date) …使用Python解释器来解析Python意味着您不会限制人们将来如何更新/修改Python配置文件. 现在,让我们来谈谈: >如果您的Python代码有副作用,那么这些副作用显然会生效(就像您选择将文件作为模块导入Python一样).不要使用它从您不信任其内容的文件中提取配置. 现在,我们来谈谈实现细节. > ${@ %%:*}是$@的扩展,它修改了每个参数中的第一个:之后的所有内容,因此只将Python变量名称传递给解释器.类似地,${varname#*:}是一个扩展,它修剪所有内容,包括第一个:从传递给read的变量名.见the bash-hackers page on parameter expansion. >在命令持续时间内清除IFS可防止从变量内容的末尾修剪空白. 有关从bash中的字符串中读取面向记录的数据的过程的更多信息,请参阅BashFAQ #001 (“How can I read a file (data stream,variable) line-by-line (and/or field-by-field)?”). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |