2015-03-11 6 views
7

मैं क्लिक (http://click.pocoo.org/3/) का उपयोग कर रहा एक कमांड लाइन आवेदन बनाने के लिए क्लिक, लेकिन मैं इस आवेदन के लिए एक खोल बनाने के लिए कैसे पता नहीं है।
मान लीजिए मैं एक कार्यक्रम परीक्षण बुलाया लिख ​​रहा हूँ और मैं आदेशों subtest1 और subtest2अजगर के साथ एक शेल कमांड लाइन आवेदन बनाना और

मैं इसे की तरह टर्मिनल से काम करने के लिए कर रहा था कहा जाता है:

$ test subtest1 
$ test subtest2 

लेकिन क्या मैं के बारे में सोच रहा था एक खोल है, इसलिए मैं कर सकता है:

$ test 
>> subtest1 
>> subtest2 

इस poss है क्लिक के साथ ible?

+1

हो सकता है कि आप एक साथ कुछ [ 'prompt' समारोह] का उपयोग कर रख सकते हैं (http: // क्लिक .pocoo.org/3/संकेतों /)। – mkrieger1

उत्तर

11

यह क्लिक के साथ असंभव नहीं है, लेकिन कोई भी अंतर्निहित है कि के लिए समर्थन करते हैं। सबसे पहले आपको करना होगा कि समूह सजावट में invoke_without_command=True पास करके (here वर्णित) में अपने समूह कॉलबैक को उप-आदेश के बिना अनावश्यक बना दिया गया है। फिर आपके समूह कॉलबैक को एक आरईपीएल लागू करना होगा। पाइथन में मानक पुस्तकालय में ऐसा करने के लिए cmd ढांचा है। उपलब्ध उप-सामग्रियों को बनाने में cmd.Cmd.default ओवरराइड करना शामिल है, जैसे नीचे दिए गए कोड स्निपेट में। सभी विवरण प्राप्त करना, जैसे help, कुछ पंक्तियों में करने योग्य होना चाहिए।

import click 
import cmd 

class REPL(cmd.Cmd): 
    def __init__(self, ctx): 
     cmd.Cmd.__init__(self) 
     self.ctx = ctx 

    def default(self, line): 
     subcommand = cli.commands.get(line) 
     if subcommand: 
      self.ctx.invoke(subcommand) 
     else: 
      return cmd.Cmd.default(self, line) 

@click.group(invoke_without_command=True) 
@click.pass_context 
def cli(ctx): 
    if ctx.invoked_subcommand is None: 
     repl = REPL(ctx) 
     repl.cmdloop() 

@cli.command() 
def a(): 
    """The `a` command prints an 'a'.""" 
    print "a" 

@cli.command() 
def b(): 
    """The `b` command prints a 'b'.""" 
    print "b" 

if __name__ == "__main__": 
    cli() 
+1

मैं उप-आदेश में अतिरिक्त तर्क पारित करने के बारे में कैसे जाउंगा, और उन्हें क्लिक करके पार्स किया होगा? –

+0

मुझे पता है कि मैं इस खेल के लिए बहुत देर हो चुकी हूं, लेकिन उपदेशों के लिए अतिरिक्त तर्कों को कैसे संभाला जा सकता है, इसके लिए मेरा जवाब देखें। (यह इस उत्तर पर आधारित है, किसी भी तरह से मैं इसके बिना इसे प्राप्त कर लिया होगा)। – vimalloc

1

मैं ओपी के समान कुछ करने की कोशिश कर रहा था, लेकिन अतिरिक्त विकल्प/नेस्टेड सब-सब-कमांड के साथ। बिल्टिन cmd मॉड्यूल का उपयोग करने वाला पहला जवाब मेरे मामले में काम नहीं करता था; शायद कुछ और झुकाव के साथ .. लेकिन मैं बस click-shell भर में चला गया। इसे व्यापक रूप से परीक्षण करने का मौका नहीं मिला है, लेकिन अब तक, ऐसा लगता है कि यह बिल्कुल अपेक्षित काम करता है।

0

मैं जानता हूँ कि इस सुपर पुराना है, लेकिन मैं विकल्प का समर्थन करने के साथ ही fpbhb के समाधान पर काम कर रहा हूँ। मैं इस में कुछ और काम इस्तेमाल कर सकते हैं यकीन है, लेकिन यहाँ यह कैसे किया जा सकता है की एक बुनियादी उदाहरण है:

import click 
import cmd 
import sys 

from click import BaseCommand, UsageError 


class REPL(cmd.Cmd): 
    def __init__(self, ctx): 
     cmd.Cmd.__init__(self) 
     self.ctx = ctx 

    def default(self, line): 
     subcommand = line.split()[0] 
     args = line.split()[1:] 

     subcommand = cli.commands.get(subcommand) 
     if subcommand: 
      try: 
       subcommand.parse_args(self.ctx, args) 
       self.ctx.forward(subcommand) 
      except UsageError as e: 
       print(e.format_message()) 
     else: 
      return cmd.Cmd.default(self, line) 


@click.group(invoke_without_command=True) 
@click.pass_context 
def cli(ctx): 
    if ctx.invoked_subcommand is None: 
     repl = REPL(ctx) 
     repl.cmdloop() 


@cli.command() 
@click.option('--foo', required=True) 
def a(foo): 
    print("a") 
    print(foo) 
    return 'banana' 


@cli.command() 
@click.option('--foo', required=True) 
def b(foo): 
    print("b") 
    print(foo) 

if __name__ == "__main__": 
    cli() 
संबंधित मुद्दे