2016-08-23 8 views
5

मैं इस तरह मेरी स्क्रिप्ट का उपयोग करना चाहते:argparse: परस्पर अनन्य तर्क वैकल्पिक कैसे करें?

python test.py run 
python test.py stop 

और मेरे कोड इस तरह है:

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group(required=True) 
command_group.add_argument('run', help='run it', action='store_true') 
command_group.add_argument('stop', help='stop it', action='store_true') 

जब मैं इसे निष्पादित, एक अपवाद उठाया है:

ValueError: mutually exclusive arguments must be optional 
तो

जब मैं प्रत्येक तर्क जोड़ता हूं तो मैं required=False जोड़ने का प्रयास करता हूं। फिर मुझे एक और अपवाद मिलता है:

TypeError: 'required' is an invalid argument for positionals 

मैं उलझन में हूं।

+0

['विकल्प'] (https://docs.python.org/3/library/argparse.html#choices) के बजाय म्यूटेक्स समूह का उपयोग क्यों करें? – kennytm

उत्तर

4

ऐसा करने का एक बेहतर तरीका एक एकल स्थितित्मक तर्क जोड़ना है जिसमें दो विकल्प हो सकते हैं। जब से तुम यह वैकल्पिक होना चाहता हूँ, nargs='?' उपयोग करते हैं, जिसका अर्थ है शून्य या एक बार:

parser = argparse.ArgumentParser() 
parser.add_argument('run', help='run or stop', nargs='?', choices=('run', 'stop')) 

हैं run दिया जाता है, मूल्य 'run' हो जाएगा। यदि stop दिया गया है, तो यह 'stop' होगा। यदि न तो दिया गया है, तो यह None होगा।


यदि आप वास्तव में एक पारस्परिक-विशिष्ट समूह का उपयोग करना चाहते हैं, तो मुझे यकीन नहीं है कि आप इसे ठीक से कैसे कर सकते हैं। आप , तथापि, उनमें वैकल्पिक तर्क एक हाइफन जोड़कर बना सकते हैं:

import argparse 

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('-run', help='run it', action='store_true') 
command_group.add_argument('-stop', help='stop it', action='store_true') 

बेशक उस के साथ समस्या उपयोगकर्ता भी हाइफन प्रदान करने की जरूरत है, लेकिन है कि समस्या की तरह आप अगर उम्मीद कर सकते हैं वह यह है कि आप खुद को इस तरह सीमित करते हैं।

+0

धन्यवाद, यह काम करता है। लेकिन अगर मैं वास्तव में म्यूटेक्स समूह का उपयोग करना चाहता हूं तो मुझे कोड कैसे लिखना चाहिए? – huron

+0

@huron: मुझे यकीन नहीं है कि आप कर सकते हैं। मेरा संपादित उत्तर देखें। – zondo

+0

मैं देखता हूं। धन्यवाद! – huron

1

आप इस nargs='?'

parser = argparse.ArgumentParser() 
command_group = parser.add_mutually_exclusive_group() 
command_group.add_argument('run', help='run it', nargs='?') 
command_group.add_argument('stop', help='stop it', nargs='?') 

साथ प्राप्त कर सकते हैं जो आपको

python test.py run 

या

python test.py stop 

लेकिन नहीं

के साथ कार्यक्रम फोन करने की अनुमति होगी
python test.py run stop 
संबंधित मुद्दे