पाइथन ने तर्क के बिना कमांड लाइन के झंडे लगाए


345

मैं अपनी कमांड लाइन आर्ग्स में वैकल्पिक ध्वज कैसे जोड़ सकता हूँ?

जैसे। इसलिए मैं लिख सकता हूं

python myprog.py 

या

python myprog.py -w

मैंने कोशिश की

parser.add_argument('-w')

लेकिन मुझे सिर्फ एक त्रुटि संदेश मिला है

Usage [-w W]
error: argument -w: expected one argument

जो मुझे लगता है कि इसका मतलब है कि यह -w विकल्प के लिए एक तर्क मूल्य चाहता है। सिर्फ एक ध्वज को स्वीकार करने का क्या तरीका है?

मुझे इस प्रश्न पर अपारदर्शी के बजाय http://docs.python.org/library/argparse.html मिल रहा है ।


4
यदि आप अपनी स्क्रिप्ट के लिए केवल 1 ध्वज चाहते हैं, तो sys.argv एक संपूर्ण बहुत आसान होगा। जब तक आपका विशेष रूप से अर्गपर्स सीखने की कोशिश नहीं की जाती है, जो कि एक अच्छा है क्योंकि इसके जानने के लिए एक आसान मॉड्यूल है।
chown

2
जवाब जानने के बाद भी मैं यह नहीं देखता कि मैं इसे प्रलेखन से कैसे समझ सकता था।
एंड्रियास हैफेरबर्ग

जवाबों:


532

जैसा कि आपके पास है, तर्क w कमांड लाइन पर -w के बाद एक मान की उम्मीद कर रहा है। यदि आप केवल एक चर सेट करके स्विच को फ्लिप करना चाहते हैं Trueया False, http://docs.python.org/dev/library/argparse.html#action (विशेष रूप से store_true और store_false) पर एक नज़र डालें

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-w', action='store_true')

जहां action='store_true'तात्पर्य है default=False

इसके विपरीत, आप कर सकते हैं action='store_false', जिसका अर्थ है default=True


3
@Jdog, किसी भी विचार के लिए यह मेरे लिए काम क्यों नहीं करता है? wहमेशा होता है False
इयूलियन ओनोफ्रेई

52

एक त्वरित स्निपेट जोड़ना इसे निष्पादित करने के लिए तैयार है:

स्रोत: myparser.py

import argparse
parser = argparse.ArgumentParser(description="Flip a switch by setting a flag")
parser.add_argument('-w', action='store_true')

args = parser.parse_args()
print args.w

उपयोग:

python myparser.py -w
>> True

-10

यह करने के लिए एक त्वरित तरीका है, इसके अलावा कुछ भी आवश्यकता नहीं होगी sys.. हालांकि कार्यक्षमता सीमित है:

flag = "--flag" in sys.argv[1:]

[1:] यदि पूर्ण फ़ाइल नाम है तो मामले में है --flag


13
बस यह व्यक्त करने के लिए लॉग इन किया कि कैसे एक विचार यह लंबे समय में है। कल्पना करें कि आप जाँच करके शुरू करते हैं कि स्ट्रिंग "--flag" sys.argv में है या नहीं। फिर आप sys.argv [-1] के अंत में देखते हैं कि किस फ़ाइल को खोलना है। अचानक आप एक ऐसी स्थिति के साथ समाप्त हो जाते हैं, जहां यदि आप नाम की एक फ़ाइल खोलने की कोशिश करते हैं --flag, तो यह अप्रत्याशित रूप से व्यवहार करेगा, और इससे भी बुरा यह है कि यह अक्सर सड़क के नीचे सुरक्षा दोष होने पर समाप्त होता है, जब अविश्वसनीय डेटा समाप्त हो रहा है। आर्गव को पारित कर दिया। अंत में, इस विधि को अभी नहीं किया जाना चाहिए। असली arg parsers अभी और अधिक मजबूत हैं ...
timthelion

3
जैसा कि उल्लेख किया गया है, यह समाधान बिल्कुल भी मजबूत नहीं है, लेकिन यह काम करता है यदि आपको इसे जल्दी से सुपर की जरूरत है (उदाहरण के परीक्षण के लिए)। निश्चित रूप से इसे उत्पादन कोड से दूर रखें।
जोनाथन सुदियमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.