gpt4 book ai didi

python - 在 shell 脚本中读取 python 变量?

转载 作者:太空狗 更新时间:2023-10-30 00:35:22 27 4
gpt4 key购买 nike

我的 python 文件有这两个变量:

week_date = "01/03/16-01/09/16"
cust_id = "12345"

我如何将其读入包含这 2 个变量的 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\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 代码有副作用,这些副作用显然会生效(就像您选择将文件作为 Python 模块的 import 一样)。不要使用它从您不信任其内容的文件中提取配置。
  • Python 字符串是 Pascal 风格的:它们可以包含文字 NUL。 shell 语言中的字符串是 C 风格的:它们以第一个 NUL 字符结束。因此,一些变量可以存在于 Python 中,但如果没有非文字转义就无法在 shell 中表示。为防止其 str() 表示包含 NUL 的对象向前溢出到其他赋值中,此代码在第一个 NUL 处终止字符串。

现在,我们来谈谈实现细节。

  • ${@%%:*}$@ 的扩展,它在每个参数中修剪第一个 : 之后的所有内容并包括在内,因此只将 Python 变量名传递给解释器。类似地, ${varname#*:} 是一个扩展,它从传递给 : 的变量名中修剪直到并包括第一个 read 的所有内容。参见 the bash-hackers page on parameter expansion
  • 使用 <(python ...) 是进程替换语法:<(...) 表达式求值为文件名,读取时将提供该命令的输出。使用 < <(...) 重定向该文件的输出,从而重定向该命令(第一个 < 是重定向,而第二个是启动进程替换的 <( token 的一部分)。使用这种形式将输出输出到 while read 循环中可以避免 BashFAQ #24 ("I set variables in a loop that's in a pipeline. Why do they disappear after the loop terminates? Or, why can't I pipe data to read?") 中提到的错误。
  • IFS= read -r -d '' 构造有一系列组件,每个组件都使 read 的行为更符合原始内容:

    • 在命令执行期间清除 IFS 可防止从变量内容末尾删除空格。
    • 使用 -r 可防止文字反斜杠被 read 本身消耗,而不是在输出中表示。
    • 使用 -d '' 将空字符串 '' 的第一个字符设置为记录分隔符。由于 C 字符串以 NUL 结尾且 shell 使用 C 字符串,因此该字符为 NUL。这确保变量的内容可以包含任何非 NUL 值,包括文字换行符。

    有关从 bash 中的字符串读取面向记录的数据的过程的更多信息,请参见 BashFAQ #001 ("How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?")

关于python - 在 shell 脚本中读取 python 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34751930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com