2011-12-07 18 views
5
में sys.argv साथ संयोजन के रूप में उपयोग करते हुए argparse

मैं वर्तमान में एक स्क्रिप्ट है, जो फ़ाइल का उपयोग करता है sys.argv चर इस तरह के माध्यम से ग्लोबिंग है:अजगर

if len(sys.argv) > 1: 
     for filename in sys.argv[1:]: 

यह फाइलों का एक समूह के प्रसंस्करण के लिए महान काम करता है; हालांकि, मैं इसे argparse मॉड्यूल के साथ भी उपयोग करना चाहता हूं।

[email protected]:~$ myScript.py --filter=xyz *.avi 

किसी को भी ऐसा करते हैं, या कैसे आगे बढ़ना है पर कुछ संकेत करने की कोशिश की है: तो, मैं अपने कार्यक्रम निम्नलिखित की तरह कुछ संभाल करने के लिए सक्षम होने के लिए चाहते हैं?

+1

[argparse के साथ आंशिक पार्सिंग?] (Http://docs.python.org/dev/library/argparse.html#partial-parsing) – ig0774

+1

आपको 'लेन (sys.argv) 'सामान से छुटकारा पाना चाहिए और बस 'argparse'' sys.argv' के साथ बातचीत करने दें, कार्यक्षमता वहां है। – wim

उत्तर

15

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

फ़ाइल p.py

import argparse 

parser = argparse.ArgumentParser(description='SO test.') 
parser.add_argument('--doh', action='store_true') 
parser.add_argument('files', nargs='*') # This is it!! 
args = parser.parse_args() 
print(args.doh) 
print(args.files) 

टिप्पणी की रेखा से ऊपर की उम्मीद पार्सर सूचित एक अपरिभाषित संख्या> = 0 (nargs ='*') स्थितित्मक तर्क के।

कमांड लाइन से स्क्रिप्ट चल रही है इन outputs देता है:

$ ./p.py --doh *.py 
True 
['p2.py', 'p.py'] 
$ ./p.py *.py 
False 
['p2.py', 'p.py'] 
$ ./p.py p.py 
False 
['p.py'] 
$ ./p.py  
False 
[] 

का निरीक्षण कैसे फ़ाइलों को एक सूची में होगा उन्हें कई सिर्फ एक जा रहा है या कुछ भी हो।

एचटीएच!

+0

बिल्कुल वही जो मैं खोज रहा था! धन्यवाद! – mevatron

+0

आप एक ही चीज़ कैसे करेंगे लेकिन ध्वज के लिए? मेरे पास 'parser.add_argument ('- b', '--blacklist', nargs = '*'' है और मैं शैल से प्रोग्राम में * .mp3 पास करना चाहता हूं। इसके अलावा, ब्लैकलिस्ट का उपयोग 'ओएस' में किया जाता है। चलना ', इसलिए वास्तविक एमपी 3 फ़ाइलें कामकाजी निर्देशिका में नहीं होंगी। – p014k

+0

@ p014k - मुझे यकीन नहीं है कि मुझे आपका प्रश्न मिला है। क्या आप तारांकन ['*'] वाइल्डकार्ड का उपयोग करके फ़ाइलों की एक सूची पास करना चाहते हैं लेकिन बिना शैल को आपके लिए विस्तार करने देना? यदि ऐसा है, तो आपको तर्क उद्धृत करना होगा: './p.py --doh '* .py''।' p.py' स्क्रिप्ट के भीतर से आपको आपके लिए विस्तार करने के लिए ['fnmatch'] (https://docs.python.org/2/library/fnmatch.html) का उपयोग करें या मैंने आपको गलत समझा? – mac

1

वैकल्पिक रूप से आप निम्नलिखित तरीके से दोनों का उपयोग कर सकते हैं:

import sys 
import argparse 
if __name__ == '__main__': 
    parser = argparse.ArgumentParser() 
    parser.add_argument("-v", "--verbose", help="increase verbosity", action="store_true") 
    args, unknown = parser.parse_known_args() 
    for file in sys.argv: 
     if not file.startswith("-"): 
      print(file) 

हालांकि इस स्टैंडअलोन मापदंडों के लिए केवल काम करेंगे, नहीं तो तर्क मान (फ़ाइल तर्क माना जाएगा जब तक आप उन्हें अंतरिक्ष के साथ अलग नहीं करेंगे या आप कोड को और भी बेहतर बनाएंगे)।