微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在python 3.6中将我的子命令拆分为多个文件并单击7.1.2

如何解决如何在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-失败

基于此link代码,但是对我来说不起作用...

这是每个文件代码

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 举报,一经查实,本站将立刻删除。