কীভাবে অজগর, কমান্ড-লাইন প্রোগ্রাম স্বতঃসিদ্ধ সালিশী জিনিসগুলি দোভাষী না করে


98

পাইথন ইন্টারপ্রেটারে (ইউনিক্সে) কীভাবে পাইথন অবজেক্টের স্বতঃপূরণ সেটআপ করতে হয় সে সম্পর্কে আমি সচেতন।

  • গুগল এটি কীভাবে করবেন সে সম্পর্কে ব্যাখ্যার জন্য অনেকগুলি হিট দেখায়।
  • দুর্ভাগ্যক্রমে, এখানে অনেক উল্লেখ রয়েছে যে আমার কী করা দরকার তা খুঁজে পাওয়া শক্ত, যা কিছুটা আলাদা।

পাইথনে লিখিত একটি কমান্ড-লাইন প্রোগ্রামে স্বেচ্ছাসেবী আইটেমগুলির ট্যাব / স্বয়ংক্রিয়ভাবে কীভাবে সক্ষম করতে হয় তা আমার জানতে হবে।

আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে একটি কমান্ড-লাইন পাইথন প্রোগ্রাম যা ইমেল প্রেরণের প্রয়োজন। যখন ব্যবহারকারী তার অংশটি টাইপ করে (এবং বিকল্পভাবে ট্যাব কী টিপেন) তখন আমি স্বয়ংক্রিয়ভাবে ইমেল ঠিকানাগুলি (ডিস্কে আমার ঠিকানাগুলি রাখতে) সক্ষম হতে চাই।

উইন্ডোজ বা ম্যাকের জন্য কাজ করার দরকার নেই, শুধু লিনাক্স।


এই ব্লগটি .pythonrc ফাইলটি কনফিগার করে কৌশলগুলি করে।
ক্রিস রুফ

উত্তর:


65

পাইথনের 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)

অফিসিয়াল মডিউল ডকগুলি খুব বেশি বিস্তারিত নয়, আরও তথ্যের জন্য পঠন দস্তাবেজগুলি দেখুন।


4
শক্ত লক্ষ করুন যে আপনি যদি কমান্ড লাইনটি সেমিডি মডিউলটি দিয়ে লিখেন তবে আরও ভাল উপায় আছে।
ফ্লোরিয়ান বুশ

60

সেন্টিমিডি ডকুমেন্টেশন অনুসরণ করুন এবং আপনি ভাল থাকবেন

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)

কীভাবে পাঠ্যরেখার কলাম এটির আউটপুট নিয়ন্ত্রণ করার কোনও উপায় আছে? সুতরাং আসুন আমি এটি প্রতিটি আইটেমের মধ্যে দুটি স্পেসের সাথে কলামাইজ করতে চাই say
Fnord

আমি যখন এই কোডটি চালাই, ট্যাবগুলি কেবল কমান্ড লাইনে মুদ্রিত হয়। আসলে আমি যদি সেমিডিডি বা স্ট্রেড রিডলাইন ব্যবহার না করি তবে এটি সত্য।
হ্যাক

38

যেহেতু আপনি আপনার প্রশ্নের "দোভাষী না" বলেছেন, আমার ধারণা আপনি পাইথন রিডলাইন এবং অনুরূপ জড়িত উত্তরগুলি চান না। ( সম্পাদনা : সংঘটনের পরে বোধোদয়, যে স্পষ্টত না ক্ষেত্রে হো গুন্ গুন্ আমি মনে হয় এই তথ্য আকর্ষণীয় যাহাই হউক না কেন, তাই আমি এখানে ছেড়ে দেব।।। )

আমি মনে করি আপনি এই পরে হতে পারে ।

এটি স্বেচ্ছাসেবক কমান্ডগুলিতে শেল-স্তর সমাপ্তি যোগ করার বিষয়ে, বাশের নিজস্ব ট্যাব-সমাপ্তি প্রসারিত করার বিষয়ে

