如何使用setuptools安装python CLI脚本而不重复?
我有两个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 是可选的 :) 我也遇到过这个问题,直到我偶然发现我的一个模块实际上是可以工作的,而其他的却不行。这就是区别,一旦修正过来,一切就好了!