如何从 python 脚本的输出创建 shell 字典?

如何从 python 脚本的输出创建 shell 字典?

我的 python scripy 打印一个字符串print("declare -A gaps=( [2019-2-24]=4 )"),我可以declare -A gaps=( [2019-2-24]=4 )在 bash shell 上运行来创建一个名为 的字典gaps

在我的 bash 脚本中,我使用名为 的变量gap_string来访问 python scripy 的输出。然后我使用反引号包围gap_string预期创建一个字典,该字典失败并错误:declare: “[2019-2-24]=4”: is not a valid identifier

更多细节:

我的 bash 脚本中的代码:

declare -A birthdays=(["${year}0120"]="GG")

gap_string=`/home/roach/.config/argos/LunarSolarConverter.py ${!birthdays[@]}`
if [ $? -eq 0 ]; then
    `$gap_string`
fi

我的 Python 脚本中的代码:

if __name__ == '__main__':
    converter = LunarSolarConverter()
    gaps_string = ["declare -A gaps=("]
    today = datetime.datetime.today()
    today_date = today.date()
    year = today.year
    isleap = (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0))
    days_this_year = 366 if isleap else 365
    for i in range(1, len(sys.argv)):
        year, month, day = int(sys.argv[i][:-4]), int(sys.argv[i][-4:-2]), int(sys.argv[i][-2:])
        lunar = Lunar(year, month, day, isleap)
        solar = converter.LunarToSolar(lunar)
        gap = (datetime.date(solar.solarYear, solar.solarMonth, solar.solarDay) - today_date).days % days_this_year
        if gap <= 4:
            gaps_string.append(f"[{solar.solarYear}-{solar.solarMonth}-{solar.solarDay}]={gap}")
    gaps_string.append(")")
    if len(gaps_string) == 2:
        sys.exit(1)
    else:
        print(" ".join(gaps_string))
        sys.exit(0)

python脚本的作用是将农历日期转换为阳历日期,然后计算今天与特定阳历之间的天数,然后提醒我家人的生日。

答案1

使用反引号是错误的:这将尝试像外部命令一样执行字符串。但该字符串是一个巴什特定命令,并且已在当前 shell 的上下文中执行。有两种方法可以做到这一点:

  1. eval与使用命令替换

    gaps=$( your_python_command )
    eval "$gaps"
    # or, the variable is unnecessary:
    eval "$( your_python_command )"
    
  2. source与使用流程替代

    source <( your_python_command )
    

在这两种情况下,您最好确保知道 python 脚本正在输出什么:您不想执行任何不受信任的代码。

答案2

可以使用set -x命令进行调试。就拿下面的例子来说:

set -x
declare -A gaps=( [2017-02-11]=4 )

会给你:

+ gaps=([2017-02-11]=4)
+ declare -A gaps

s="declare -A gaps=( [2017-02-11]=4 )"
$s

会给你:

+ declare -A 'gaps=(' '[2017-02-11]=4' ')'

所以你可以看到在第二种情况下正在执行的命令是:

declare -A 'gaps=('
declare -A [2017-02-11]=4
declare -A )

相关内容