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

5 投票
2 回答
2584 浏览
提问于 2025-04-16 08:04

我有两个Python脚本,可以直接在命令行中使用,因为我用了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这四个文件。它们都能正常工作。

如果我省略了packages或scripts这一行,就不会出现重复的文件,但这些文件就会出现问题,如下所示:

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和sizes这两个文件,而不想要那些带有.py后缀的重复文件呢?这样会让自动补全变得很麻烦。

2 个回答

0

如果我没记错的话:把bgce.py和sizes.py放到你的包里,去掉scripts这个参数,保留入口点。

4

确保你的模块里有一个 main 函数,像这样:

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

if __name__ == "__main__" :
    main()

我们通常会在 if __name__ == "__main__" : 下面写主要的代码。如果没有实际的 main() 函数,distutils 就无法找到加载点。(捕捉 ^C 是可选的 :) 我也遇到过这个问题,直到我偶然发现我的一个模块实际上是可以工作的,而其他的却不行。这就是区别,一旦修正过来,一切就好了!

撰写回答