【发布时间】:2019-10-17 07:04:54
【问题描述】:
解决了使用click 而不是argparse,见下文..
我正在构建一个 Python 命令行工具,遵循 Thomas Stringer 的 great tutorial。我的工具是这样使用的
$ python rsearch.py -f foo -b bar
我将它与python setup.py sdist 和python setup.py install 打包在一起,遵循docs。一切都很好!现在我将它安装为带有pip install -e . 的pip 包,我的可执行文件已准备就绪,对吧?
$ which rsearch
/usr/local/bin/rsearch
问题是
$ rsearch -f foo.txt -b bar/
Searching...
Searching...
Found item from foo.txt in bar/path/to/target/
Searching...
Done!
Traceback (most recent call last):
File "/usr/local/bin/rsearch", line 11, in <module>
load_entry_point('rsearch', 'console_scripts', 'rsearch')()
TypeError: main() missing 2 required positional arguments: 'foo' and 'bar'
我认为问题在于我的entry_points 没有正确指定:
from setuptools import setup
setup(
name='rsearch',
version='0.0.1',
py_modules=['rsearch'],
entry_points={
'console_scripts': [
'rsearch=rsearch.__main__:main'
]
})
根据我遵循的教程,尽管从 2016 年开始,这应该可以工作。我知道 distutils.core 是 Python 3.7 的首选 setup() 方法,但我也尝试过,并且得到了相同的结果。
我的__main__.py 看起来像这样:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
'--foo',
'-f',
help='Foo help'
)
parser.add_argument(
'--bar',
'-b',
help='Bar help'
)
def main(foi, gras):
# code code code
# code code..
args = parser.parse_args()
main(args.foo, args.bar)
我的项目结构如下:
rsearch
├── rsearch
│ └── __main__.py
└── setup.py
旁注:python 脚本按预期运行:
$ python __main__.py -f foo.txt -b bar/
Searching...
Searching...
Found item from foo.txt in bar/path/to/target/
Searching...
Done!
所以脚本似乎不是问题。仅在尝试运行使用 setuptools.setup() 构建的可执行文件时才会出现此错误
我正在使用Python 3.7.3 和pip 19.1.1。非常感谢任何帮助或建议。
更新
根据@techouse 的建议,我使用click 复制了这个CLI,并按照他们的documentation 更新了setup.py 中的entry_points 分配。
setup(
name='rsearch',
version='0.0.1',
py_modules=['rsearch'],
install_requires=[
'Click',
],
entry_points='''
[console_scripts]
rsearch=rsearch_script:cli
''',
)
我将脚本重命名为 rsearch_script.py 并使用 click 装饰器而不是 argparse:
@click.command()
@click.option('--foo', '-f')
@click.option('--bar', '-b')
def cli(foo, bar):
# code code code
# code code..
我还移动了文件(来自文档,可能无关紧要)
rsearch
├── rsearch_script.py
└── setup.py
在这个目录中,我运行了pip install -e .,然后砰!
没有错误,工作正常。
$ rsearch -f foo.txt -b bar
Searching...
Searching...
# ...
$ rsearch --help
Usage: rsearch [OPTIONS]
Options:
-f, --foo TEXT
-b, --bar TEXT
--help
感谢@techouse 的提示 - 你说得对,从现在开始我将使用 Click 来开发 Python CLI。
【问题讨论】:
-
感谢@techouse 的建议,我听说过有关 Click 的积极消息,它是一个可爱的图书馆。我会试一试!
标签: python python-3.x command-line-interface setuptools setup.py