我的 python 文件有这两个变量:
week_date = "01/03/16-01/09/16"
cust_id = "12345"
我如何将其读入接受这两个变量的 shell 脚本中?
我当前的 shell 脚本需要手动编辑“dt”和“id”。我想将 python 变量读入 shell 脚本,这样我就可以编辑我的 python 参数文件而不是那么多文件。
外壳文件:
#!/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\0" % str(d[k]).split("\0")[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 字符的表示形式。
-
通过 Python 解释器运行内容还意味着您可以通过编程方式确定值 - 例如,您可以使用一些 Python 代码向版本控制系统询问相关内容的最后更改日期。
想想这样的场景:
start_date = '01/03/16'
end_date = '01/09/16'
week_date = '%s-%s' % (start_date, end_date)
...使用 Python 解释器来解析 Python 意味着您不会限制人们将来更新/修改您的 Python 配置文件的方式。
现在,我们来谈谈注意事项:
- 如果你的 Python 代码有副作用,这些副作用显然会生效(就像你选择
import
文件作为 Python 中的模块)。不要使用它从您不信任内容的文件中提取配置。
- Python 字符串是 Pascal 风格的:它们可以包含文字 NUL。 shell 语言中的字符串是 C 风格的:它们以第一个 NUL 字符终止。因此,某些变量可以存在于 Python 中,但如果没有非文字转义则无法在 shell 中表示。为了防止一个对象
str()
由于表示形式包含 NUL,以免向前溢出到其他赋值中,因此此代码在字符串的第一个 NUL 处终止字符串。
现在,我们来谈谈实现细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)