2013-01-15 17 views
7

Sto provando a creare uno script bash che passa il proprio argomento su uno script python. Voglio che funzioni così.Passa argomento bash allo script python

Se corro come questo:

script.sh latest 

Poi all'interno dello script bash che esegue uno script python con il "ultimo" l'argomento in questo modo:

python script.py latest 

Allo stesso modo, se lo script bash è eseguire con l'argomento 123 poi lo script python come tale:

python script.py 123 

Qualcuno può aiutarmi a capire come per realizzare questo per favore?

+1

Che cosa hai provato, finora? Passare e usare argomenti in script bash fa parte di qualsiasi tutorial decente. – StoryTeller

risposta

26

In questo caso il trucco consiste nel passare molti argomenti, incluso il caso in cui non ce ne sono, e conservare qualsiasi raggruppamento esistente sulla riga di comando originale.

Quindi, si vuole questi tre casi di lavorare:

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

In realtà non è un modo naturale per fare questo perché la shell è un linguaggio macro, quindi hanno aggiunto un po 'di sintassi magico che solo DTRT.

#!/bin/sh 

python script.py "[email protected]" 
1

In bash, argomenti passati allo script sono accessibili con la notazione $# (# è un numero. Usando $ # esattamente così dovrebbe dare il numero di argomenti passati). Quindi, se si voleva passare gli argomenti:

richiamare lo script:

`#script.sh argument` 

All'interno dello script:

python script.py "$1" 
+2

Devi citare '" $ 1 "' per preservare gli spazi bianchi –

+0

Grazie a @glennjackman Ho aggiornato il codice per i visitatori futuri. – Grambot

6

Nel PythonScript script.py uso getopt.getopt(args, options[, long_options]) per ottenere gli argomenti.

Esempio:

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

Una sostanza appiccicosa parser buit-in è argparse. Puoi usarlo come segue:

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)) 
Problemi correlati