标签: python-click

nargs =*等效于Click中的选项

在Click中是否有与可选参数相同argparsenargs='*'功能?

我正在编写命令行脚本,其中一个选项需要能够获取无限数量的参数,例如:

foo --users alice bob charlie --bar baz
Run Code Online (Sandbox Code Playgroud)

users将是['alice', 'bob', 'charlie'],bar也将是'baz'.

argparse,我可以指定多个可选参数来通过设置收集它们后面的所有参数nargs='*'.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--users', nargs='*')
>>> parser.add_argument('--bar')
>>> parser.parse_args('--users alice bob charlie --bar baz'.split())
Namespace(bar='baz', users=['alice', 'bob', 'charlie'])
Run Code Online (Sandbox Code Playgroud)

我知道Click允许你通过设置指定一个接受无限输入的参数nargs=-1,但当我尝试将可选参数设置nargs为-1时,我得到:

TypeError:选项的narg <0

有没有办法让Click接受一个选项的未指定数量的参数?

更新:

我需要能够在带有无限参数的选项之后指定选项.

python python-3.x python-click

12
推荐指数
3
解决办法
3013
查看次数

可以在 Click 6 中执行多个嵌套命令

我将写一些非常基本的东西,以解释我希望实现的目标。我写了一些代码来做一些有趣的 WordPress 管理。该程序将创建实例,但也会为 apache 创建 https 设置。

我想要它做什么以及我在哪里遇到问题:(如果您在wp cli上运行帮助,您将确切地看到我想要发生的事情......但我不是开发人员,所以我会喜欢一些帮助)

python3 testcommands.py --help
Usage: testcommands.py [OPTIONS] COMMAND [ARGS]...

This is the help

Options:
  --help  Show this message and exit.

Commands:
  https    Commands for HTTPS
  wp       Commands for WP



python3 testcommands.py https --help
Usage: testcommands.py [OPTIONS] COMMAND [ARGS]...

This is the help

Options:
  --help  Show this message and exit.

Commands:
  create    Creates config for HTTPS
  sync      Syncs config for Apache
Run Code Online (Sandbox Code Playgroud)

我的基本代码:

import click


@click.group()
def cli1():
    pass
    """First Command"""


@cli1.command('wp') …
Run Code Online (Sandbox Code Playgroud)

python command-line-interface python-3.x python-click

12
推荐指数
1
解决办法
3242
查看次数

如何使用python单击实现--version?

我想mycommand --version使用 python click来实现。我有这样的工作,但感觉有点笨重。

@click.group(invoke_without_command=True, no_args_is_help=True)
@click.pass_context
@click.option('--version', 'version')
def cli(ctx, version):
    if version:
        ctx.echo(f'{sys.argv[0]} {__version__}')
        ctx.exit()
Run Code Online (Sandbox Code Playgroud)

python command-line-arguments python-click

12
推荐指数
1
解决办法
2140
查看次数

使用python3编码问题并单击包

当lib click检测到运行时是python3但编码是ASCII时,它会突然结束python程序:

RuntimeError: Click will abort further execution because Python 3 was configured to use ASCII as encoding for the environment. Either switch to Python 2 or consult http://click.pocoo.org/python3/ for mitigation steps.
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我发现了这个问题的原因,当我从Mac连接到我的Linux主机时,Terminal.app将SSH会话区域设置为我的Mac区域设置(es_ES.UTF-8)但是我的Linux主机没有安装这样的语言环境(仅限en_US.utf-8).

我应用了一个初步的解决方法来解决它(但它有很多问题,请参阅已接受的答案):

import locale, codecs
# locale.getpreferredencoding() == 'ANSI_X3.4-1968'
if codecs.lookup(locale.getpreferredencoding()).name == 'ascii':
    os.environ['LANG'] = 'en_US.utf-8'
Run Code Online (Sandbox Code Playgroud)

编辑:要获得更好的补丁,请参阅我接受的答案.

我的所有linux主机都安装了'en_US.utf-8'作为语言环境(Fedora默认使用它).

我的问题是:在python3脚本中选择/强制语言环境是否有更好(更强大)的方法?例如,在系统中设置一个可用的语言环境.

也许有一种不同的方法来解决这个问题,但我没有找到它.

encoding command-line-interface python-3.x python-click

11
推荐指数
1
解决办法
3999
查看次数

Python单击:让组在命令后执行代码

我有一个已click.group()定义的,其中包含大约10个命令.我理解如何使用组在命令中的代码之前运行代码,但我也希望在每个命令运行后运行一些代码.点击可能吗?

python python-click

11
推荐指数
1
解决办法
952
查看次数

如何将几个参数列表传递给@ click.option

我想通过命令行使用这种参数调用python脚本(列表可以是任何大小,例如3):

python test.py --option1 ["o11", "o12", "o13"] --option2 ["o21", "o22", "o23"]
Run Code Online (Sandbox Code Playgroud)

使用点击.从文档中,我们无法在任何地方声明我们可以使用列表作为@ click.option的参数

