कैसे एक अजगर बनाने के लिए, कमांड लाइन कार्यक्रम स्वतः पूर्ण मनमानी चीजें नहीं दुभाषिया


92

मुझे पता है कि अजगर इंटरप्रेटर (यूनिक्स पर) में पायथन ऑब्जेक्ट्स के ऑटोकॉमप्लेक्शन को कैसे सेटअप किया जाए।

  • Google यह करने के लिए स्पष्टीकरण के लिए कई हिट दिखाता है।
  • दुर्भाग्य से, वहाँ इतने सारे संदर्भ हैं कि यह पता लगाना मुश्किल है कि मुझे क्या करना है, जो थोड़ा अलग है।

मुझे यह जानने की आवश्यकता है कि अजगर में लिखे गए कमांड-लाइन प्रोग्राम में मनमानी वस्तुओं को कैसे सक्षम करें, टैब / ऑटो पूरा करें।

मेरा विशिष्ट उपयोग मामला एक कमांड-लाइन पायथन प्रोग्राम है जिसे ईमेल भेजने की आवश्यकता है। जब उपयोगकर्ता इसके प्रकार का हिस्सा है (और वैकल्पिक रूप से TAB कुंजी दबाता है) तो मैं स्वतः पूर्ण ईमेल पते (डिस्क पर पते) में सक्षम होना चाहता हूं।

मुझे खिड़कियों या मैक पर काम करने के लिए इसकी आवश्यकता नहीं है, बस लिनक्स।


इस ब्लॉग को .pythonrc फ़ाइल को कॉन्फ़िगर करने के साथ ट्रिक्स करनी चाहिए।
क्रिस रूफ

जवाबों:


63

पायथन की readlineबाइंडिंग का उपयोग करें । उदाहरण के लिए,

import readline

def completer(text, state):
    options = [i for i in commands if i.startswith(text)]
    if state < len(options):
        return options[state]
    else:
        return None

readline.parse_and_bind("tab: complete")
readline.set_completer(completer)

आधिकारिक मॉड्यूल डॉक्स अधिक विस्तृत नहीं हैं, अधिक जानकारी के लिए रीडलाइन डॉक्स देखें ।


1
ध्यान दें कि यदि आप cmd मॉड्यूल के साथ अपनी कमांड लाइन लिखते हैं कि इसे करने के बेहतर तरीके हैं।
फ्लोरियन बॉश

60

Cmd प्रलेखन का पालन करें और आप ठीक हो जाएगा

import cmd

addresses = [
    'here@blubb.com',
    'foo@bar.com',
    'whatever@wherever.org',
]

class MyCmd(cmd.Cmd):
    def do_send(self, line):
        pass

    def complete_send(self, text, line, start_index, end_index):
        if text:
            return [
                address for address in addresses
                if address.startswith(text)
            ]
        else:
            return addresses


if __name__ == '__main__':
    my_cmd = MyCmd()
    my_cmd.cmdloop()

टैब के लिए आउटपुट -> टैब -> भेजें -> टैब -> टैब -> एफ -> टैब

(Cmd)
help  send
(Cmd) send
foo@bar.com            here@blubb.com         whatever@wherever.org
(Cmd) send foo@bar.com
(Cmd)

क्या यह नियंत्रित करने का कोई तरीका है कि आउटपुट कैसे पढ़ता है? तो आइए हम प्रत्येक आइटम के बीच दो रिक्त स्थान के साथ इसे स्तंभित करना चाहते हैं।
Fnord

जब मैं इस कोड को चलाता हूं, तो टैब बस कमांड लाइन में प्रिंट हो जाते हैं। वास्तव में अगर मैं cmd ​​या स्ट्रेट रीडलाइन का उपयोग करता हूं तो यह सच है।
हैक

37

चूँकि आप अपने प्रश्न में "दुभाषिया नहीं" कहते हैं, इसलिए मुझे लगता है कि आप पायथन रीडलाइन और इस तरह के उत्तर को शामिल नहीं करना चाहते हैं। ( संपादित करें : hindsight में, यह स्पष्ट रूप से मामला नहीं है। हो हम। मुझे लगता है कि यह जानकारी वैसे भी दिलचस्प है, इसलिए मैं इसे यहाँ छोड़ दूँगा। )

मुझे लगता है कि आप के बाद हो सकता है यह

यह शेल-लेवल पूरा करने से लेकर मनमाने आदेशों तक, बैश के अपने टैब को पूरा करने के बारे में है।

संक्षेप में, आप एक शेल-फंक्शन वाली फ़ाइल बनाएंगे जो संभावित पूर्णताएँ उत्पन्न करेगी, इसे सहेजेगी /etc/bash_completion.d/और इसे कमांड के साथ पंजीकृत करेगी complete। यहाँ लिंक पृष्ठ से एक स्निपेट है:

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo

