如何解决如何在python 3.6中将我的子命令拆分为多个文件并单击7.1.2
我想在一个不同的文件中实现每个子命令,以提高清晰度。
现在我只有一个,但是想法是随着时间增加更多。
为此,我尝试了2种方法,但最终都失败了……
基本上,我尝试得到以下结果:
$ test_cli
Usage: test_cli [OPTIONS] COMMAND [ARGS]...
Cli command
Options:
--help Show this message and exit.
Commands:
test Test command.
$ test_cli test hello
Hello !
这是文件
$ tree
.
├── cli.py
├── setup.py
└── test.py
我正在使用virtualenv,并且使用以下命令来测试我的应用程序:
$ pip install --editable .
setup.py 的代码是相同的:
from setuptools import setup
setup(
name = 'test_cli',version = '1.0',py_modules = [ 'cli','test' ],install_requires = [
'Click',],entry_points = '''
[console_scripts]
test_cli=cli:cli
''',)
尝试1-失败
cli.py
import click
import test
@click.group()
def cli():
''' Cli command '''
pass
cli.add_command(test)
test.py
import click
@click.group()
def test():
''' Test command. '''
pass
@test.command()
def hello():
click.echo('Hello !')
这是我的错误:
Traceback (most recent call last):
File "/tmp/myenv/bin/test_cli",line 33,in <module>
sys.exit(load_entry_point('test-cli','console_scripts','test_cli')())
File "/tmp/myenv/bin/test_cli",line 25,in importlib_load_entry_point
return next(matches).load()
File "/tmp/myenv/lib/python3.6/site-packages/importlib_Metadata/__init__.py",line 105,in load
module = import_module(match.group('module'))
File "/usr/lib64/python3.6/importlib/__init__.py",line 126,in import_module
return _bootstrap._gcd_import(name[level:],package,level)
File "<frozen importlib._bootstrap>",line 994,in _gcd_import
File "<frozen importlib._bootstrap>",line 971,in _find_and_load
File "<frozen importlib._bootstrap>",line 955,in _find_and_load_unlocked
File "<frozen importlib._bootstrap>",line 665,in _load_unlocked
File "<frozen importlib._bootstrap_external>",line 678,in exec_module
File "<frozen importlib._bootstrap>",line 219,in _call_with_frames_removed
File "/tmp/toto/cli.py",line 9,in <module>
cli.add_command(test)
File "/tmp/myenv/lib/python3.6/site-packages/click/core.py",line 1347,in add_command
name = name or cmd.name
AttributeError: module 'test' has no attribute 'name'
尝试2-失败
这次,我找到了代码here。我没有任何错误,但是我无法执行任何子命令:-/
cli.py
import click
import test
@click.group()
def cli():
''' Cli command '''
pass
导入点击 导入cli
test.py
import click
import cli
@cli.group()
def test():
''' Test command. '''
pass
@test.command()
def hello():
click.echo('Hello !')
当我尝试执行子命令时,我遇到了这个问题:
$ test_cli test hello
Usage: test_cli [OPTIONS] COMMAND [ARGS]...
Try 'test_cli --help' for help.
Error: No such command 'test'.
对这个问题有任何想法吗?
谢谢。
解决方法
最简单的方法是为您的 CLI 实现一个单独的 .py 文件并将函数导入其中。我已经在我自己的程序中实现了这个:
控制台.py
import click
from .main import store,retrieve
@click.group()
def cli():
pass
@cli.command(no_args_is_help=True)
(series of @click.arguments)
def store(application,key,expiration,userdata):
# sends the arguments directly to the "store" function in main.py
store(application,userdata)
(other commands)
if __name__ == '__main__':
cli()
在 main.py 中
def store(app,userdata):
"""Program for a user to submit a user-generated API key to their database."""
# The actual function doing its work,in a separate file
此方法将您的 CLI 设置与实际代码分开,同时允许完全访问所有点击功能,包括组、子命令等。它还允许您从许多不同的模块调用命令,甚至在您的 CLI 中调用外部命令(例如,如果您想要一个 CLI 将来自各种包的多个功能组合在一起,请搁置关于这是否是适当行为的讨论)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。