2009-10-07 16 views
6

पायथन के getopt (मुझे लगता है) पर प्रलेखन के अनुसार विकल्प फ़ील्ड को getopt() फ़ंक्शन के रूप में व्यवहार करना चाहिए। हालांकि मैं अपने कोड के लिए वैकल्पिक पैरामीटर सक्षम करने के लिए प्रतीत नहीं कर सकते हैं: मेंक्या विकल्प के लिए वैकल्पिक पैरामीटर को संभालने के लिए पाइथन के गेटोपेट को मनाने के लिए वैसे भी है?

#!/usr/bin/python 
import sys,getopt 

if __name__ == "__main__": 
    try: 
     opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="]) 
    except getopt.GetoptError, err: 
     print str(err) 
     sys.exit(1) 

    for o,a in opts: 
     if o in ("-v", "--verbose"): 
      if a: 
       verbose=int(a) 
      else: 
       verbose=1 
      print "verbosity is %d" % (verbose) 

परिणाम:

$ ./testopt.py -v 
option -v requires argument 
$ ./testopt.py -v 1 
verbosity is 1 

उत्तर

8

getopt वैकल्पिक पैरामीटर का समर्थन नहीं करता। लंबे विकल्प के मामले में आप कर सकते हैं:

$ ./testopt.py --verbose= 

जिसके परिणामस्वरूप खाली-स्ट्रिंग मान होगा।

आप अधिक लचीला होने के लिए argparse मॉड्यूल पा सकते हैं।

5

दुर्भाग्य से, कोई रास्ता नहीं है। optparse docs से:

आमतौर पर, एक दिया गया विकल्प या तो तर्क लेता है या नहीं। बहुत से लोग एक "वैकल्पिक विकल्प तर्क" सुविधा चाहते हैं, जिसका अर्थ यह है कि कुछ विकल्प तर्क देंगे यदि वे इसे देखते हैं, और यदि वे नहीं करेंगे। यह कुछ हद तक विवादास्पद है, क्योंकि यह अस्पष्ट पार्सिंग करता है: यदि "-a" एक वैकल्पिक तर्क लेता है और "-b" पूरी तरह से एक और विकल्प है, तो हम "-ab" की व्याख्या कैसे करते हैं? इस अस्पष्टता के कारण, optparse इस सुविधा का समर्थन नहीं करता है।

संपादित करें: उफ़, कि optparse मॉड्यूल नहीं getopt मॉड्यूल के लिए है, लेकिन तर्क क्यों न मॉड्यूल "वैकल्पिक विकल्प तर्क" दोनों के लिए एक ही है।

+0

optparse डॉक्स है कि;) – SilentGhost

+0

हाँ मैं सिर्फ देखा है कि, "गलत टैब की क्लासिक मामले "सिंड्रोम। हालांकि, मुझे अभी भी लगता है कि यह तर्क गेटोपेट के लिए भी सापेक्ष है। –

+0

इसके अलावा, लंबे विकल्पों में वैकल्पिक तर्कों को अनजाने में हो सकता है; "--foo" बनाम "--foo = arg"। पाइथन इसका समर्थन करने के लिए प्रकट नहीं होता है, जो बहुत खराब है; स्क्रैच से कुछ को पुन: कार्यान्वित करने के आधा रास्ते का एक लक्षण ... –

0

यदि आप संस्करण 2.3 या बाद में उपयोग कर रहे हैं, तो आप इसके बजाय optparse मॉड्यूल को आजमा सकते हैं, क्योंकि यह "अधिक सुविधाजनक, लचीला और शक्तिशाली ...", साथ ही साथ नया है। हां, जैसा कि पिनट ने उत्तर दिया, वैसे ही यह संभव नहीं है कि आप जो चाहते हैं उसे प्राप्त करें।

+0

'optparser' दस्तावेज़ों को छोड़कर 45 मिनट पहले पेंट द्वारा पोस्ट किया गया था! – SilentGhost

+0

@SilentGhost: पेंट के उत्तर के पढ़ने में, मुझे get_opt पर ऑप्टपर की सिफारिश करने की कोई भी चीज़ नहीं दिखाई देती है, जो मैं प्राप्त कर रहा था। बेशक, मैंने मूल रूप से अच्छी तरह से व्याख्या नहीं की, लेकिन ऐसा करने के लिए संपादित किया है। – PTBNL

+0

ऑप्टपरसे विशेष रूप से कहता है कि यह विकल्पों के वैकल्पिक पैरामीटर का समर्थन नहीं करता है। – stsquad

2

आप इस तरह getopt के साथ एक वैकल्पिक पैरामीटर कर सकते हैं:

import getopt 
import sys 

longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env=']) 
argDict = dict(longopts) 

if argDict.has_key('--env') and argDict['--env'] == 'prod': 
    print "production" 
else: 
    print "sandbox" 

उपयोग:

$ python scratch.py --env=prod 
production 

$ python scratch.py --env=dev 
sandbox 

$ python scratch.py 
sandbox 
0

अजगर के getopt वास्तव में आवश्यकता के द्वारा जीएनयू getopt की तरह वैकल्पिक args, का समर्थन करना चाहिए '=' में इस्तेमाल किया जा पैरामीटर निर्दिष्ट करते समय। अब आप इसे आसानी से अनुकरण कर सकते हैं, इस बाधा के साथ पूर्ण रूप से बदल रहा है - विकल्प - विकल्प =

आईई। आप इस प्रकार निर्दिष्ट कर सकते हैं कि --option एक तर्क, और फिर समायोजित --option --option की आवश्यकता =:

for i, opt in enumerate(sys.argv): 
    if opt == '--option': 
     sys.argv[i] = '--option=' 
    elif opt == '--': 
     break 
संबंधित मुद्दे

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