2013-01-15 87 views
7

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

如果我运行它,因为这:

script.sh latest 

然后bash脚本中运行Python脚本,像这样的“最新”的说法:

python script.py latest 

同样,如果bash脚本是运行参数123然后python脚本,因此:

python script.py 123 

任何人都可以帮助我了解请完成此操作?

+1

到目前为止,你有什么试过?在bash脚本中传递和使用参数是任何体面教程的一部分。 – StoryTeller

回答

26

在这种情况下,诀窍是通过您拥有的许多参数,包括没有的情况,并保留原始命令行上存在的任何分组。

所以,你要这三种情况下的工作:

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

是不是真的这样做,因为外壳是一个宏语言以自然的方式,所以他们增加了一些神奇的语法会只是DTRT。

#!/bin/sh 

python script.py "[email protected]" 
1

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

调用脚本:

`#script.sh argument` 

在该脚本:

python script.py "$1" 
+2

需要引用''$ 1“'来保留空格 –

+0

谢谢@glennjackman我已经更新了未来访问者的代码。 – Grambot

6

在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() 
2

一个非常咕BUIT解析器是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))