wake-up-neo.com

Verwenden von booleschen Flags in Python Click Library (Befehlszeilenargumente)

Ich versuche, ein ausführliches Flag für mein Python-Programm zu erstellen. Derzeit mache ich Folgendes:

import click

#global variable
verboseFlag = False

#parse arguments
@click.command()
@click.option('--verbose', '-v', is_flag=True, help="Print more output.")
def log(verbose):
    global verboseFlag
    verboseFlag = True

def main():    
    log()        
    if verboseFlag:
         print("Verbose on!")

if __== "__main__":
    main()

Es wird nie "Verbose on!" selbst wenn ich das Argument '-v' setze. Meine Gedanken sind, dass die Log-Funktion einen Parameter benötigt, aber was gebe ich dazu? Gibt es auch eine Möglichkeit zu überprüfen, ob das Verbose-Flag ohne globale Variablen aktiviert ist?

5
Hackerman

Click ist also nicht einfach ein Befehlszeilen-Parser. Außerdem werden die Befehle abgesetzt und verarbeitet. In Ihrem Beispiel kehrt die Funktion log() niemals zu main() zurück. Die Absicht des Rahmens ist, dass die dekorierte Funktion, dh log(), die erforderliche Arbeit erledigt.

Code:

import click

@click.command()
@click.option('--verbose', '-v', is_flag=True, help="Print more output.")
def log(verbose):
    click.echo("Verbose {}!".format('on' if verbose else 'off'))


def main(*args):
    log(*args)

Testcode:

if __== "__main__":
    commands = (
        '--verbose',
        '-v',
        '',
        '--help',
    )

    import sys, time

    time.sleep(1)
    print('Click Version: {}'.format(click.__version__))
    print('Python Version: {}'.format(sys.version))
    for cmd in commands:
        try:
            time.sleep(0.1)
            print('-----------')
            print('> ' + cmd)
            time.sleep(0.1)
            main(cmd.split())

        except BaseException as exc:
            if str(exc) != '0' and \
                    not isinstance(exc, (click.ClickException, SystemExit)):
                raise

Ergebnisse:

Click Version: 6.7
Python Version: 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]
-----------
> --verbose
Verbose on!
-----------
> -v
Verbose on!
-----------
> 
Verbose off!
-----------
> --help
Usage: test.py [OPTIONS]

Options:
  -v, --verbose  Print more output.
  --help         Show this message and exit.
6
Stephen Rauch

Die obige Antwort war hilfreich, aber am Ende habe ich sie verwendet. Ich dachte, ich würde es teilen, da so viele Leute diese Frage betrachten:

@click.command()
@click.option('--verbose', '-v', is_flag=True, help="Print more output.")
def main(verbose):
    if verbose:
        # do something

if __== "__main__":
    # pylint: disable=no-value-for-parameter
    main()
0
Hackerman