2010-07-28 7 views
1

Je souhaite autoriser des arguments de ligne de commande arbitraires. Si l'utilisateur me donne une ligne de commande qui ressemble à ceciArguments de ligne de commande arbitraires en python

myscript.py --a valueofa --b valueofb posarg1 posarg2

Je sais que a a été passé avec valueofa, b passé avec valueofb et que j'ai ces deux derniers arguments de position.

J'ai toujours utilisé optparse, pour lequel vous spécifiez exactement les arguments à rechercher. Mais je veux que l'utilisateur puisse définir des "macros" arbitraires à partir de la ligne de commande. Il y a sûrement un module python qui le fait plus élégamment que tout ce que j'écrirais. Quel est?

+1

. "Macros"? –

+0

L'analogie que j'avais à l'esprit utilisait gcc comme '-Dthismacro = macrovalue' –

Répondre

2

Malheureusement, vous can't. Si vous devez supporter cela, vous aurez besoin d'écrire votre propre analyseur option = (.

0

Est-ce que argparse faire ce que vous voulez? Il a été récemment ajouté à la bibliothèque standard., Vous voudrez peut-être précisément regarder this section de la documentation

+1

Je pense que non:" La méthode parse_args tente de donner des erreurs quand l'utilisateur a clairement fait une erreur "signifie que des arguments indéfinis causeront des erreurs. En fait, je pense que c'est un comportement délibéré - ce n'est pas souvent que vous voulez autoriser, par ex. fautes d'orthographe. – katrielalex

0

arbitrary_args.py.

#!/usr/bin/env python3 

import sys 


def parse_args_any(args): 
    pos = [] 
    named = {} 
    key = None 
    for arg in args: 
     if key: 
      if arg.startswith('--'): 
       named[key] = True 
       key = arg[2:] 
      else: 
       named[key] = arg 
       key = None 
     elif arg.startswith('--'): 
      key = arg[2:] 
     else: 
      pos.append(arg) 
    if key: 
     named[key] = True 
    return (pos, named) 


def main(argv): 
    print(parse_args_any(argv)) 


if __name__ == '__main__': 
    sys.exit(main(sys.argv[1:])) 

$./arbitrary_args.py cmd posarg1 posarg2 --foo --bar baz posarg3 --quux:

([ 'cmd', 'posarg1', 'posarg2', « pos arg3 '], {' foo ': True, 'bar': 'baz', 'quux': true})

argparse_arbitrary.py:

#!/usr/bin/env python3 
import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('-D', action='append',) 
D = {L[0]:L[1] for L in [s.split('=') for s in parser.parse_args().D]} 
print(D) 

$./argparse_arbitrary.py -Ddrink=coffee -Dsnack=peanut

{' snack ':' arachide ',' boisson ':' café '}