2013-06-18 16 views
5

Argparse'yi kullanarak isteğe bağlı bağımsız değişken olarak isteğe bağlı bir dizeyi nasıl tanımlarım?python - Argparse'yi kullanarak, betikte kullanılacak bağımsız dizgeyi argüman olarak iletin

Örnek:

[[email protected]]$ ./script.py FOOBAR -a -b 
Running "script.py"... 
You set the option "-a" 
You set the option "-b" 
You passed the string "FOOBAR" 

İdeal olarak, ben önemli değil bağımsız değişken konumunu istiyorum. yani: getopts kullanırken

./script.py -a FOOBAR -b == ./script.py -a -b FOOBAR == ./script.py FOOBAR -a -b


Bash, bunu gerçekleştirmek için. Bir vaka döngüsünde istenen tüm anahtarları taşıma sonra shift $((OPTIND-1)) okuyan bir çizgi olurdu ve oradan kullanıyorum kalan tüm argümanları erişebilir standart $1, $2, $3, vb ...
mu o exisit gibi bir şey Argparse için?

+3

Argparse eğitimini incelediniz mi? Tanımladığınız her şey var: – SheetJS

+0

Burada anlatılan tek kısım iirc, 'nargs =" * "' davranışıdır (böylece, bir konumsal argüman, kalan argümanların tümünü alabilir) – SheetJS

+1

@Nirk, Zor olan şey sadece parse_args, bir "konumsal" argümanı görür görmez, diğer argümanları aramayı durdurur ve argümanları konumsal argümandan sonuna kadar toplar. Bu çoğu durumda iyidir, ancak onun 1. ve 3. örneğini bozar. – jedwards

cevap

6

aradığınız tam olarak ne elde etmek için, hile parse_known_args() yerine parse_args() kullanmaktır:

#!/bin/env python 

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-a', action="store_true") 
parser.add_argument('-b', action="store_true") 

opts = parser.parse_known_args() 
# Print info about flags 
if opts[0].a: print('You set the option "-a"') 
if opts[0].b: print('You set the option "-b"') 
# Collect remainder (opts[1] is a list (possibly empty) of all remaining args) 
if opts[1]: print('You passed the strings %s' % opts[1]) 

DÜZENLEME:

 
./clargs.py -h 

usage: clargs_old.py [-h] [-a] [-b] 

optional arguments: 
    -h, --help show this help message and exit 
    -a 
    -b 
:

Yukarıdaki kod aşağıdaki yardım bilgilerini görüntüler

Kullanıcıya isteğe bağlı isteğe bağlı argüman hakkında bilgi vermek isterseniz, düşünebildiğim tek çözüm ArgumentParser alt sınıfını ve Kendine yaz. Örneğin

:

şu yardım bilgilerini görüntüler
#!/bin/env python 

import os 
import argparse 

class MyParser(argparse.ArgumentParser): 
    def format_help(self): 
     help = super(MyParser, self).format_help() 
     helplines = help.splitlines() 
     helplines[0] += ' [FOO]' 
     helplines.append(' FOO   some description of FOO') 
     helplines.append('') # Just a trick to force a linesep at the end 
     return os.linesep.join(helplines) 

parser = MyParser() 
parser.add_argument('-a', action="store_true") 
parser.add_argument('-b', action="store_true") 

opts = parser.parse_known_args() 
# Print info about flags 
if opts[0].a: print('You set the option "-a"') 
if opts[0].b: print('You set the option "-b"') 
# Collect remainder 
if opts[1]: print('You passed the strings %s' % opts[1]) 

:

 
./clargs.py -h 

usage: clargs.py [-h] [-a] [-b] [FOO] 

optional arguments: 
    -h, --help show this help message and exit 
    -a 
    -b 
    FOO   some description of FOO 

Not "kullanım" satırında [FOO] eklenmesi ve "isteğe bağlı argümanlar altında yardım FOO ".

+0

Bu, isteğe bağlı dize için argparse'den yerleşik yardım iletişim kutusunu kaybetmem dışında iyi. – svenglar

+1

Bu doğrudur. Düşünebildiğim tek çözüm ArgumentParser alt sınıfını yazmak ve kendin yazmak. Bu kasnaktan atlamanızın tek sebebi, argümanların çalışmasının herhangi bir sıralamasını istemiş olmanızdır.Cevabımı ArgumentParser alt sınıfının bir örneğiyle düzenleyeceğim. – jedwards

+0

Vay, teşekkürler! Argparse'de isteğe bağlı bir argümanın keyfi bir dizeye sahip olması için bir seçenek olmaması garip görünüyor. Bu cevap için çok teşekkür ederim. – svenglar

İlgili konular