2010-05-17 30 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的是不是送我的论点

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

任何想法:给main()至(由optparse)

这里的config为entry_points我setuptools的解析?

+0

唉。没关系,我说得太快了。 – 2010-05-17 21:48:47

+0

我在def main()中仍然有一个残余的argv。出于某种原因,我之前运行脚本时没有给出错误信息。 – 2010-05-17 21:49:32

回答

10

setuptools console_scripts入口点需要一个没有参数的函数。

很高兴,optparse(用于命令行选项的解析器)不需要传递任何参数,它将在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 2014-05-20 14:14:10

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}