2013-01-15 258 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))