如何使用setuptools安装python cli脚本而不重复?

时间:2010-12-05 15:37:30

标签: python setuptools

我有2个Python脚本可以在shell中使用,这要归功于argparse。

setup.py的相关部分:

setup(
    # (...)
    zip_safe=True,
    scripts=['bin/bgce.py', 'bin/sizes.py'],
    packages=find_packages(),
    data_files=data_files,
    entry_points = {
        'console_scripts': [
            'bgce = bgce:main',
            'sizes = sizes:main',]
    }
)

我最终在/ usr / local / bin中使用了bgce,bgce.py,sizes,sizes.py。全部4个工作。

如果我遗漏了包或脚本行,则没有重复项,但文件会像这样失败:

Traceback (most recent call last):
File "/usr/local/bin/bgce", line 9, in <module>
    load_entry_point('Backtestground==1.0', 'console_scripts', 'bgce')()
File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 305, in load_entry_point return get_distribution(dist).load_entry_point(group, name)
File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 2244, in load_entry_point return ep.load()
File "/usr/lib/python2.6/dist-packages/pkg_resources.py", line 1954, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named bgce

我该怎么办才能安装bgce和尺寸,没有重复的烦恼(for tab-completion).py附加?

2 个答案:

答案 0 :(得分:4)

确保实际模块具有 main 功能,如下所示:

def main():
    try:
        some_stuff()
    except KeyboardInterrupt :
        print ""
        sys.exit()

if __name__ == "__main__" :
    main()

我们经常在if __name__ == "__main__" :下面写出主代码的模式 如果没有实际的main(),则distutils无法获得加载点。 (捕捉^ C是可选的:)我也遇到了这个问题,直到我意外地发现我的一个模块实际工作而其他模块没有。这是差异,一旦纠正,这一切都很好!

答案 1 :(得分:0)

IIRC:拥有bgce.py和sizes.py部分软件包,删除脚本参数,保留入口点。