इस स्थिति में, टाइपिंग foo --[TAB]आपको वैरिएबल , और opts, में मान देगा । अपने उद्देश्यों के लिए, आप अनिवार्य रूप से उन मूल्यों को अनुकूलित करना चाहते हैं, जिन्हें डाला जाता है ।--help--verbose--versionopts

लिंक किए गए पृष्ठ पर उदाहरण देखें, यह सब बहुत सीधा है।


10
वास्तव में मैं उस वजह से यहाँ आया था
user1767754

धन्यवाद, यह वही है जो मैं देख रहा था!
Teekeks

27

मुझे आश्चर्य है कि किसी ने भी अतिक्रमण का उल्लेख नहीं किया है, यहां डॉक्स से एक उदाहरण है:

from argcomplete.completers import ChoicesCompleter

parser.add_argument("--protocol", choices=('http', 'https', 'ssh', 'rsync', 'wss'))
parser.add_argument("--proto").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss'))

यह एक पुरानी पोस्ट है, शायद argcomplete वापस तो मौजूद नहीं था? हालांकि यह उल्लेख करने के लिए धन्यवाद, मुझे लगता है कि यह वास्तव में मेरी परियोजना की जरूरत है!
FrustratedWithFormsDesigner

साथ ही साथ argparse के साथ संयोजन में बहुत अच्छा !
एस्ट्रोफ्लोयड

13

यहाँ कोड है कि बहुत ephemient द्वारा आपूर्ति की गई थी की एक पूर्ण काम कर संस्करण है यहाँ (धन्यवाद)।

import readline

addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com']

def completer(text, state):
    options = [x for x in addrs if x.startswith(text)]
    try:
        return options[state]
    except IndexError:
        return None

readline.set_completer(completer)
readline.parse_and_bind("tab: complete")

while 1:
    a = raw_input("> ")
    print "You entered", a

10
# ~/.pythonrc
import rlcompleter, readline
readline.parse_and_bind('tab:complete')

# ~/.bashrc
export PYTHONSTARTUP=~/.pythonrc

1
मैक ओएस के लिए, की जगह readline.parse_and_bind('tab:complete') के साथreadline.parse_and_bind ("bind ^I rl_complete")
मणि

यह कमाल का है। मेरे लिए काम किया। साझा करने के लिए धन्यवाद।
अजय आहूजा

@ मानी मैं लंबे समय से इसमें फंसा हुआ था। बहुत बहुत धन्यवाद
AnaS Kayed

5

आप पायथन प्रॉम्प्ट टूलकिट , पायथन में इंटरैक्टिव कमांड लाइन अनुप्रयोगों के निर्माण के लिए एक पुस्तकालय का उपयोग करने का प्रयास कर सकते हैं ।

लाइब्रेरी इंटरेक्टिव ऑटोकॉमल फंक्शनलिटी को जोड़ना आसान बनाता है, जिससे उपयोगकर्ता Tabउपलब्ध विकल्पों के माध्यम से नेत्रहीन चक्र की कुंजी का उपयोग कर सकता है । पुस्तकालय क्रॉस-प्लेटफ़ॉर्म (लिनक्स, ओएस एक्स, फ्रीबीएसडी, ओपनबीएसडी, विंडोज) है। उदाहरण:

pgcli - पायथन प्रॉम्प्ट टूलकिट

(छवि स्रोत: पीसीजी )


1

पोस्ट किए गए उत्तर ठीक काम करते हैं लेकिन मैंने एक स्वत: पूर्ण लाइब्रेरी खोली है जिसे मैंने काम पर लिखा था। हम इसे उत्पादन में थोड़ी देर के लिए इस्तेमाल कर रहे हैं और यह तेज, स्थिर और उपयोग में आसान है। यहां तक ​​कि इसमें एक डेमो मोड भी है, ताकि आप जल्दी से यह परीक्षण कर सकें कि आपको शब्द लिखते समय क्या मिलेगा।

इसे स्थापित करने के लिए, बस चलाएं: pip install fast-autocomplete

यहाँ एक उदाहरण है:

>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3)  # mis-spelling
[['burrito']]

चेकआउट: स्रोत कोड के लिए https://github.com/wearefair/fast-autocomplete

और यहाँ एक विवरण दिया गया है कि यह कैसे काम करता है: http://zepworks.com/posts/you-autocomplete-me/

यह गलत वर्तनी और शब्द के वजन द्वारा वैकल्पिक रूप से छांटने से संबंधित है। (मान लें कि इससे burritoअधिक महत्वपूर्ण है book, तो आप burritoएक उच्च "काउंट" देते हैं और यह bookपरिणामों में पहले दिखाई देगा ।

शब्द एक शब्दकोश है और प्रत्येक शब्द का एक संदर्भ हो सकता है। उदाहरण के लिए "गिनती", शब्द को कैसे प्रदर्शित किया जाए, शब्द के आसपास कुछ अन्य संदर्भ आदि। इस उदाहरण में शब्दों का कोई संदर्भ नहीं था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.