【问题标题】:Pass bash argument to python script将 bash 参数传递给 python 脚本
【发布时间】:2012-12-29 17:36:40
【问题描述】:

我正在尝试创建一个 bash 脚本,它将自己的参数传递给 python 脚本。我希望它像这样工作。

如果我这样运行:

script.sh latest

然后在 bash 脚本中运行一个带有“最新”参数的 python 脚本,如下所示:

python script.py latest

同样,如果 bash 脚本使用参数 123 运行,则 python 脚本如下:

python script.py 123

谁能帮我理解如何做到这一点?

【问题讨论】:

  • 到目前为止,您尝试了什么?在 bash 脚本中传递和使用参数是任何体面教程的一部分。

标签: python linux bash shell debian


【解决方案1】:

在这种情况下,诀窍是传递你有多少参数,包括没有参数的情况,并保留原始命令行中存在的任何分组。

所以,您希望这三种情况都能正常工作:

script.sh                       # no args
script.sh how now               # some number
script.sh "how now" "brown cow" # args that need to stay quoted

实际上并没有一种自然的方法可以做到这一点,因为 shell 是一种宏语言,所以他们添加了一些神奇的语法,只会 DTRT。

#!/bin/sh

python script.py "$@"

【讨论】:

    【解决方案2】:

    在 pythonscript script.py 中使用 getopt.getopt(args, options[, long_options]) 获取参数。

    例子:

    import getopt, sys
    
    def main():
        try:
            opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
        except getopt.GetoptError as err:
            # print help information and exit:
            print str(err) # will print something like "option -a not recognized"
            usage()
            sys.exit(2)
        output = None
        verbose = False
        for o, a in opts:
            if o == "-v":
                verbose = True
            elif o in ("-h", "--help"):
                usage()
                sys.exit()
            elif o in ("-o", "--output"):
                output = a
            else:
                assert False, "unhandled option"
        # ...
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案3】:

      一个非常粘的内置解析器是 argparse。哟可以如下使用:

        import argparse
      
        parser = argparse.ArgumentParser(description='Process some integers.')
        parser.add_argument('integers', metavar='N', type=int, nargs='+',
                         help='an integer for the accumulator')
        parser.add_argument('--sum', dest='accumulate', action='store_const',
                           const=sum, default=max,
                         help='sum the integers (default: find the max)')
      
        args = parser.parse_args()
        print(args.accumulate(args.integers))
      

      【讨论】:

        【解决方案4】:

        在 bash 中,传递给脚本的参数使用 $# 表示法访问(# 是一个数字。使用 $# 完全一样应该给你传递的参数的数量)。所以如果你想传递参数:

        调用脚本:

        `#script.sh argument`
        

        在脚本内:

        python script.py "$1"
        

        【讨论】:

        • 需要引用"$1"来保留空格
        • 感谢@glennjackman 我已经为未来的访问者更新了代码。