সংক্ষেপে, আপনি একটি শেল-ফাংশনযুক্ত একটি ফাইল তৈরি করবেন যা সম্ভাব্য পরিপূর্ণতা তৈরি করবে, এটিকে সংরক্ষণ করবে এবং /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এবং --version। আপনার উদ্দেশ্যগুলির জন্য, আপনি মূলত যে মানগুলি .োকানো হয়েছে তা কাস্টমাইজ করতে চান opts

লিঙ্কযুক্ত পৃষ্ঠায় উদাহরণটি দেখুন, এটি সবই বেশ সোজা।


11
আসলে আমি তার কারণেই এখানে এসেছি
ব্যবহারকারীর 1767754

ধন্যবাদ, আমি ঠিক এটিই খুঁজছিলাম!
Teekeks

30

আমি অবাক হয়েছি যে কেউ আরগ কমপ্লিটের কথা উল্লেখ করেনি, এখানে ডক্সের একটি উদাহরণ:

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'))

এটি একটি পুরানো পোস্ট, সম্ভবত আরগকমম্পটটি আবার উপস্থিত ছিল না? যদিও এটি উল্লেখ করার জন্য ধন্যবাদ, আমি মনে করি এটি ঠিক আমার প্রকল্পের প্রয়োজন!
হতাশিত

পাশাপাশি আরগপার্সের সাথে খুব সুন্দর !
এস্ট্রোফ্লয়েড

14

এখানে কোডটির একটি পূর্ণ-কার্যকারী সংস্করণ যা খুব পূর্বসূরীর দ্বারা সরবরাহ করা হয়েছিল এখানে (ধন্যবাদ)।

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

4
Mac OS জন্য প্রতিস্থাপন readline.parse_and_bind('tab:complete') সঙ্গেreadline.parse_and_bind ("bind ^I rl_complete")
মনি

এটা সত্যিই দারুন. আমার জন্য কাজ করেছেন। ভাগ করে নেওয়ার জন্য ধন্যবাদ.
অজয় আহুজা

@ মানি আমি এতে দীর্ঘদিন ধরে আটকে ছিলাম। আপনাকে অনেক ধন্যবাদ
আনাস কায়দ

5

পাইথনে ইন্টারেক্টিভ কমান্ড লাইন অ্যাপ্লিকেশন তৈরির জন্য একটি পাঠাগার পাইথন প্রম্পট টুলকিট ব্যবহার করে দেখতে পারেন ।

গ্রন্থাগারটি ইন্টারেক্টিভ স্ব-সম্পূর্ণরূপে কার্যকারিতা যুক্ত করা সহজ করে তোলে যার মাধ্যমে ব্যবহারকারীকে Tabউপলভ্য পছন্দগুলির মধ্যে চাক্ষুষভাবে চক্রের কীটি ব্যবহার করতে দেওয়া হয়। গ্রন্থাগারটি ক্রস প্ল্যাটফর্ম (লিনাক্স, ওএস এক্স, ফ্রিবিএসডি, ওপেনবিএসডি, উইন্ডোজ)। উদাহরণ:

pgcli - পাইথন প্রম্পট টুলকিট

(চিত্র উত্স: pcgli )


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/ ব্রেকফাস্ট- autocomplete ।

এবং এটি কীভাবে কাজ করে তার একটি ব্যাখ্যা এখানে দেওয়া হয়েছে: http://zepworks.com/posts/you-autocomplete-me/

এটি ভুল বানান এবং শব্দের ওজন অনুসারে বাছাইয়ের সাথে সম্পর্কিত হয়। (এর burritoচেয়ে বেশি গুরুত্বপূর্ণ বলে নেওয়া যাক book, তারপরে আপনি burritoএকটি উচ্চতর "গণনা" দিন এবং bookফলাফলের মধ্যে এটি আগে প্রদর্শিত হবে ।

শব্দ একটি অভিধান এবং প্রতিটি শব্দের একটি প্রসঙ্গ থাকতে পারে। উদাহরণস্বরূপ "গণনা", শব্দটি কীভাবে প্রদর্শন করতে হবে, শব্দের চারপাশে কিছু অন্যান্য প্রসঙ্গ ইত্যাদি এই উদাহরণে শব্দের কোনও প্রসঙ্গ নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.