2013-06-18 10 views
5

में उपयोग किए जाने वाले तर्क के रूप में एक मनमानी स्ट्रिंग को पास करें, मैं argparse का उपयोग करके वैकल्पिक तर्क के रूप में एक मनमानी स्ट्रिंग को कैसे परिभाषित करूं?पायथन - Argparse का उपयोग करके, स्क्रिप्ट

उदाहरण:

[[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" 

आदर्श रूप में, मैं कोई फर्क नहीं पर तर्कों की स्थिति चाहते हैं। अर्थात:

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


मार में, मैं जबकि getopts का उपयोग कर ऐसा कर सकते हैं। एक मामले पाश में सभी वांछित स्विच से निपटने के बाद, मैं एक पंक्ति है कि shift $((OPTIND-1)) पढ़ता होगा, और वहाँ से मैं का उपयोग कर सभी शेष तर्क का उपयोग कर सकते मानक $1, $2, $3, आदि ...
करता है कि exisit की तरह कुछ Argparse के लिए?

+3

क्या आप Argparse ट्यूटोरियल के माध्यम से गए थे? जो कुछ भी आप वर्णन कर रहे हैं वह है – SheetJS

+0

आईआईआरसी पर चर्चा नहीं किया गया एकमात्र हिस्सा 'nargs =" * "व्यवहार है (ताकि एक स्थितित्मक तर्क सभी शेष तर्कों को पकड़ सके) – SheetJS

+1

@ निर्क, मुश्किल बात यह है कि यदि आप अभी उपयोग करते हैं 'parse_args', जैसे ही यह "स्थितित्मक" तर्क को देखता है, यह अन्य तर्कों की तलाश करना बंद कर देता है और तर्कसंगत तर्क से अंत तक तर्क एकत्र करता है। ज्यादातर मामलों में यह ठीक है, लेकिन वह अपना पहला और तीसरा उदाहरण तोड़ देगा। – jedwards

उत्तर

6

वास्तव में प्राप्त करने के लिए आप जो खोज रहे हैं, चाल parse_known_args() बजाय parse_args() उपयोग करने के लिए है:

#!/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]) 

संपादित करें:

 
./clargs.py -h 

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

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

ऊपर कोड नीचे दी गई सहायता जानकारी प्रदर्शित करता है

यदि आप उपयोगकर्ता को वैकल्पिक मनमाना तर्क के बारे में सूचित करना चाहते हैं, तो केवल एकमात्र समाधान जिसे मैं सोच सकता हूं वह है ArgumentParser और इसे अपने आप में लिखें।

उदाहरण के लिए:

#!/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 

नोट "उपयोग" पंक्ति में [FOO] के अलावा और "वैकल्पिक तर्क के तहत सहायता में FOO "।

+0

यह अच्छा है, सिवाय इसके कि मैं वैकल्पिक स्ट्रिंग के लिए argparse से अंतर्निहित सहायता संवाद खो देता हूं। – svenglar

+1

यह सच है। एकमात्र समाधान जो मैं सोच सकता हूं वह है ArgumentParser को उपclass और इसे अपने आप में लिखना। ध्यान दें कि इस उछाल के माध्यम से आपको कूदने का एकमात्र कारण यह है कि आप काम करने के लिए तर्कों का कोई आदेश चाहते हैं।मैं ArgumentParser subclassing के उदाहरण के साथ अपना जवाब संपादित कर दूंगा। – jedwards

+0

वाह, धन्यवाद! यह अजीब लगता है कि वैकल्पिक तर्क रखने के लिए argparse में कोई विकल्प नहीं है एक मनमानी स्ट्रिंग ... ओह ठीक है। इस उत्तर के लिए बहुत बहुत धन्यवाद। – svenglar

संबंधित मुद्दे