2012-10-10 12 views
114

ऑप्टपरसे, पुराना संस्करण केवल सभी अपरिचित तर्कों को अनदेखा करता है और चलता है। ज्यादातर स्थितियों में, यह आदर्श नहीं है और Argparse में बदला गया था। लेकिन ऐसी कुछ स्थितियां हैं जहां आप किसी भी अपरिचित तर्क को अनदेखा करना चाहते हैं और जिन्हें आपने निर्दिष्ट किया है उन्हें पार्स करना चाहते हैं।पायथन Argparse अज्ञात तर्कों को अनदेखा करते हैं

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

parser = argparse.ArgumentParser() 
parser.add_argument('--foo', dest="foo") 
parser.parse_args() 

$python myscript.py --foo 1 --bar 2 
error: unrecognized arguments: --bar 

वहाँ वैसे भी इस अधिलेखित करने के लिए है?

+5

यदि आप किसी अन्य प्रोग्राम में एक रैपर लिख रहे हैं, तो बहुत आसान है, और आप कुछ तर्कों को कैप्चर और संशोधित करना चाहते हैं, लेकिन बाकी को पास करना चाहते हैं! –

+0

बिल्कुल मैं यहां @AlanDeSmet क्यों समाप्त हुआ! खुशी है कि मैं कुछ पागल करने की कोशिश नहीं कर रहा हूं :) – dwanderson

उत्तर

212

args, unknown = parser.parse_known_args() 

उदाहरण के लिए साथ

args = parser.parse_args() 

बदलें,

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo') 
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam']) 
print(args) 
# Namespace(foo='BAR') 
print(unknown) 
# ['spam'] 
+9

+1 - पता नहीं था कि 'parse_known_args' – avasal

+2

जैसी कोई चीज़ नहीं थी और न ही मैंने किया! मैंने इसे दस्तावेज़ों में भी याद किया http://docs.python.org/library/argparse.html?highlight=argparse#partial-parsing। धन्यवाद – jdborg

+1

यह तब हुआ जब पारसीर्गों के साथ नोजेटेट का उपयोग करने की कोशिश की गई (यह नोजेटेस्ट तर्कों का उपयोग करने से इनकार कर दिया गया) कारण था क्योंकि मैं 'parser.parse_args ([]) 'के बजाय' parser.parse_args (none]) कर रहा था मेरे परीक्षण –

5

असल argparse अभी भी _unrecognized_args "अनदेखा" है। जब तक ये "अपरिचित" तर्क डिफ़ॉल्ट उपसर्ग का उपयोग न करें, तो आपको पार्सर से कोई शिकायत नहीं सुनाई जाएगी।

@ anutbu की कॉन्फ़िगरेशन का उपयोग करते हुए लेकिन मानक parse.parse_args() के साथ, यदि हम निम्नलिखित तर्कों के साथ हमारे प्रोग्राम को निष्पादित करना चाहते हैं।

$ program --foo BAR a b +cd e 

हमारे पास काम करने के लिए यह नामांकित डेटा संग्रह होगा।

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR') 

अगर हम डिफ़ॉल्ट उपसर्ग - नजरअंदाज कर हम ArgumentParser बदल सकते हैं और तय करते हैं कि हम बजाय हमारे "मान्यता प्राप्त" तर्क के लिए एक + उपयोग करने के लिए जा रहे हैं सकता है चाहता था।

parser = argparse.ArgumentParser(prefix_chars='+') 
parser.add_argument('+cd') 

समान आदेश का उत्पादन करेगा

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e') 

अपने पाइप में डाल कि और धूम्रपान =)

एन ज्वॉय!

14

यदि आप उनका उपयोग करना चाहते हैं तो आप शेष हिस्सों को parser.add_argument('args', nargs=argparse.REMAINDER) के साथ एक नए तर्क में डाल सकते हैं।

+0

यह 'parse_args()' के साथ काम करता है और उसे 'parse_known_args() '(पायथन 2.7 पर) की आवश्यकता नहीं है। – OozeMeister

+2

argparse.REMAINDER का उपयोग लंबे समय से चलने वाली बग से भरा हुआ प्रतीत होता है। मैं निश्चित रूप से इसे काम नहीं कर सकता। parse_known_args() एक अच्छा विकल्प है। – Matt

+0

आज एक लंबे समय से स्थायी REMAINDER बग में भाग गया: https://bugs.python.org/issue17050 –

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

  • कोई संबंधित समस्या नहीं^_^