2010-05-17 10 views
6

que estoy usando setuptools para el script Python escribíSetuptools no pasar argumentos para entry_points

Después de la instalación, lo hago:

$ megazord -i input -d database -v xx-xx -w yy-yy 

Al igual que lo haría si se estaba corriendo ./like_this

sin embargo, me sale:

Traceback (most recent call last): 
    File "/usr/local/bin/megazord", line 9, in <module> 
    load_entry_point('megazord==1.0.0', 'console_scripts', 'megazord')() 
TypeError: main() takes exactly 1 argument (0 given) 

que se parece a setuptools no es el envío de mis argumentos a main() para ser analizada (por optparse)

Aquí está mi setuptools Config para entry_points:

entry_points = { 
    'console_scripts': [ 
     'megazord = megazord.megazord:main', 
     'megazord-benchmark = megazord.benchmark:main', 
     'megazord-hash = megazord.mzhash:main', 
     'megazord-mutate = megazord.mutator:main', 
     ] 
} 

¿Alguna idea?

+0

Uf. No importa, hablé demasiado pronto. –

+0

Todavía tenía un argv remanente en def main(). Por alguna razón, no me dio un error cuando ejecuté el script antes. –

Respuesta

10

El punto de entrada consoletools console_scripts quiere una función sin argumentos.

Afortunadamente, optparse (Analizador de opciones de línea de comandos) no necesita pasar ningún argumento, se leerá en sys.argv [1:] y lo usará como entrada.

+1

Nota al margen que a partir de Python 2.7, optparse es [depracated] (https://docs.python.org/2/library/optparse.html) a favor de [argparse] (https://docs.python.org/ 2/library/argparse.html) – HeyWatchThis

10

Simplemente para dar una imagen completa de cómo se vería megazord.py, usando la sugerencia de @Jeffrey Harris para utilizar una buena biblioteca para analizar las entradas.

import argparse 

def main(): 
    ''' Example of taking inputs for megazord bin''' 
    parser = argparse.ArgumentParser(prog='my_megazord_program') 
    parser.add_argument('-i', nargs='?', help='help for -i blah') 
    parser.add_argument('-d', nargs='?', help='help for -d blah') 
    parser.add_argument('-v', nargs='?', help='help for -v blah') 
    parser.add_argument('-w', nargs='?', help='help for -w blah') 

    args = parser.parse_args() 

    collected_inputs = {'i': args.i, 
        'd': args.d, 
        'v': args.v, 
        'w': args.w} 
    print 'got input: ', collected_inputs 

Y con su uso como en el anterior, se obtendría

$ megazord -i input -d database -v xx-xx -w yy-yy 
got input: {'i': 'input', 'd': 'database', 'w': 'yy-yy', 'v': 'xx-xx'} 

Y puesto que son todos los argumentos opcionales,

$ megazord 
got input: {'i': None, 'd': None, 'w': None, 'v': None} 
Cuestiones relacionadas