2013-04-02 7 views
22

में वैकल्पिक वैकल्पिक बनाने के लिए कैसे मैं अपने प्रोजेक्ट के इन आमंत्रणों को बनाना चाहता हूं, और कोई अन्य नहीं।python argparse

$ python3 myprog.py -i infile -o outfile 
$ python3 myprog.py -o outfile 
$ python3 myprog.py -o 
$ python3 myprog.py 

विशेष रूप से मैं इसे अविनाशी निर्दिष्ट करने के लिए अवैध बनाना चाहता हूं लेकिन आउटफाइल नहीं।

तीसरे मामले में, आउटफाइल के लिए एक डिफ़ॉल्ट नाम माना जाता है, "out.json।" दूसरे, तीसरे और चौथे मामलों में, इनपुट फ़ाइल के लिए एक डिफ़ॉल्ट नाम माना जाता है, "file.n.json", जहां n एक पूर्णांक संस्करण संख्या है। चौथे मामले में आउटपुट फ़ाइल "file.n + 1.json" होगी जहां n + 1 इनपुट फ़ाइल पर एक से बड़ा संस्करण संस्करण है। मेरी कोड के प्रासंगिक अनुभाग है:

import argparse 

parser = argparse.ArgumentParser(description="first python version") 
parser.add_argument('-i', '--infile', nargs=1, type=argparse.FileType('r'), help='input file, in JSON format') 
parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), default='out.json', help='output file, in JSON format') 

args = parser.parse_args() 

print("Here's what we saw on the command line: ") 
print("args.infile",args.infile) 
print("args.outfile",args.outfile) 

if args.infile and not args.outfile: 
    parser.error("dont specify an infile without specifying an outfile") 
elif not args.infile: 
    print("fetching infile") 
else: # neither was specified on the command line 
    print("fetching both infile and outfile") 

समस्या है, जब मैं

$ python3 myprog.py -i infile.json 

बजाय पार्सर त्रुटि मैं के लिए आशा व्यक्त की चलाते हैं, तो मैं मिलता है:

Here's what we saw on the command line: 
args.infile [<_io.TextIOWrapper name='infile.json' mode='r' encoding='UTF-8'>] 
args.outfile <_io.TextIOWrapper name='out.json' mode='w' encoding='UTF-8'> 
fetching both infile and outfile 

... जो बताता है कि यद्यपि कमांड लाइन पर "-o" नहीं था, फिर भी ऐसा लगता था कि वहां था।

+0

तीसरे और चौथे मामले के बीच क्या अंतर है? क्या खड़ा है? –

+0

चौथा मामला डिफ़ॉल्ट इन्फाइल और आउटफाइल नामों का उपयोग करेगा (विशेष रूप से file.n.json और file.n + 1.json, यानी संस्करण संख्या वाले संस्करणों के साथ)। ये "out.json" से अलग हैं जो "-o" विकल्प के साथ तीसरा मामला होगा। मैंने इसे इंगित करने के लिए ऊपर दिए गए पाठ को संशोधित किया है। – user1416227

+0

चौथा मामला '- इनपुट' विकल्प के रूप में काम करने के लिए कैसे डिफ़ॉल्ट है? – maxschlepzig

उत्तर

10

आपने आउटफाइल के लिए एक डिफ़ॉल्ट तर्क निर्दिष्ट किया है। -o विकल्प आदेश पंक्ति पर निर्दिष्ट नहीं है

parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), default='out.json', help='output file, in JSON format') 

हैं, तो आर्ग पार्सर डिफ़ॉल्ट तर्क सम्मिलित करता है।

बदलें इस के लिए:

parser.add_argument('-o', '--outfile', nargs='?', type=argparse.FileType('w'), help='output file, in JSON format') 

और आपकी अपेक्षा के अनुरूप बातें काम करना चाहिए।


आप एक फ़ाइल नाम के बिना, -o निर्दिष्ट करने के लिए सक्षम होना चाहते हैं, तो आप शायद कुछ की तरह हैं:

out_file = args.out if args.out is not None else 'json.out'

मुझे यकीन है कि अगर प्रासंगिक पैरामीटर हो जाएगा नहीं कर रहा हूँ None या '' (यानी, खाली स्ट्रिंग) यदि आप पैरामीटर के बिना -o निर्दिष्ट करते हैं - मुझे संदेह है कि यह None है, लेकिन मुझे निश्चित रूप से पता नहीं है। सुनिश्चित करने के लिए आपको इसका परीक्षण करना होगा।

मुझे नहीं पता कि Argparse के साथ अतिरिक्त तर्क के बिना इसे कैसे किया जाए।

+1

यह लगभग वही है जो मैं चाहता हूं। शेष समस्या यह है कि मैं '$ python3 myprog.py -o' को कार्य करने के लिए चाहता हूं जैसे कि मैंने' $ python3 myprog.py -o out.json' चलाया था। क्या आप सुझाव दे सकते हैं कि ऐसा कैसे किया जाए? – user1416227

+0

धन्यवाद! मैंने सोचा था कि मैं इसे Argparse के साथ कर सकता था। – user1416227

+0

यह उत्तर प्रश्न से तीसरे मामले की आवश्यकताओं को अनदेखा करता है। Maxpari के साथ तीसरा मामला कैसे कार्यान्वित किया जा सकता है के लिए maximi का जवाब देखें। अंतिम असाइनमेंट मान्य पायथन वाक्यविन्यास भी मान्य नहीं है। – maxschlepzig

13

एक ऐड-ऑन चयनित जवाब करने के लिए के रूप में:

एक फ़ाइल निर्दिष्ट किए बिना -o चलाने का विकल्प, constnargs='?' के साथ संयुक्त का उपयोग किया जा सकता है।

डॉक्स से

:

add_argument() विकल्प तार के साथ कहा जाता है जब (जैसे -f या --foo) और nargs = '?'। यह एक वैकल्पिक तर्क बनाता है जिसे शून्य या एक कमांड लाइन तर्क द्वारा का पालन किया जा सकता है।कमांड लाइन को पार्स करते समय, यदि विकल्प स्ट्रिंग का सामना करने के बाद कोई कमांड-लाइन तर्क नहीं है, तो इसके बजाय कॉन्स्ट का मान माना जाएगा। उदाहरण के लिए नर्ग विवरण देखें।

+0

यह सही उत्तर होना चाहिए। धन्यवाद!! – jbo5112