2011-12-05 17 views
48

मैं तर्कों में भी अपनी पायथन स्क्रिप्ट पर स्वत: पूर्णता प्राप्त करना चाहता हूं।पायथन Argparse और bash complet

मैं वास्तव में कभी नहीं समझा था कि कैसे bash_completion (तर्क के लिए) काम किया, लेकिन बाद मैं मैं में खोदा समझ गया कि:

  1. इसे इस्तेमाल करता है "पूर्ण" एक आदेश के लिए एक पूरा समारोह बाध्य करने के लिए
  2. हर कार्य को मूल रूप से पूरा करना तर्क पार्सर

विशेष रूप से दूसरा बिंदु बहुत अच्छा नहीं है, क्योंकि मैं इसे स्वचालित रूप से जेनरेट करना चाहता हूं।

सबसे अच्छी बात यह होगी कि शेल पूरा करने के बारे में हर टैब पर मेरे कार्यक्रम से पूछता है, लेकिन मुझे लगता है कि यह वास्तव में काम नहीं कर सकता है, क्या यह सही है?

दूसरा विकल्प शायद एक Argparse पार्सर से एक शेल फ़ंक्शन में कनवर्टर लिखने के लिए है जो सही ढंग से पूरा करता है।

+5

क्या आपने यह धागा http://bugs.python.org/issue4256 देखा है? ऐसा लगता है कि 'optparse' में स्वचालित खोल समापन समर्थन है: http: //pypi.python।संगठन/pypi/optcomplete – Chris

उत्तर

13

Bash "completion" वास्तव में बहुत अच्छा है। और पाइथन में लिखे गए कार्यक्रमों के लिए आसान ....

मुझे लगता है कि यह वही है जो आप चाहते हैं: optcomplete: Shell Completion Self-Generator for Python। यह उपलब्ध है, उदाहरण के लिए, उबंटू में "पायथन-ऑप्टिकप्लेट" पैकेज के रूप में।

आप अपने अजगर कार्यक्रम की कुछ पंक्तियों में डालें, और उपयोगकर्ता (एक बार) बैश "पूर्ण" कार्यक्रम कैसे तर्क पूरा करने के लिए पार्टी को बताने के लिए चलाता है:

complete -F _optcomplete <program> 

और अब उपयोगकर्ता पूरा होने है ! डिफ़ॉल्ट रूप से यह प्रोग्राम विकल्पों पर सरल समापन देता है। एक विशेष विकल्प के लिए पूर्णता कैसे काम करता है इसे अनुकूलित करने के लिए उदाहरण देखें। यह खूबसूरती से लिखा गया है, और सब-कमांड, वैकल्पिक समापन विकल्प इत्यादि को संभालने के लिए विस्तारित करना आसान है!

अद्यतन:

zsh में पूरा करने के लिए (दोनों optparse के लिए और argparse) को देखने के genzshcomp 0.3.1 : Python Package Index

@englebip द्वारा बताया गया है, हम अभी भी नए argparse मॉड्यूल के लिए कुछ इसी तरह, अजगर 2.7 में शुरू की जरूरत है और 3.2, क्योंकि optparse अब बहिष्कृत है।

भी देखें यह कैसे किया जाता है पर इस पृष्ठभूमि: How does argparse (and the deprecated optparse) respond to 'tab' keypress after python program name, in bash? - Stack Overflow

+2

यह वास्तव में बहुत अच्छा है, लेकिन यह अब अप्रचलित 'optparse' मॉड्यूल के लिए काम करता है, न कि वर्तमान 'argparse' के लिए। 'Argparse' के साथ पुन: कार्यान्वयन के किसी भी विचार? – englebip

+0

@englebip अच्छी तरह से 'optparse' का वर्णन करना मुश्किल है क्योंकि इसके प्रतिस्थापन के बाद अप्रचलित, Argparse, पहली बार पायथन 2.7 और पायथन 3.2 में पेश किया गया था। आधिकारिक शब्द "बहिष्कृत" है, जो लंबे समय तक टिक सकता है। लेकिन मैं वास्तव में Argparse के लिए optcomplete की तरह कुछ देखना पसंद करेंगे, और ऐसा करने के प्रयास हैं। – nealmcb

58

बेशर्म स्वयं को बढ़ावा देने

यहाँ कि दिशा में आगे बढ़ पर चर्चा है : https://github.com/kislyuk/argcomplete

argcomplete argparse के लिए बैश पूर्णता प्रदान करता है।

+2

मैं इसे भी अनुशंसा करता हूं। –

+0

_exactly_ क्या @ एंड्रिया-क्रॉटी – Thomas

+0

@weaver के लिए देख रहा है दस्तावेज़ों से, ऐसा लगता है कि या तो वैश्विक पूर्णता को सक्षम करना है या एक विशिष्ट eval कथन को bashrc में जोड़ा जाना आवश्यक है। क्या एक पूर्णता स्क्रिप्ट बनाने का कोई तरीका है और यह बताएं कि स्क्रिप्ट कहां है? – balki