构建Python CLI:如何在setuptools.setup中正确声明入口点 使用单击而不是argparse解决,请参见下文。。

构建Python CLI:如何在setuptools.setup中正确声明入口点 使用单击而不是argparse解决,请参见下文。。,python,python-3.x,command-line-interface,setuptools,setup.py,Python,Python 3.x,Command Line Interface,Setuptools,Setup.py,我正在构建一个Python命令行工具,它是由Thomas Stringer编写的。我的工具就是这样使用的 $python rsearch.py-f foo-b bar 我用python setup.py sdist和python setup.py install打包了它,并遵循了。一切都很好!现在我用pip install-e.以pip包的形式安装它,我的可执行文件已经准备就绪,对吗 $rsearch /usr/local/bin/rsearch 问题是 $rsearch-f foo.txt

我正在构建一个Python命令行工具,它是由Thomas Stringer编写的。我的工具就是这样使用的

$python rsearch.py-f foo-b bar
我用
python setup.py sdist
python setup.py install
打包了它,并遵循了。一切都很好!现在我用
pip install-e.
pip
包的形式安装它,我的可执行文件已经准备就绪,对吗

$rsearch
/usr/local/bin/rsearch
问题是
$rsearch-f foo.txt-b条/
搜索。。。
搜索。。。
在bar/path/to/target中找到foo.txt中的项/
搜索。。。
完成!
回溯(最近一次呼叫最后一次):
文件“/usr/local/bin/rsearch”,第11行,在
加载入口点('rsearch','console_scripts','rsearch')()
TypeError:main()缺少2个必需的位置参数:“foo”和“bar”
我认为问题在于我的
入口点没有正确指定:

从设置工具导入设置
设置(
name='rsearch',
version='0.0.1',
py_模块=['rsearch'],
入境点={
“控制台脚本”:[
'rsearch=rsearch.\uuuuu main\uuuuuuu:main'
]
})
根据我从2016年开始学习的教程,这应该是可行的。我知道
distutils.core
是Python 3.7首选的
setup()
方法,但我也尝试过,并且得到了相同的结果

我的
\uuuu main\uuuu.py
如下所示:

import argparse
parser=argparse.ArgumentParser()
parser.add_参数(
“--foo”,
“-f”,
help='Foo help'
)
parser.add_参数(
“--酒吧”,
“-b”,
help='Bar help'
)
def干管(foi、gras):
#代码
#代码。。
args=parser.parse_args()
主(args.foo、args.bar)
我的项目结构如下:

rsearch
├── rsearch
│   └── __main__.py
└── setup.py
旁注:python脚本按预期运行:

$python\uuuu main\uuuuu.py-f foo.txt-b条/
搜索。。。
搜索。。。
在bar/path/to/target中找到foo.txt中的项/
搜索。。。
完成!
所以脚本似乎不是问题所在。此错误仅在尝试运行使用
setuptools.setup()生成的可执行文件时发生。

我正在使用
python3.7.3
pip19.1.1
。非常感谢您的帮助或建议


更新 根据@techouse的建议,我在
setup.py
中使用并更新了
entry\u points
分配,并按照它们的建议复制了此CLI

设置(
name='rsearch',
version='0.0.1',
py_模块=['rsearch'],
安装所需的=[
“点击”,
],
入口点=“”
[控制台脚本]
rsearch=rsearch\u脚本:cli
''',
)
我将脚本重命名为
rsearch\u script.py
,并使用
单击
装饰器而不是
argparse

@click.command()
@单击.option('--foo','-f')
@单击.option('--bar','-b')
def cli(foo,bar):
#代码
#代码。。
我还移动了文件(来自文档,可能没关系)

rsearch
├── rsearch_script.py
└── setup.py
在这个目录中,我运行了
pip安装-e.
和boom

没有错误,正在工作

$rsearch-f foo.txt-b条
搜索。。。
搜索。。。
# ...
$rsearch——救命
用法:rsearch[选项]
选项:
-f、 --富文本
-b、 --条形文本
--帮助

谢谢@techouse的提示-你说得对,从现在开始,我将使用Click开发Python CLI。

入口点将直接调用你的
main
-这是
'rsearch=rsearch中最后一个
main
。\uu main\uuuuuu:main'
。这意味着调用args解析器的代码永远不会被调用,因此您会遇到从未传入参数的问题

不要更改
setup.py
,而是移动
main
函数下的
args=parser.parse_args()


if\uuuu name\uuu==\uuuu main\uuuu
条件只有在脚本像您那样直接运行时才会运行,而不是在几乎任何其他情况下运行。

我建议使用而不是
argparse
,因为测试
argparse
很痛苦。然后查看感谢@techouse的建议,我听到了关于Click的积极消息,这是一个可爱的库。我要试一试!嗨,德瓦贡,谢谢你的洞察力!实际上,从我的脚本中删除
if\uuuuuu name\uuuuu
等确实修复了错误,
rsearch--help
现在运行时没有问题。奇怪的是,当我使用实数参数运行脚本时,仍然会出现这个错误
rsearch-f foo.txt-b bar/
。奇怪的是,这实际上是可行的,但一旦脚本完成运行,它就会产生与上面完全相同的
回溯。.我根据@dwagon的回复更新了这篇文章。再次感谢!如果对于可执行文件,我们需要删除
,这很有意义,因为我已经习惯了在Python脚本中这样做,所以我甚至没有三思而后行。