Bash 将字符串参数传递给 python 脚本

Bash pass string argument to python script

我有一个 bash 脚本,它从环境中读取变量,然后像这样将它传递给 python 脚本

#!/usr/bin/env bash

if [ -n "${my_param}" ]
then
    my_param_str="--my_param ${my_param}"
fi

python -u my_script.py ${my_param_str}

对应的python脚本如下所示

parser = argparse.ArgumentParser(description='My script')
parser.add_argument('--my_param',
                    type=str,
                    default='')

parsed_args = parser.parse_args()
print(parsed_args.description)

我想提供带有短划线字符 "Some -- string" 的字符串作为参数,但它不能通过 bash 脚本工作,但可以通过命令行直接调用。

export my_param="Some -- string"
./launch_my_script.sh

给出错误 unrecognized arguments: -- string 并且 python my_script.py --my_param "Some -- string" 效果很好。 我尝试过 nargs 并以这种方式转义 my_param_str="--my_param '${my_param}'" ,但这两种解决方案均无效。 这种情况有什么解决方法吗?或者不同的方法如何处理这个问题?

对于有限的示例,您基本上可以使用

获得相同的行为
arg = os.environ.get('my_param', '')

其中 get 的第一个参数是变量名,第二个参数是如果变量不在环境中则使用的默认值。

当您分配一个 Bash 字符串变量时,您在字符串周围写的引号不会被保留:

$ export my_param="Some -- string"
$ echo $my_param
Some -- string

当您使用它创建 my_param_str:

时,您需要再次将引号放在变量周围
my_param_str="--my_param \"${my_param}\""

您的 bash 需要如下所示:

if [ -n "${my_param}" ]
then
    my_param_str="--my_param \"${my_param}\""
fi

echo ${my_param_str}|xargs python -u my_script.py

否则,参数字符串两边的引号将不会保留,"Some"、"--" 和 "thing" 将作为三个单独的参数传递。