将字符串参数传递给Python脚本的Bash命令

6

我有一个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

出现错误 无法识别参数:-- string,而python my_script.py --my_param "Some -- string"却可以正常工作。我尝试了调整nargs和以my_param_str="--my_param '${my_param}'"方式转义,但这两种方法都不起作用。有没有其他解决方案?或者有没有不同的处理方法?


-- 在正常情况下,-- 标记命令参数的结束。 - sjsam
1
除非你明确希望 Bash 执行单词拆分,否则应始终使用双引号 Bash 参数扩展... 而你可能真的不想要单词拆分。 :) 请参阅 BashGuideShellCheck - PM 2Ring
查看 sys.argv 以了解 bash 给你的脚本什么。argparse 只能解析该列表中的字符串。 - hpaulj
3个回答

7

你的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"将作为三个单独的参数传递。

非常棒的xargs-fu!与Python argparse完美配合。 - taranaki

1

对于这个有限的示例,你基本上可以通过使用相同的方法来获得相同的行为

arg = os.environ.get('my_param', '')

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


谢谢,但我试图通过bash传递参数。 - Most Wanted

0

当你给Bash字符串变量赋值时,你写在字符串周围的引号不会被保留:

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

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

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

那不对。这会将 my_param_str 转换为一个形式为 --my_param Some -- string 的单个参数。引号应该放在 Some -- string 周围。 - Aran-Fey
在这种情况下,它们必须写在这一行中:my_param_str="--my_param \"${my_param}\"" - Byte Commander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接