【问题标题】:Bash pass string argument to python scriptBash将字符串参数传递给python脚本
【发布时间】:2016-09-15 22:48:56
【问题描述】:

我有一个 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}'",但两种解决方案均无效。 这种情况有什么解决方法吗?或者不同的方法如何处理?

【问题讨论】:

  • -- 在正常情况下标记命令参数的结束。
  • 您应该总是双引号 Bash 参数扩展,除非您明确希望 Bash 执行分词...而您可能真的想要分词。 :) 见BashGuideShellCheck
  • 查看sys.argv 以了解bash 为您的脚本提供了什么。 argparse 只能解析该列表中的字符串。

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


【解决方案1】:

您的 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 完美配合。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢,但我绑定了 bash 传递案例
【解决方案3】:

当你分配一个 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附近。
  • @Rawing 在这种情况下,它们必须写在这一行:my_param_str="--my_param \"${my_param}\""
猜你喜欢
  • 2012-12-29
  • 2014-04-13
  • 2021-01-15
  • 1970-01-01
  • 2015-05-13
  • 2021-11-18
  • 1970-01-01
  • 2014-03-01
  • 2012-12-02
相关资源
最近更新 更多