2012-08-31 14 views
5

Mam obecnie plik Pythona, który wykorzystuje sys.argv [1] do zaakceptowania ciągu znaków w wierszu poleceń. Następnie wykonuje operacje na tym łańcuchu, a następnie zwraca zmodyfikowany ciąg do wiersza poleceń.Pythonowy sposób akceptowania argumentów za pomocą optparse

Chciałbym zaimplementować opcję tryb wsadowy, w których mogę dostarczyć plik ciągów (po jednym w każdym wierszu, FWIW) i ma ona wrócić do linii poleceń, dzięki czemu mogę przekierować wyjście robi coś

$ python script.py -someflag file.txt > modified.txt 

przy jednoczesnym zachowaniu aktualnych możliwości.

Używam tylko wersji 2.6, więc argparse nie jest opcją. Samouczki, które widziałem, używają argparse, getopt lub zagłębiają się w przykłady, które są zbyt skomplikowane/nie mają zastosowania.

Jaki jest najlepszy sposób sprawdzenia danych wejściowych i odpowiedniego działania?

+1

argparse jest jeszcze opcja , nie jest wbudowany w 2.6. Nadal możesz zainstalować go jak dowolny pakiet 3rd party (na przykład 'pip install argparse'). –

Odpowiedz

6

argparse jest nadal opcją, nie jest wbudowana w wersję 2.6. Nadal możesz zainstalować go tak, jak dowolny pakiet 3rd party (na przykład, używając easy_install argparse).

Przykładowy kod dla tego byłoby:

import sys 
import argparse 

p = argparse.ArgumentParser(description="script.py") 
p.add_argument("-s", dest="string") 
p.add_argument("-f", dest="infile") 

args = p.parse_args() 

if args.infile == None and args.string == None: 
    print "Must be given either a string or a file" 
    sys.exit(1) 
if args.infile != None and args.string != None: 
    print "Must be given either a string or a file, not both" 
    sys.exit(1) 
if args.infile: 
    # process the input file one string at a time 
if args.string: 
    # process the single string 
+0

Dziękujemy! Nie wiedziałem, że argparse jest stroną trzecią przed 2.7, a kod jest dodatkową premią. Prawdopodobnie przyjmiemy to, gdy tylko będę miał okazję go wypróbować :) – verbsintransit

+0

Nie ma za co. argparse to bardzo potężne i intuicyjne narzędzie, które bardzo polecam. –

+1

Podczas testowania z 'None', jest bardziej pytonowo używać' is' i 'is not' do testowania dla tej wartości:' if args.infile ma wartość None, a args.string ma None: 'and' if args.infile is nie Brak i args.string nie jest Brak: '. –

3

Zobacz moją odpowiedź tutaj: What's the best way to grab/parse command line arguments passed to a Python script?

jako skrót, oto niektóre przykładowy kod:

import optparse 

parser = optparse.OptionParser() 

parser.add_option('-q', '--query', 
    action="store", dest="query", 
    help="query string", default="spam") 

options, args = parser.parse_args() 

print 'Query string:', options.query 
+0

** Uwaga **: Używanie * optparse * jest odradzane od wersji Pythona 2.7. Moduł optparse jest przestarzały i nie będzie rozwijany; rozwój będzie kontynuowany z modułem * argparse *. Więcej informacji można znaleźć w [PEP 0389] (http://www.python.org/dev/peps/pep-0389/). – shakaran