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

时间:2016-05-19 07:33:28

标签: python bash escaping command-line-arguments argparse

我有一个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: -- stringpython my_script.py --my_param "Some -- string"效果很好。 我尝试过使用 nargs 并以这种方式逃避my_param_str="--my_param '${my_param}'",但两种解决方案都无法正常工作。 针对此案例的任何解决方法?或者不同的方法如何处理这个?

3 个答案:

答案 0 :(得分:4)

你的bash需要看起来像这样:

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

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

否则,参数字符串周围的引号将不会被保留,并且"某些"," - "和"事情"将作为三个单独的论点传递。

答案 1 :(得分:1)

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

获得相同的行为
get

其中{{1}}的第一个参数是变量名,第二个参数是var不在环境中时使用的默认值。

答案 2 :(得分:0)

当您指定Bash字符串变量时,您在字符串周围写的引号不会被保留:

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

当您使用变量创建my_param_str时,需要再次在变量周围放置引号:

my_param_str="--my_param \"${my_param}\""