2009-08-28 16 views
5

के माध्यम से पार्सिंग मैं एक प्रबंधन स्क्रिप्ट विकसित कर रहा हूं जो कमांड लाइन विकल्प के माध्यम से काफी बड़ी मात्रा में काम करता है। स्क्रिप्ट के पहले कुछ पुनरावृत्तियों ने उपयोगकर्ता इनपुट एकत्र करने के लिए ऑप्टपर का उपयोग किया है और फिर पृष्ठ को नीचे चलाएं, उचित क्रम में प्रत्येक विकल्प के मूल्य का परीक्षण करें, और यदि आवश्यक हो तो कार्रवाई करें। इसके परिणामस्वरूप कोड का जंगल है जो पढ़ने और बनाए रखने में वाकई मुश्किल है।कमांड लाइन तर्क introspection

मैं कुछ बेहतर ढूंढ रहा हूं।

मेरी आशा है कि एक प्रणाली है जहां मैं कम या ज्यादा सामान्य पायथन फैशन में फ़ंक्शन लिख सकता हूं, और फिर जब स्क्रिप्ट चलती है, तो मेरे कार्यों से उत्पन्न विकल्प (और सहायता पाठ) होते हैं, पार्स किए जाते हैं, और निष्पादित होते हैं उचित आदेश साथ ही, मैं वास्तव में Django शैली उप आदेश इंटरफ़ेस बनाने के, जहां myscript.py install काम करता है पूरी तरह से अलग myscript.py remove (अलग विकल्प, मदद, आदि) से

मैं simon willison's optfunc पाया है सक्षम होने के लिए करना चाहते हैं और यह एक बहुत करता है इसमें से, लेकिन यह सिर्फ निशान को याद करने के लिए प्रतीत होता है - मैं विकल्पों को एक विशाल स्ट्रिंग में सेट करने के लिए पूरे विकल्प को संपीड़ित करने की बजाय, प्रत्येक विकल्प को फ़ंक्शन के रूप में लिखना चाहता हूं।

मुझे कल्पना है कि प्रमुख कार्यों के लिए कक्षाओं का एक सेट शामिल है, और कमांड लाइन में किसी विशेष विकल्प से संबंधित वर्ग की प्रत्येक परिभाषित विधि शामिल है। यह संरचना रखरखाव को आसान बनाने, संशोधित कार्यात्मक कोड के पास प्रत्येक विकल्प रखने का लाभ प्रदान करती है। जिस चीज को मैं नहीं जानता कि कैसे निपटना है, आदेशों का क्रम है, क्योंकि वर्ग विधियों का क्रम निर्धारण नहीं है।

इससे पहले कि मैं पहिया को फिर से शुरू कर दूं: क्या कोड की कोई अन्य मौजूदा बिट्स समान है? अन्य चीजें जिन्हें संशोधित करना आसान होगा? इस सवाल से पूछने से कि क्या अच्छा होगा, इस बारे में अपनी सोच को स्पष्ट किया है, लेकिन इस पर प्रतिक्रिया क्यों है कि यह एक भयानक विचार है, या इसे कैसे काम करना चाहिए।

उत्तर

4

"आत्मनिरीक्षण" पर समय बर्बाद न करें।

प्रत्येक "कमांड" या "विकल्प" एक विधि है जो विधि कार्यों या विशेषताओं के दो सेटों के साथ होता है।

  1. ऑप्टपर करने के लिए सेटअप जानकारी प्रदान करें।

  2. असल में काम करें।

यहाँ सुपर क्लास सभी आदेशों के लिए

class Command(object): 
    name= "name" 
    def setup_opts(self, parser): 
     """Add any options to the parser that this command needs.""" 
     pass 
    def execute(self, context, options, args): 
     """Execute the command in some application context with some options and args.""" 
     raise NotImplemented 

आप Install और Remove और हर दूसरे आदेश आप की जरूरत के लिए sublcasses बनाने है।

आपका समग्र एप्लिकेशन ऐसा कुछ दिखता है।

commands = [ 
    Install(), 
    Remove(), 
] 
def main(): 
    parser= optparse.OptionParser() 
    for c in commands: 
     c.setup_opts(parser) 
    options, args = parser.parse() 
    command= None 
    for c in commands: 
     if c.name.startswith(args[0].lower()): 
      command= c 
      break 
    if command: 
     status= command.execute(context, options, args[1:]) 
    else: 
     logger.error("Command %r is unknown", args[0]) 
     status= 2 
    sys.exit(status) 
+0

धन्यवाद, यह अच्छी सलाह की तरह लगता है। –

+0

यह उत्कृष्ट है! –

0

WSGI पुस्तकालय Management Script Utilities जो कम से कम आप क्या चाहते हैं, या हो सकता है आप एक संकेत कैसे आत्मनिरीक्षण खुद कर देने के प्रदान करता है WERKZEUG।

from werkzeug import script 

# actions go here 
def action_test(): 
    "sample with no args" 
    pass 

def action_foo(name=2, value="test"): 
    "do some foo" 
    pass 

if __name__ == '__main__': 
    script.run() 

निम्नलिखित में से कौन सहायता संदेश उत्पन्न करेगा:

$ python /tmp/test.py --help 
usage: test.py <action> [<options>] 
     test.py --help 

actions: 
    foo: 
    do some foo 

    --name      integer 2 
    --value      string test 

    test: 
    sample with no args 

एक कार्रवाई एक ही मॉड्यूल "action_" जो तर्क जहां हर तर्क की डिफ़ॉल्ट के एक नंबर ले जाता है के साथ शुरू में एक समारोह है। डिफ़ॉल्ट मान का प्रकार तर्क के प्रकार को निर्दिष्ट करता है।

तर्क तब स्थिति से या खोल से --name = मान का उपयोग करके पारित किया जा सकता है।

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