当我尝试这样做时:

#!/usr/bin/env python
import click

@click.command(context_settings=dict(help_option_names=['-h', '--help']))
@click.option('--option', default=[])
def do_stuff(option):

    return

# do stuff
if __name__ == '__main__':
    do_stuff()
Run Code Online (Sandbox Code Playgroud)

在我的test.py,通过从命令行调用它:

python test.py --option ["some option", "some option 2"]
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

错误:得到意外的额外参数(某些选项2))

我不能真正使用可变参数,因为每个命令只允许1个可变参数(http://click.pocoo.org/5/arguments/#variadic-arguments)

因此,如果有人能指出我正确的方向(最好使用点击),我将非常感激.

python parameters command-line python-click

11
推荐指数
2
解决办法
9446
查看次数

是否可以将python @ click.option装饰器重复用于多个命令?

我有两个Python CLI工具,它们共享一组常用的click.options。目前,通用选项已重复:

@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-1', is_flag=True)
def command_one():
    pass

@click.command()
@click.option('--foo', is_flag=True)
@click.option('--bar', is_flag=True)
@click.option('--unique-flag-2', is_flag=True)
def command_two():
    pass
Run Code Online (Sandbox Code Playgroud)

是否可以将通用选项提取到可以应用于每个功能的单个装饰器中?

python python-click

11
推荐指数
3
解决办法
639
查看次数

单击时包含子模块

我试图在我的第一个Click CLI应用程序上进行一种递归调用.要点是让子命令与第一个相关联,因此,我试图将它们全部分离到不同的文件/模块中以提高它的可维护性.

我有现在directory:

root
|-commands
|-project
|---__init__
|---command1
|---command2
|-database
|---__init__
|---command1
|---command2
Run Code Online (Sandbox Code Playgroud)

这是我的主要文件:

import click
from commands.project import project
from commands.database import database


@click.group(help="Main command")
def main():
    pass


main.add_command(project)
main.add_command(database)
Run Code Online (Sandbox Code Playgroud)

我的项目__init__档案:

from commands.project.command1 import *
from commands.project.command2 import *
import click


@click.group(help="Projects")
def project():
    pass


project.add_command(command1)
project.add_command(command2)
Run Code Online (Sandbox Code Playgroud)

我的commands.project.command1档案:

import click


@click.command()
def command1():
    """
    Execute all the steps required to update the project.
    """
    pass
Run Code Online (Sandbox Code Playgroud)

这里的要点是,每次我想添加一个新的子命令时,我需要:

  1. .py在相应的子命令/子模块文件夹中添加包含所有代码的文件(显然!)

  2. import在它的__init__文件上添加它的声明

  3. 将此新命令与其父项(项目/数据库,在本例中)相关联 …

python command-line-interface python-3.x python-click

11
推荐指数
2
解决办法
409
查看次数

在Python中使用布尔标志单击库(命令行参数)

我正试图为我的Python程序制作一个详细的标志.目前,我这样做:

import click

#global variable
verboseFlag = False

#parse arguments
@click.command()
@click.option('--verbose', '-v', is_flag=True, help="Print more output.")
def log(verbose):
    global verboseFlag
    verboseFlag = True

def main():    
    log()        
    if verboseFlag:
         print("Verbose on!")

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

它永远不会打印"详细!" 即使我设置'-v'参数.我的想法是日志功能需要一个参数,但我该给它什么?另外,有没有办法检查详细标志是否在没有全局变量的情况下打开?

python command-line-arguments python-click

11
推荐指数
2
解决办法
5897
查看次数

在setuptools包上的Pyinstaller

我正在尝试在我使用Click库在Python中构建的CLI应用程序上运行PyInstaller .我在使用PyInstaller构建项目时遇到了麻烦.PyInstaller在他们的GitHub wiki中有一个名为Recipe Setuptools Entry Point的文档,该文档提供了有关如何将PyInstaller与setuptools包一起使用的信息,我正在为此项目使用它.但是,它似乎在我运行时找不到基本模块pyinstaller --onefile main.spec.

我的问题是:问题只是我的文件夹结构的问题吗?Recipe Setuptools入口点是否采用某种文件结构?

相关信息

Pyinstaller输出

184 INFO: PyInstaller: 3.3.1
184 INFO: Python: 3.6.4
189 INFO: Platform: Darwin-16.7.0-x86_64-i386-64bit
193 INFO: UPX is available.
Traceback (most recent call last):
  File "/usr/local/bin/pyinstaller", line 11, in <module>
    sys.exit(run())
  File "/usr/local/lib/python3.6/site-packages/PyInstaller/__main__.py", line 94, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "/usr/local/lib/python3.6/site-packages/PyInstaller/__main__.py", line 46, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "/usr/local/lib/python3.6/site-packages/PyInstaller/building/build_main.py", line 791, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File …
Run Code Online (Sandbox Code Playgroud)

python setuptools pyinstaller python-3.x python-click

10
推荐指数
1
解决办法
3043
查看次数