2012-03-05 22 views
10

मैंने optcompleteoptparse मॉड्यूल के साथ काम किया है। इसका उदाहरण एक साधारण फाइल है इसलिए मैं इसे काम कर सकता हूं। मैंने argparse मॉड्यूल का उपयोग करके इसका परीक्षण भी किया क्योंकि पहले व्यक्ति को बहिष्कृत किया गया है। लेकिन मैं वास्तव में समझ नहीं पा रहा हूं कि टैब प्रेस पर पायथन प्रोग्राम किस प्रकार और किसके द्वारा बुलाया जाता है। मुझे bash पर shebang लाइन और argparse (या optparse) मॉड्यूल कुछ तरीकों से शामिल है। मैं इसे समझने की कोशिश कर रहा हूं (अब स्रोत कोड पढ़ना होगा)।पाइथन प्रोग्राम नाम के बाद, बैश में 'टैब' कीप्रेस का जवाब देने वाले Argparse (और बहिष्कृत ऑप्टपरसे) का जवाब कैसे देता है?

मेरे पास थोड़ा और जटिल प्रोग्राम संरचना है, जिसमें कोड के टुकड़े के चारों ओर एक रैपर शामिल है जो तर्कों को संभालता है। इसकी argparse.ArgumentParser() तात्कालिकता और add_argument() पर कॉल करें - जो डुप्लीकेटिंग कोड से बचने के लिए किसी अन्य इंटरमीडिएट मॉड्यूल में सुपरक्लास किया गया है, और उसके चारों ओर रैपर कहा जा रहा है - एक फ़ंक्शन के अंदर हैं।

मैं इस टैब को पूरा करने के तरीके को समझना चाहता हूं कि बैश और पायथन (या उस मामले के लिए perl) के बीच कोई अन्य व्याख्याता काम करता है।

नोट: मुझे बैश पूर्ण करने की उचित समझ है (जिसे मैंने अभी सीखा), और मुझे लगता है कि मैं बैश (केवल) कस्टम समापन को समझता हूं।

नोट: मैं इसी तरह की अन्य अतः सवाल पढ़ा है, और कोई भी वास्तव में इस प्रश्न:

संपादित का जवाब: Here बैश कार्य है।
मैं पहले से ही समझ में आ कैसे अजगर मॉड्यूल कमांड लाइन में लिखे गए शब्द के बारे में पता करने के लिए हो जाता है, चर

$COMP_WORDS 
$COMP_CWORD 
$COMP_LINE 
$COMP_POINT 
$COMPREPLY 

इन चरों के os.environ मूल्यों को पढ़ने के द्वारा केवल टैब प्रेस पर मान हैं। मेरा सवाल यह है कि पायथन मॉड्यूल कैसे ट्रिगर हो जाता है?

+0

'ऑप्टिकप्लेट' दस्तावेज़ कहते हैं: "आपको बैश फ़ंक्शन को स्रोत करने की आवश्यकता है और फिर बैश को यह निर्दिष्ट करने के लिए विशिष्ट प्रोग्रामों के लिए अपूर्ण पूर्णता को ट्रिगर करने के लिए बताने के लिए:"। यदि आपने ऐसा किया है, तो आप अभी भी क्यों पूछ रहे हैं कि यह कैसे काम करता है? यह स्पष्ट होना चाहिए कि आपको बशर्ते बताने की जरूरत है कि अगर पूरा होने का अनुरोध किया जाता है तो कौन सा प्रोग्राम कॉल करना है। –

+0

क्षमा करें, मैंने जो पढ़ा है उसे गलत समझा। मैं इसके लिए एक जवाब जोड़ दूंगा। –

उत्तर

14

को समझने के लिए यहां क्या हो रहा है, चलो देखते हैं कि क्या है कि पार्टी समारोह लेकिन वास्तव में ऐसा करते हैं:

COMPREPLY=($(\ 
    COMP_LINE=$COMP_LINE COMP_POINT=$COMP_POINT \ 
    COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \ 
    OPTPARSE_AUTO_COMPLETE=1 $1)) 

अंत में $1 देखते हैं? इसका मतलब है कि यह वास्तव में पाइथन फ़ाइल को कॉल करता है जिसे हम विशेष पर्यावरण चर सेट के साथ निष्पादित करना चाहते हैं!

#!/usr/bin/env python2 
import os, sys 
import optparse, optcomplete 
from cStringIO import StringIO 

if __name__ == '__main__':  
    parser = optparse.OptionParser() 

    parser.add_option('-s', '--simple', action='store_true', 
         help="Simple really simple option without argument.") 

    parser.add_option('-o', '--output', action='store', 
         help="Option that requires an argument.") 

    opt = parser.add_option('-p', '--script', action='store', 
          help="Option that takes python scripts args only.") 
    opt.completer = optcomplete.RegexCompleter('.*\.py') 

    # debug env variables 
    sys.stderr.write("\ncalled with args: %s\n" % repr(sys.argv)) 
    for k, v in sorted(os.environ.iteritems()): 
     sys.stderr.write(" %s: %s\n" % (k, v)) 

    # setup capturing the actions of `optcomplete.autocomplete` 
    def fake_exit(i): 
     sys.stderr.write("autocomplete tried to exit with status %d\n" % i) 
    sys.stdout = StringIO() 
    sys.exit = fake_exit 

    # Support completion for the command-line of this script. 
    optcomplete.autocomplete(parser, ['.*\.tar.*']) 

    sys.stderr.write("autocomplete tried to write to STDOUT:\n") 
    sys.stderr.write(sys.stdout.getvalue()) 
    sys.stderr.write("\n") 

    opts, args = parser.parse_args() 

यह हमें देता है निम्नलिखित है जब हम उसे स्वत: पूर्ण करने का प्रयास करें:

$ ./test.py [tab] 
called with args: ['./test.py'] 
    ... 
    COMP_CWORD: 1 
    COMP_LINE: ./test.py 
    COMP_POINT: 10 
    COMP_WORDS: ./test.py 
    ... 
    OPTPARSE_AUTO_COMPLETE: 1 
    ... 
autocomplete tried to exit with status 1 
autocomplete tried to write to STDOUT: 
-o -h -s -p --script --simple --help --output 

तो optcomplete.autocomplete सिर्फ पर्यावरण पढ़ता है, तैयार करता है पता लगाने के लिए क्या हो रहा है, के बीच में रोकने का क्या optcomplete.autocomplete करता है एक छोटे से स्क्रिप्ट तैयार करते हैं मैचों, उन्हें STDOUT लिखता है और बाहर निकलता है। परिणाम -o -h -s -p --script --simple --help --output को तब एक बाश सरणी (COMPREPLY=(...)) में डाल दिया गया है और उपयोगकर्ता को विकल्प पेश करने के लिए बैश में लौटा दिया गया है। कोई जादू शामिल नहीं है :)

+0

अरे बहुत बहुत धन्यवाद, असल में मैंने देखा कि $ 1 जब मैंने आपकी टिप्पणी पढ़ी और लिंक प्राप्त करने के लिए पेज पर चला गया।तब मुझे जो कुछ पता था, उससे मैंने मारा लेकिन कभी भी इस्तेमाल नहीं किया क्योंकि मैंने कभी भी कोई भी स्क्रिप्ट लिखी नहीं - $ 1 पहला तर्क है.-: एस। यह मेरा मूर्ख था कि मुझे पहले नहीं मिला था। एक अच्छा और स्पष्ट उदाहरण के लिए – 0xc0de

+0

+1 :) – 0xc0de