在Click中是否有与可选参数相同argparse的nargs='*'功能?
我正在编写命令行脚本,其中一个选项需要能够获取无限数量的参数,例如:
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接受一个选项的未指定数量的参数?
我需要能够在带有无限参数的选项之后指定选项.
我将写一些非常基本的东西,以解释我希望实现的目标。我写了一些代码来做一些有趣的 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) 我想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) 当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脚本中选择/强制语言环境是否有更好(更强大)的方法?例如,在系统中设置一个可用的语言环境.
也许有一种不同的方法来解决这个问题,但我没有找到它.
我有一个已click.group()定义的,其中包含大约10个命令.我理解如何使用组在命令中的代码之前运行代码,但我也希望在每个命令运行后运行一些代码.点击可能吗?
我想通过命令行使用这种参数调用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 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)
是否可以将通用选项提取到可以应用于每个功能的单个装饰器中?
我试图在我的第一个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)
这里的要点是,每次我想添加一个新的子命令时,我需要:
.py在相应的子命令/子模块文件夹中添加包含所有代码的文件(显然!)
import在它的__init__文件上添加它的声明
将此新命令与其父项(项目/数据库,在本例中)相关联 …
我正试图为我的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'参数.我的想法是日志功能需要一个参数,但我该给它什么?另外,有没有办法检查详细标志是否在没有全局变量的情况下打开?
我正在尝试在我使用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-click ×10
python ×9
python-3.x ×5
command-line ×1
encoding ×1
parameters ×1
pyinstaller ×1
setuptools ×1