Setuptools未传递entry_points参数

13 投票
2 回答
11556 浏览
提问于 2025-04-15 22:49

我在用setuptools来处理我写的一个Python脚本。

安装完之后,我会这样做:

$ 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没有把我的参数传递给main()去解析(通过optparse)。

这是我设置的setuptools的入口点配置:

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

有没有什么想法?

2 个回答

20

为了让大家更清楚地了解 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}
14

setuptools的console_scripts入口点需要一个不带参数的函数。

幸运的是,optparse(命令行选项解析器)不需要传入任何参数,它会自动读取系统参数中的内容(也就是sys.argv[1:]),并把这些作为输入。

撰写回答