2010-05-17 1 views
6

я использую Setuptools для сценария Python Я написалSetuptools не передавая аргументы entry_points

После установки, я:

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

Как я бы, если бы я управлял его ./like_this

Однако, я получаю:

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) 

который выглядит как Setuptools не посылает свои аргументы к основной(), который будет обработан (по optparse)

Вот мои Setuptools конфиг для 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', 
     ] 
} 

Есть идеи?

+0

Тьфу. Nevermind, я говорил слишком рано. –

+0

У меня все еще был остаток argv в def main(). По какой-то причине он не дал мне ошибку, когда я запускал скрипт раньше. –

ответ

10

Точка ввода console_scripts setuptools требует функции без аргументов.

К счастью, optparse (Parser для параметров командной строки) не нужно передавать какие-либо аргументы, он будет читать в sys.argv [1:] и использовать его при его вводе.

+1

Обратите внимание, что с Python 2.7 optparse [depracated] (https://docs.python.org/2/library/optparse.html) в пользу [argparse] (https://docs.python.org/ 2/библиотека/argparse.html) – HeyWatchThis

10

Просто, чтобы дать полное представление о том, что будет выглядеть megazord.py, используя предложение @Jeffrey Harris использовать симпатичную библиотеку для разбора входных данных.

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 

И с помощью его, как в приведенном выше, можно было бы получить

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

И так как они все необязательные аргументы,

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