2012-02-25 14 views
9
from sys import argv 
script, lira_cbt, [eur_hedge] = argv 

if eur_hedge == None: 
    #Do x 
else: 
    #Do y 

मैं चाहता हूं कि यह सिर्फ lira_cbt के साथ एक तर्क (x कर रहा है), या दोनों lira_cbt और eur_hedge (y कर रहा है) के साथ चलाने में सक्षम होना चाहता है। क्या यह sys.argv के साथ हासिल किया जा सकता है?sys.argv वैकल्पिक तर्कों को संभाल सकता है?

+1

अपने CLI कि जटिल हो जाता है, तो आप शायद (यदि आप कुछ पुराने संस्करण के साथ फंस रहे हैं या 'optparse')' argparse' का उपयोग शुरू कर देना चाहिए। – delnan

उत्तर

15

बस sys.argv

if len(sys.argv) == 2: 
    # do X 
else: 
    # do Y 
2

आप बस sys.argv की लंबाई की जांच कर सकते हैं।

lira_cbt = sys.argv[1] 
try: 
    eur_hedge = sys.argv[2] 
except IndexError: 
    eur_hedge = None 

if eur_hedge == None: 
    # Do X 
else: 
    # Do Y 

तुम भी के लिए getopt पर एक नज़र ले सकता है:

if len(sys.argv) < 2: 
    # Error, not enough arguments 

lira_cbt = sys.argv[1] 
if len(sys.argv) == 2: 
    # Do X 
else: 
    eur_hedge = sys.argv[2] 
    # Do Y 
+0

लेकिन तर्क को अनपैक करने के लिए अधिक/बहुत अधिक चर को फेंकने के बिना विशेष रूप से यूरो_हेज में मूल्य खींचने का कोई तरीका नहीं है? – Felix

+2

नहीं, ऐसा करने का कोई तरीका नहीं है, जब तक कि आप इसे फ़ंक्शन कॉल में कनवर्ट नहीं करना चाहते हैं और 'def main (script, lira_cbt, eur_hedge = none)' और 'main (* sys.argv) 'जैसे कुछ का उपयोग करना चाहते हैं, जो कि मैं निश्चित रूप से नहीं करूँगा। –

1

एक अन्य विकल्प try का उपयोग कर argv सूची से मान एक्सट्रैक्ट करने के लिए है की लंबाई का उपयोग कमांड लाइन तर्कों का एक अधिक लचीला पार्सर।

+2

ऑप्टपरसे या Argparse getopt से काफी बेहतर होगा! – carl

5

यह एक थ्रो-दूर स्क्रिप्ट से ज्यादा का हिस्सा बनने का है, तो argparse http://docs.python.org/library/argparse.html

का उपयोग कर फिलहाल यह और अधिक जटिल हो जाएगा पर विचार है, लेकिन यह मदद से आप विकल्प आपके कार्यक्रम को स्वीकार करता दस्तावेज रखने और "अनपैक करने के लिए बहुत अधिक मूल्य" के विपरीत उपयोगी त्रुटि संदेश भी प्रदान करें जो उपयोगकर्ता समझ में नहीं आ सकता है।

0

मैं एक वैकल्पिक दृष्टिकोण का सुझाव दे सकते हैं:

from sys import argv 
option_handle_list = ['--script', '--lira_cbt', '--eur_hedge'] 
options = {} 
for option_handle in option_handle_list: 
    options[option_handle[2:]] = argv[argv.index(option_handle) + 1] if option_handle in argv else None 
if options['eur_hedge'] == None: 
    #Do x 
else: 
    #Do y 
+0

हालांकि यह काम कर सकता है, इस कार्य के लिए 'argparse' जैसे मॉड्यूल का उपयोग करना आसान और अधिक पायथनिक दोनों होगा। – YSelf

+0

@ स्वयं मैं आसान/अधिक पारंपरिक समाधान पर बहस नहीं कर रहा हूं। बस मूल प्रश्न का उत्तर दें। –

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