2009-02-20 10 views
23

कमांड लाइन तर्कों को संसाधित करने के लिए एक आसान अभिव्यक्ति क्या होगी यदि मुझे 001 या 999 की तरह कुछ उम्मीद है (चलिए उम्मीदों को 001 ... 999 रेंज इस समय के लिए सीमित करें), और कुछ अन्य तर्क पारित किए गए हैं, और अनदेखा करना चाहते हैं कोई अप्रत्याशित?मैं पायथन में कमांड लाइन तर्क कैसे संसाधित कर सकता हूं?

मैं समझता हूँ कि यदि उदाहरण के लिए मैं जानने के लिए कि "डिबग" पैरामीटर के बीच पारित किया गया था यह ऐसा ही कुछ हो जाएगा की जरूरत है:

if 'debug' in argv[1:]: 
    print 'Will be running in debug mode.' 

कैसे पता लगाने के लिए अगर 009 या 575 पारित किया गया था?

उन सभी उम्मीद कर रहे हैं कॉल:

python script.py 
python script.py 011 
python script.py 256 debug 
python script.py 391 xls 
python script.py 999 debug pdf 

इस बिंदु पर मुझे लगता है कि जैसे कॉल के बारे में परवाह नहीं है:

python script.py 001 002 245 568 
python script.py some unexpected argument 
python script.py 0001 
python script.py 02 

... पहले एक - एक से अधिक की वजह से "सांख्यिक "तर्क; दूसरा - क्योंकि ... अच्छी तरह से, अप्रत्याशित तर्क; तीसरा और चौथाई - गैर-3-अंकों के तर्कों के कारण।

+0

जांच इस एक http://stackoverflow.com/questions/25605380/passing-directory-to-python-script-as-command-line-argument/25605529#25605529 –

उत्तर

29

दूसरों के रूप में उत्तर दिया, optparse सबसे अच्छा विकल्प है, लेकिन अगर आप सिर्फ त्वरित कोड चाहते हैं कुछ इस तरह का प्रयास करें:

import sys, re 

first_re = re.compile(r'^\d{3}$') 

if len(sys.argv) > 1: 

    if first_re.match(sys.argv[1]): 
     print "Primary argument is : ", sys.argv[1] 
    else: 
     raise ValueError("First argument should be ...") 

    args = sys.argv[2:] 

else: 

    args =() 

# ... anywhere in code ... 

if 'debug' in args: 
    print 'debug flag' 

if 'xls' in args: 
    print 'xls flag' 

संपादित: यहाँ एक optparse उदाहरण है क्योंकि बहुत से लोग वास्तव में बिना optparse का जवाब दे रहे हैं समझाते हुए, या समझाते हुए कि आपको इसे काम करने के लिए क्या बदलना है।

ऑप्टपर का उपयोग करने का प्राथमिक कारण यह है कि यह आपको बाद में विस्तार के लिए अधिक लचीलापन देता है, और आपको कमांड लाइन पर अधिक लचीलापन देता है। दूसरे शब्दों में, आपके विकल्प किसी भी क्रम में प्रकट हो सकते हैं और उपयोग संदेश स्वचालित रूप से जेनरेट किए जाते हैं। हालांकि इसे ऑप्टपर के साथ काम करने के लिए आपको वैकल्पिक तर्कों के सामने '-' या '-' रखने के लिए अपने विनिर्देशों को बदलने की आवश्यकता है और आपको सभी तर्कों को किसी भी क्रम में होने की अनुमति देनी होगी।

तो यहाँ एक उदाहरण optparse का उपयोग कर रहा है:

import sys, re, optparse 

first_re = re.compile(r'^\d{3}$') 

parser = optparse.OptionParser() 
parser.set_defaults(debug=False,xls=False) 
parser.add_option('--debug', action='store_true', dest='debug') 
parser.add_option('--xls', action='store_true', dest='xls') 
(options, args) = parser.parse_args() 

if len(args) == 1: 
    if first_re.match(args[0]): 
     print "Primary argument is : ", args[0] 
    else: 
     raise ValueError("First argument should be ...") 
