构建Python CLI:如何在setuptools.setup中正确声明入口点 使用单击而不是argparse解决,请参见下文。。
我正在构建一个Python命令行工具,它是由Thomas Stringer编写的。我的工具就是这样使用的构建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 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脚本中这样做,所以我甚至没有三思而后行。