elif len(args) > 1: 
    raise ValueError("Too many command line arguments") 

if options.debug: 
    print 'debug flag' 

if options.xls: 
    print 'xls flag' 

optparse के साथ यहाँ मतभेद और अपने कल्पना अब आप की तरह कमांड लाइन हो सकता है है:

python script.py --debug --xls 001 

और आप आसानी से नए विकल्प जोड़ सकते हैं parser.add_option()

+4

लेकिन ध्यान दें: ऑप्टपरसे को "पायथन] संस्करण 2.7 के बाद से हटा दिया गया है: ऑप्टपर मॉड्यूल को हटा दिया गया है और आगे विकसित नहीं किया जाएगा; विकास Argparse मॉड्यूल के साथ जारी रहेगा।" देखें: http://docs.python.org/2/library/optparse.html – kkurian

15

optparse मॉड्यूल पर एक नज़र डालें। Sys.argv के साथ व्यवहार करना वास्तव में सरल सामान के लिए ठीक है, लेकिन यह जल्दी से हाथ से बाहर हो जाता है।

ध्यान दें कि यदि आप अपना तर्क प्रारूप थोड़ा बदल सकते हैं तो आपको ऑप्टर का उपयोग करना आसान हो सकता है; जैसे debug--debug और xls--xls या --output=xls के साथ प्रतिस्थापित करें।

+0

मुझे यकीन है कि यह है नहीं कर रहा हूँ इसके लायक है जब ओपी सिर्फ तर्कों का उपयोग कर रहा है, विकल्प नहीं। –

+4

ध्यान दें कि optparse को बदल दिया गया है [argparse] (http://docs.python.org/library/argparse.html#module-argparse) –

2

optparse कमांड लाइन को पार्स करने के लिए आपका सबसे अच्छा दोस्त है। argparse में भी देखें; यह मानक पुस्तकालय में नहीं है, हालांकि।

+2

बस एक नोट के रूप में [argparse] (http://docs.python.org /2.7/library/argparse.html) अब पायथन 2.7 में मानक है और यहां तक ​​कि 2.6.8 तक पोर्ट किया गया है। [Optparse दस्तावेज़ीकरण] के अनुसार (http://docs.python.org/2/library/optparse.html), ऑप्टपरसे अब बहिष्कृत है। –

2

यदि आप वास्तविक कमांड लाइन स्विच को कार्यान्वित करना चाहते हैं, तो getopt एक नज़र दें। यह भी उपयोग करने के लिए अविश्वसनीय रूप से सरल है।

+0

मैं नहीं कहूंगा कि गेटोपट इतना आसान है - निश्चित रूप से, यह पार्सिंग मैन्युअल रूप से करने से बेहतर है, लेकिन यह कुछ सी कोड का एक बंदरगाह है जो वास्तव में पायथन की ताकत का लाभ नहीं लेता है। मैं लगभग हमेशा getopt पर optparse की सिफारिश करेंगे। –

0

वान गैले तर्क के खिलाफ नियमित अभिव्यक्ति का उपयोग करने में काफी हद तक सही है। हालांकि, ऑप्टर्स का उपयोग करते समय सबकुछ एक विकल्प बनाने के लिए बिल्कुल जरूरी नहीं है, जो sys.argv विकल्पों और तर्कों में विभाजित करता है, इस पर आधारित है कि "-" या "-" आगे है या नहीं। कुछ उदाहरण कोड सिर्फ तर्क के माध्यम से जाना:

import sys 
import optparse 

claParser = optparse.OptionParser() 
claParser.add_option(
(opts, args) = claParser.parse_args() 
if (len(args) >= 1): 
    print "Arguments:" 
    for arg in args: 
    print " " + arg 
else: 
    print "No arguments" 
sys.exit(0) 

हाँ, आर्ग सरणी में एक ही तरीके के रूप में sys.argv होगा, लेकिन आसानी से विकल्प जोड़ने के लिए यदि आवश्यक हो तो जोड़ दिया गया है की क्षमता पार्स किया गया है। Optparse के बारे में अधिक जानकारी के लिए, relevant Python doc देखें।

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