精华内容
下载资源
问答
  • Click 是 Python Web 开发框架 Flask的作者开发的一个库,用于快速创建命令行,目前已经整合到了最新版的 Flask 当中。Click 功能强大,使用也比较简单,值得大家学习使用。作者:funhacks原文:...
    1a655823dd6079d2797719aef8e6dc12.png

    Click 是 Python Web 开发框架 Flask的作者开发的一个库,用于快速创建命令行,目前已经整合到了最新版的 Flask 当中。Click 功能强大,使用也比较简单,值得大家学习使用。

    作者:funhacks

    原文:https://funhacks.net/2016/12/20/click/

    Click 是用 Python 写的一个第三方模块,用于快速创建命令行。我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argparse,就好比 requests 相比于 urllib。

    快速使用

    Click 的使用大致有两个步骤:

    使用 @click.command 装饰一个函数,使之成为命令行接口; 使用 @click.option 等装饰函数,为其添加命令行选项等。 它的一种典型使用形式如下:

    importclick

    @click.command

    @click.option('--param', default=default_value, help='description')

    deffunc(param):

    pass

    下面,让我们看一下官方文档的入门例子:

    importclick

    @click.command

    @click.option('--count', default=1, help='Number of greetings.')

    @click.option('--name', prompt='Your name', help='The person to greet.')

    defhello(count, name):

    """Simple program that greets NAME for a total of COUNT times."""

    forxinrange(count):

    click.echo('Hello %s!' % name)

    if__name__ == '__main__':

    hello

    在上面的例子中,函数 hello 有两个参数:count 和 name,它们的值从命令行中获取。

    • @click.command 使函数 hello 成为命令行接口;

    • @click.option 的第一个参数指定了命令行选项的名称,可以看到,count 的默认值是 1;

    • 使用 click.echo 进行输出是为了获得更好的兼容性,因为 print 在 Python2 和 Python3 的用法有些差别。

    看看执行情况:

    $ python hello.py

    Your name: Ethan # 这里会显示 'Your name: '(对应代码中的 prompt),接受用户输入

    Hello Ethan!

    $ python hello.py --help # click 帮我们自动生成了 `--help` 用法

    Usage: hello.py [OPTIONS]

    Simple program that greets NAME fora total of COUNT times.

    Options:

    --count INTEGER Number of greetings.

    --name TEXT The person to greet.

    --help Show thismessageandexit.

    $ python hello.py --count 3--name Ethan # 指定 count 和 name 的值

    Hello Ethan!

    Hello Ethan!

    Hello Ethan!

    $ python hello.py --count=3--name=Ethan # 也可以使用 `=`,和上面等价

    Hello Ethan!

    Hello Ethan!

    Hello Ethan!

    $ python hello.py --name=Ethan # 没有指定 count,默认值是 1

    Hello Ethan!

    click.option

    option 最基本的用法就是通过指定命令行选项的名称,从命令行读取参数值,再将其传递给函数。在上面的例子,我们看到,除了设置命令行选项的名称,我们还会指定默认值,help 说明等,option 常用的设置参数如下:

    • default: 设置命令行参数的默认值

    • help: 参数说明

    • type: 参数类型,可以是 string, int, float 等

    • prompt: 当在命令行中没有输入相应的参数时,会根据 prompt 提示用户输入

    • nargs: 指定命令行参数接收的值的个数

    下面,我们再看看相关的例子。

    指定 type

    我们可以使用 type 来指定参数类型:

    importclick

    @click.command

    @click.option('--rate', type=float, help='rate') # 指定 rate 是 float 类型

    defshow(rate):

    click.echo('rate: %s' % rate)

    if__name__ == '__main__':

    show

    执行情况:

    $ python click_type.py --rate 1

    rate: 1.0

    $ python click_type.py --rate 0.66

    rate: 0.66

    可选值

    在某些情况下,一个参数的值只能是某些可选的值,如果用户输入了其他值,我们应该提示用户输入正确的值。在这种情况下,我们可以通过 click.Choice 来限定:

    importclick

    @click.command

    @click.option('--gender', type=click.Choice(['man', 'woman'])) # 限定值

    defchoose(gender):

    click.echo('gender: %s' % gender)

    if__name__ == '__main__':

    choose

    执行情况:

    $ python click_choice.py --gender boy

    Usage: click_choice.py [OPTIONS]

    Error: Invalid value for"--gender": invalid choice: boy. (choosefromman, woman)

    $ python click_choice.py --gender man

    gender: man

    多值参数

    有时,一个参数需要接收多个值。option 支持设置固定长度的参数值,通过 nargs 指定。

    看看例子就明白了:

    importclick

    @click.command

    @click.option('--center', nargs=2, type=float, help='center of the circle')

    @click.option('--radius', type=float, help='radius of the circle')

    defcircle(center, radius):

    click.echo('center: %s, radius: %s' % (center, radius))

    if__name__ == '__main__':

    circle

    在上面的例子中,option 指定了两个参数:center 和 radius,其中,center 表示二维平面上一个圆的圆心坐标,接收两个值,以元组的形式将值传递给函数,而 radius 表示圆的半径。

    执行情况:

    $ python click_multi_values.py --center 34--radius10

    center: (3.0,4.0), radius:10.0

    $ python click_multi_values.py --center 345--radius10

    Usage: click_multi_values.py [OPTIONS]

    Error: Got unexpected extra argument (5)

    输入密码

    有时,在输入密码的时候,我们希望能隐藏显示。option 提供了两个参数来设置密码的输入:hideinput 和 confirmationpromt,其中,hideinput 用于隐藏输入,confirmationpromt 用于重复输入。

    看看例子:

    importclick

    @click.command

    @click.option('--password', prompt=True, hide_input=True, confirmation_prompt=True)

    definput_password(password):

    click.echo('password: %s' % password)

    if__name__ == '__main__':

    input_password

    执行情况:

    $ python click_password.py

    Password: # 不会显示密码

    Repeat forconfirmation: # 重复一遍

    password: 666666

    由于上面的写法有点繁琐,click 也提供了一种快捷的方式,通过使用 @click.password_option,上面的代码可以简写成:

    importclick

    @click.command

    @click.password_option

    definput_password(password):

    click.echo('password: %s' % password)

    if__name__ == '__main__':

    input_password

    改变命令行程序的执行

    有些参数会改变命令行程序的执行,比如在终端输入 python 是进入 python 控制台,而输入 python --version 是打印 python 版本。Click 提供 eager 标识对参数名进行标识,如果输入该参数,则会拦截既定的命令行执行流程,跳转去执行一个回调函数。

    让我们看看例子:

    importclick

    defprint_version(ctx, param, value):

    ifnotvalueorctx.resilient_parsing:

    return

    click.echo('Version 1.0')

    ctx.exit

    @click.command

    @click.option('--version', is_flag=True, callback=print_version,

    expose_value=False, is_eager=True)

    @click.option('--name', default='Ethan', help='name')

    defhello(name):

    click.echo('Hello %s!' % name)

    if__name__ == '__main__':

    hello

    其中:

    • is_eager=True 表明该命令行选项优先级高于其他选项;

    • expose_value=False 表示如果没有输入该命令行选项,会执行既定的命令行流程;

    • callback 指定了输入该命令行选项时,要跳转执行的函数;

    执行情况:

    $ python click_eager.py

    Hello Ethan!

    $ python click_eager.py --version # 拦截既定的命令行执行流程

    Version 1.0

    $ python click_eager.py --name Michael

    Hello Michael!

    $ python click_eager.py --version --name Ethan # 忽略 name 选项

    Version 1.0

    click.argument

    我们除了使用 @click.option 来添加可选参数,还会经常使用 @click.argument 来添加固定参数。它的使用和 option 类似,但支持的功能比 option 少。

    入门使用

    下面是一个简单的例子:

    importclick

    @click.command

    @click.argument('coordinates')

    defshow(coordinates):

    click.echo('coordinates: %s' % coordinates)

    if__name__ == '__main__':

    show

    看看执行情况:

    $ python click_argument.py # 错误,缺少参数 coordinates

    Usage: click_argument.py [OPTIONS] COORDINATES

    Error: Missing argument "coordinates".

    $ python click_argument.py --help # argument 指定的参数在 help 中没有显示

    Usage: click_argument.py [OPTIONS] COORDINATES

    Options:

    --help Show thismessageandexit.

    $ python click_argument.py --coordinates 10# 错误用法,这是 option 参数的用法

    Error: nosuch option: --coordinates

    $ python click_argument.py 10# 正确,直接输入值即可

    coordinates: 10

    多个 argument

    我们再来看看多个 argument 的例子:

    importclick

    @click.command

    @click.argument('x')

    @click.argument('y')

    @click.argument('z')

    defshow(x, y, z):

    click.echo('x: %s, y: %s, z:%s' % (x, y, z))

    if__name__ == '__main__':

    show

    执行情况:

    $ python click_argument.py 102030

    x: 10, y:20, z:30

    $ python click_argument.py 10

    Usage: click_argument.py [OPTIONS] X Y Z

    Error: Missing argument "y".

    $ python click_argument.py 1020

    Usage: click_argument.py [OPTIONS] X Y Z

    Error: Missing argument "z".

    $ python click_argument.py 10203040

    Usage: click_argument.py [OPTIONS] X Y Z

    Error: Got unexpected extra argument (40)

    不定参数

    argument 还有另外一种常见的用法,就是接收不定量的参数,让我们看看例子:

    importclick

    @click.command

    @click.argument('src', nargs=-1)

    @click.argument('dst', nargs=1)

    defmove(src, dst):

    click.echo('move %s to %s' % (src, dst))

    if__name__ == '__main__':

    move

    其中,nargs=-1 表明参数 src 接收不定量的参数值,参数值会以 tuple 的形式传入函数。如果 nargs 大于等于 1,表示接收 nargs 个参数值,上面的例子中,dst 接收一个参数值。

    让我们看看执行情况:

    $ python click_argument.py file1 trash # src=('file1',) dst='trash'

    move (u'file1',) to trash

    $ python click_argument.py file1 file2 file3 trash # src=('file1', 'file2', 'file3') dst='trash'

    move (u'file1', u'file2', u'file3') to trash

    彩色输出

    在前面的例子中,我们使用 click.echo 进行输出,如果配合 colorama 这个模块,我们可以使用 click.secho 进行彩色输出,在使用之前,使用 pip 安装 colorama:

    $ pip install colorama

    看看例子:

    importclick

    @click.command

    @click.option('--name', help='The person to greet.')

    defhello(name):

    click.secho('Hello %s!' % name, fg='red', underline=True)

    click.secho('Hello %s!' % name, fg='yellow', bg='black')

    if__name__ == '__main__':

    hello

    其中:

    • fg 表示前景颜色(即字体颜色),可选值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;

    • bg 表示背景颜色,可选值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;

    • underline 表示下划线,可选的样式还有:dim=True,bold=True 等;

    小结

    使用 click.command 装饰一个函数,使其成为命令行接口。 使用 click.option 添加可选参数,支持设置固定长度的参数值。 使用 click.argument 添加固定参数,支持设置不定长度的参数值。

    题图:pexels,CC0 授权。

    展开全文
  • 阿里妹导读:对于稍微复杂一些的命令行工具,命令行的提示功能必不可少。那么对于不同语言的开发者,有没有一种简单快捷的实现方式呢?本文分享一种快速实现的方法,使用YAML文件定义命令行工具的使用规范,再通过...

    42269b6688f40f6990265a96fb13cf78.png

    阿里妹导读:对于稍微复杂一些的命令行工具,命令行的提示功能必不可少。那么对于不同语言的开发者,有没有一种简单快捷的实现方式呢?本文分享一种快速实现的方法,使用YAML文件定义命令行工具的使用规范,再通过工具自动生成各种shell的命令行提示脚本,最后分享一些至关重要的命令行解析器。

    文末福利:云开发体验——Linux指令入门

    不少同学喜欢开发命令行工具,主要是开发快捷,而且和其他命令行工具配合,借助脚本,非常容易实现一些任务的自动化。命令行工具开发比较简单,以Java举一个例子,通常我们只需要一个命令行参数解析器,如Java,就有args4j, jopt,picocli等,转换为结构化的对象,根据输入的参数进行相关的逻辑判断,完成对应的逻辑。其他如Node.js, Deno, Python等,也是一样的流程,都有命令行参数解析器,然后基于命令行输入执行对应的逻辑。一  命令行提示如果命令行工具稍微复杂一些,那么必须要提供对应的命令行提示,不然开发者几乎没法使用。举一个例子,阿里云有对应的命令行工具aliyun-cli[1],下载安装后就可以使用aliyun命令行工具了。执行 aliyun --help,会发现非常多的子命令,如果没有命令行工具提示,开发者使用这个工具就非常复杂,要去查文档,或者通过命令行的help来输入命令。aliyun的命令行工具也提供了对应的代码提示,如下所示:

    b716a6256dcd0577bb4dc33979abb827.png

    这个命令行提示还不错,你只需要选择对应的子命令然后再进行提示就可以了。大多数开发者喜欢带描述的命令行提示。并不是所有的子命令和命令参数都命名得非常好,如aliyun命令行给出的live子命令提示,大家可能完全不知道这个live是什么(当然,作为阿里云的同学,我还是知道的, live是视频直播)。而像如下包括描述的命令行提示就直观很多:

    990f27212ca5809f421587fee341979b.png

    二  生成命令行提示这里不再介绍bash,zsh,fish等各种shell的命令行提示的机制,没有人会手动编写这些命令行提示脚本,大家都会使用框架生成对应shell的命令行提示脚本。我找了一些命令行解析框架,并且能自动生成命令行提示的,如Java的picocli,Node.js的commander.js,Python的argparse,以及Rust的clap-rs等。我都尝试了一下,最终发现还是clap-rs生成的命令行提示比较好,就是我说的那种带描述,而且还有文件名和目录自动提示,枚举值的提示等,关键是也非常简单。如果有同学有更好的命令行解析框架,希望能留言分享一下。那么如何让其他语言,如Node.js,Java,Python这些语言编写的命令行工具也能实现和clap-rs的命令行提示一样的效果呢?三  clap-rs的命令行YAML文件clap-rs包含了一个命令行工具的YAML规范。我们都知道命令行工具交互比较简单,主要就两个部分:参数和子命令。你看到类似 --conf xxx.yaml 这些带参数名的都属于参数,也可以省略参数名,如 convert a.jpg a.png 其中的a.jpg和a.png也都是参数。子命令就比较容易理解了,我们每天使用的git就是大量使用子命令的,如 git add xxx.jpg 这些。当子命令还可以继续套用子命令,子命令同时也拥有自己的参数。基于命令行这样的特性,我们完全可以将命令行工具的使用规范通过YAML描述出来,现在一切皆可YAML。这里我给出一个阿里云命令行工具的YAML定义,当然只是demo。如下:
    name: aliyun2version: "0.1.0"about: "cli for Alibaba Cloud"args:  - version:      short: v      long: version      takes_value: false      about: Display versionsubcommands:  - oss:      about: 对象存储      subcommands:        - cat:            about: cat文本文件            args:              - file:                  takes_value: true                  required: true                  about: 文件名称        - ls:            about: list文件  - ecs:      about: 云服务器      subcommands:        - SendFile:            about: send file        - AddTags:            about: add tags
    可以看出,我首先定义了两个子命令:oss和ecs,然后oss子命令下我又定义了两个子命令:cat和ls。对于oss的cat子命令,我又添加了file这个参数,这样我就可以使用cat来查看oss上文本文件的内容。有了这个命令行工具YAML规范定义后,我就可以调用clap-rs提供的命令行工具接口,生成对应的shell的提示脚本。效果如下:

    f3c7ab1398fffa525162d96d6a7e9320.png

    这个命令行提示的效果是不是比原先的要好多了?提示有了描述,选择子命令和参数的时候就简单多了。四  为所有命令行工具写YAML讲到这里,相信大家都明白了。无论这个工具是Java,Python,Node.js还是Rust编写的,首先定义好该工具的YAML规范,接下来开发人员根据该规范去编写代码,他可以选择他喜欢的语言,他喜欢的命令行解析器,然后实现对应的功能即可。没有代码提升,编写YAML文件不出错是非常难的,所以我做了一个JSON Schema[2]文件,在编写YAML文件时可以进行代码提示,做到编写命令行YAML规范文件更加简单。JSON Schema的使用方法如下:

    0ca45e18980bb718012bc47d81a112f7.png

    接下来我们会基于该YAML文件,为各种shell生成对应的命令行提示脚本,如bash,zsh,fish和powershell,这样分开后,开发人员也不需要去处理那些他不清楚的命令行提示,或者找该编程语言对应的SDK来做命令行代码提示。如果没有怎么办?即便有了,生成的提示非常简单怎么办?毕竟命令行工具提示非常重要。相信Node.js的开发者也不希望还要学习一下Rust和clap-rs,这样就太不高效了。因此我又编写了一个工具cli-completion[3],  其主要目的根据上面说的YAML文件帮你自动生成各种shell的命令行提示脚本。来看一下zsh的例子:
    $ cli-completion --zsh commands/aliyun2.yaml > /usr/local/share/zsh/site-functions/_aliyun2$ autoload -U compinit && compinit
    再看一下oh-my-zsh的例子:
    $ mkdir ~/.oh-my-zsh/custom/plugins/aliyun2 $ cli-completion --zsh aliyun2.yaml >  ~/.oh-my-zsh/custom/plugins/aliyun2/_aliyun2
    通过这种方式,cli-completion可以为任何命令提供命令行提示。也就是说,以后,你只要编写命令行逻辑,关于命令行提示的问题,全部交给cli-completion帮你生成即可。当然考虑到用户体验,你可能需要在命令行工具中,将cli-completion生成的脚本,通过某一子命令,快速同步到客户端环境。命令行的开发流程:YAML规范编写,命令行提示自动生成,开发人员下班前完成功能实现。

    78bf6675fcee25e8ddf84136322fe24b.png

    有同学可能会问,我能否基于YAML文件,并结合某一命令行解析框架,自动完成整个应用的骨架生成,这完全可以,开发人员只要实现一些函数即可,开发会更简单。我个人认为使用PicoCli这些框架自动生成代码,是完全没有问题的。五  将cli-completion FaaS化这个功能大家一年都未必用上两次,费时安装也挺麻烦的。现在不是到处都是FaaS,我们也可以尝试一下。首先cli-completion是用Rust编写的,所以可以用传统的方式编写Rust Cloud Lambda,然后部署到云服务上,另外也可以写一个Rust Web应用,如用actix-web,也非常简单。这些都不够时髦,我们打算将cli-completion的代码WebAssembly化,然后以FaaS方式部署,这里我选择CloudFlare作为FaaS的运行平台。让我们来看一下Demo。创建一个cli.yaml文件,如下:
    name: cli1version: "0.1.0"about: "CLI completion for bash, zsh, fish and powershell."args:  - help:      short: h      long: help      takes_value: false      about: Display this help
    然后调用cli-completion的FaaS服务,就可以得到对应的命令行提示脚本代码。命令如下:
    curl -H 'Content-Type: application/x-yaml' --data-binary "@cli.yaml" https://cli-completion.linux-china.workers.dev/completion/zsh
    对比传统的cloud lambda或者cloud function,这种方式FaaS响应速度最快,这种服务调用次数非常少,基本就是每次请求都是冷启动,而WebAssembly这方面就非常有优势。当然还有一个最大的原因:就是WebAssembly方式的FaaS,它最便宜。题外话探讨一下cloudflare的WebAssmebly的实现,纯技术讨论,代码如下:
    async function handleRequest(request) {    const { greet } = wasm_bindgen    await wasm_bindgen(wasm)    const greeting = greet()    return new Response(greeting, {status: 200})}
    上述代码中,wasm是一个WebAssembly.Module对象,它是从外部注入的,而不是开发者写的,是FaaS生成的。接下来就是从wasm_bindgen这个函数中获取wasm的导出函数,然后调用 wasm_bindgen(wasm) 将greet函数和wasm module中的export函数进行关联,然后调用greet就会转到wasm module的调用。如果是这样的话,WebAssembly.Module其实是可以外部管理的,当有请求时,再和JavaScript的函数进行关联,这样就可以保证WebAssembly的快速响应。六  总结以后大家在写命令行工具时,不用再担心代码提示的问题了。在动手开发工具前,写一下YAML文件,整理和厘清一下你的思路,有哪些子命令,有哪些参数等,然后再基于该YAML文件进行开发,使用什么语言都没有关系,最后配合cli-completion完成命令行提示,你的命令行工具算是相当专业的了,至少从面子上看起来是的 :)最后列出一些命令行应用涉及的至关重要的命令行解析器,方便大家后续参考:
    • Java:Picocli, JCommander, JOpt, kotlinx-cli, JLine, args4j

    • Node.jsCommander.js, clap.js, minimist, yargs[4]

    • Denoyargs

    • Pythonargparse, docopt, cli-args, clap

    • Golangargparse, flaggy

    • Rustclap-rs, pico-args, paw

    • Rubycmdparse, commander, GLI

    • C++gflags, cli, docopt.cpp

    整理的不全,欢迎大家补充 :)
    相关链接

    [1]https://github.com/aliyun/aliyun-cli

    [2]https://github.com/linux-china/cli-completion/blob/master/cli-schema.json

    [3]https://crates.io/crates/cli-completion

    [4]https://www.npmjs.com/search?q=args%20parser


    云开发体验Linux指令入门——文件与权限

    阿里云开发者成长计划来啦!基于真实的云环境和业务场景,帮助开发者深入学习体验云上技术。本场景将提供一台配置了Aliyun Linux 2的ECS实例(云服务器),介绍Linux系统中常用的文件目录管理和文件权限管理命令。

    展开全文
  • 大家使用最多的命令行工具应该是pip了,pip提供了很多的命令行参数和选项,我们在终端使用pip install --help命令可以查看install子命令的帮助文档。可以看到,除了最常用的pip install package命令,我们还可以附加...
    8f17d13f597bfc323e61769e719defec.png

    大家使用最多的命令行工具应该是pip了,pip提供了很多的命令行参数和选项,我们在终端使用pip install --help命令可以查看install子命令的帮助文档。

    99a0491f0e8d76338b7b346d888101a5.png可以看到,除了最常用的pip install package命令,我们还可以附加很多可选选项来控制pip install命令的行为。例如:-r选项可以指定从一个requirements.txt的文件安装Python依赖包,--no-deps标志可以让pip在安装包的时候禁用自动安装依赖包的行为。

    命令行接口的基础知识

    命令行接口通常以可执行文件的名称开头。我们只需在控制台中输入它的名称,然后访问脚本的主入口点,例如pip

    我们可以通过命令行,将参数传递给脚本,它们可以是:

    Arguments (参数):这是传递给脚本的必需参数。如果您不提供它,则CLI会遇到错误。例如,pandas是此命令中的参数:pip install pandasOptions (选项):顾名思义,它是一个可选参数,通常包含一个名称和一个值对,例如pip install pandas --cache-dir ./my-cache-dir。就是指定了./my-cache-dir作为应使用的缓存目录。Flags (标志):这是一个特殊的选项参数,它告诉脚本启用或禁用某些行为。最常见的可能是--help

    为什么需要命令行接口?

    想象一下,如果pip没有提供一个命令行接口,每次我们安装一个包的时候,还要去代码中手动修改我们要安装的包名不是?是不是非常的繁琐?

    因此,当代码需要频繁的修改某些参数的时候,使用命令行接口可以将参数和代码分离开来,从而让你的代码更加简洁,适用范围更广。

    Python中有很多可以让人轻松编写用户友好的命令行接口工具,如标准库中的argparse。然而在实际使用过程中发现,用argparse做命令行接口,需要创建解析器、定义参数、解析参数等3个步骤,无形中写了很多样本代码。

    import argparse# argparse需要手动定义和解析参数parser = argparse.ArgumentParser(description='Process some integers.')parser.add_argument('integers', metavar='N', type=int, nargs='+',                    help='an integer for the accumulator')parser.add_argument('--sum', dest='accumulate', action='store_const',                    const=sum, default=max,                    help='sum the integers (default: find the max)')args = parser.parse_args()print(args.accumulate(args.integers))

    相比之下,谷歌开源了fire命令行工具就简单的多了,很多情况下,只需要一行代码就搞定了。接下来,我们来看fire的基本用法!

    fire的基本用法

    fire是谷歌开源的一款命令行工具,支持从任意的Python对象自动生成命令行接口,与标准库中的argparse等工具相比,更加的简洁高效。

    假设我们有一个计算2个数值的函数,接收两个位置参数x和y,代码如下:

    sum.py

    import firedef sum(x,y):    """两个数值的加法求和计算    Args:        x (int): 第一个数值输入        y (int): 第二个数值输入    Returns:        int: 求和计算结果    """    return x+y

    现在,我们想利用fire将上面的函数生成一个命令行接口,只需在sum.py底部再加入下面2行代码:

    fire.py

    if __name__ == "__main__":    fire.Fire(sum)

    现在,我们在执行sum.py脚本就可以带上两个命令行参数x和y了。

    # root @ MyMac-Pro in ~/Desktop [14:07:23] $ python sum.py --x=1 --y=2

    上面提到过了fire使用的时候,不需要像argparse一样,需要定义参数、解析参数,十分的方便,fire还有提供了一个好用的功能是,fire会读取DocString字符串,自动生成命令行接口的文档,在命令行使用--help就可以查看。

    查看sum.py的帮助文档:

    # root @ MyMac-Pro in ~/Desktop [14:07:23] $ python sum.py --help

    输出的命令行接口的帮助文档:

    NAME    sum.py - 两个数值的加法求和计算SYNOPSIS    sum.py X YDESCRIPTION    两个数值的加法求和计算POSITIONAL ARGUMENTS    X        第一个数值输入    Y        第二个数值输入NOTES    You can also use flags syntax for POSITIONAL ARGUMENTS(END)

    问:fire只能用在函数上面吗?

    并非如此,fire可以用在模块、类、方法、函数等任意的对象,感兴趣的同学可以查看官方文档:https://github.com/google/python-fire/blob/master/docs/using-cli.md,了解fire更多的特性!

    推荐阅读

    •  竟有如此沙雕的代码注释?头给我笑掉了!•  又跌!6月全国程序员工资新统计,太扎心!•  面试了一个工作 4 年的程序员,还不如个应届生...•  好险!差点要写一个300行的 if-else!•  keras如何多输入多输出,以及中间层输出


    欢迎关注我的公众号“数据科学杂谈”,原创技术文章第一时间推送。

    1b3d2f32d02d8176333ea3cecf2654c9.png
    8adf530c62b8a7ee168725d0a1c41dfb.png点个在看,是我继续原创的动力!
    展开全文
  • 03_VS2017_带参数的main与控制台命令行输入目录int main(int argc, char ** argv)在命令行启动C语言.exe程序1. int main(int argc, char ** argv)创建C语言项目并生成#include/*| Input: argc, [int], 输入的字符串...

    03_VS2017_带参数的main与控制台命令行输入

    目录

    1. int main(int argc, char ** argv)

    2. 在命令行启动C语言.exe程序

    1. int main(int argc, char ** argv)

    创建C语言项目并生成

    #include/*
    | Input: argc, [int], 输入的字符串总数, 不用手动输入
    | argv, [char **], 二级指针, 等价于字符串数组
    */
    int main(int argc, char ** argv) {if (argc <= 1)
    {printf("args is needed...\r\n");return 1;
    }printf("arg count = %d, args:\r\n", argc);for (int i = 0; i < argc; i++)
    {printf("\t arg[%d] = %s\r\n", i, argv[i]);
    }return 0;
    }

    2. 在命令行启动C语言.exe程序

    1. 在任务栏搜索中输入cmd启动命令提示符

    2. 移动到指定的硬盘比如D盘d:

    3. 使用cd命令移动到指定文件夹,注意可以使用[Tab]键来补全文件名, 用cd ..返回上一级文件夹

    4. 运行C语言控制台程序并输入参数Test.exe abc def 996,注意第一个参数是Test.exe

    5. 运行结果

    5d21b9803e482c33314b14a63e1c8d86.png

    b2d7d377931e964553683c5d02cad065.png

    蛋兄本人

    精通以下专业单词的拼写

    1. 机械设计软件

    • FreeCAD 开源、免费

    • UG 工程组织便捷

    • Solidworks 很多大厂不让用

    • CATIA 专业

    • Fusion 360 依赖网络,不推荐

    2. PCB硬件开发

    • STM32CubeIDE 免费,ARM芯片引脚、功能定义、编程

    • KiCAD 开源免费,原理图、PCB板设计,蛋兄有教程(得瑟一下自己的飞控板子,

    3. C/S程序开发

    • WPF/C# MVVM框架开发, 依赖注入工具,计算器, 彩色Log, 10W级曲线画图 蛋兄有教程,卫星地

    • .NetCore 跨平台开发,UDP通信蛋兄有教程

    4. 辅助类软件

    • Inkscape 画图,开源、免费(我的头像)

    • Olive 视频剪辑,开源免费、免费,蛋兄有教程

    • Audacity 音频编辑、降噪,开源、免费,蛋兄有教程

    • FontForge 字体设计,开源、免费,LoongDigit蛋兄自己设计的字体暂未出教程

    展开全文
  • 目 录第一部分 Linux 命令行第1章 初识Linux shell 21.1 什么是Linux 21.1.1 深入探究Linux内核 31.1.2 GNU工具链 101.1.3 Linux桌面环境 111.2 Linux发行版 161.2.1 核心Linux发行版 161.2.2 专业Linux...
  • 打开了终端后,我们输入: ....$ cc 其中,$及其左侧的是命令行原本显示在本行的内容,右侧的cc是我们输入的内容。 输入后,按下回车,如果系统提示如下(如果你装的是中文,那么可能提示是说 没有输入文件 之类的...
  • 我和我的儿子在上周末干了一件非常有意思的事情,我们开发了一个用 Go 编写的命令行游戏,最近我正在重写一款曾经在年轻时开发的游戏,当时用的还是 Kaypro II。我钟爱这台电脑,回想起曾经使用 BASIC 在上面...
  • 一、前言在近半年的 Python 命令行旅程中,我们依次学习了 argparse、docopt、click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变。 本文作为本次旅程的终点,希望从一个更高的视角对这些库...
  • 针对评论区的一些回复: 有人说main函数里面的两个参数就是命令行传参,百度上不需要半个小时就能知道,被我大张旗鼓的宣扬,但是我还是想,只在IDE下,没有试过在命令行下编程,去理解命令行传参,应该还是很难...
  • 虽然过去了好多年,但我仍然清楚地记得自己第一次看到signal函数原型时的惊讶。学习UNIX环境C编程的朋友都知道,信号是绕不过去的一道坎,而...看到这个函数原型,您知道signal()函数怎么用吗?说明一下,这个函数...
  • 第一个入参为命令行参数个数,第二个入参为命令行参数数组。通常用于实现需要从命令行获取参数的功能。小编在讲文件操作的时候通过命令行参数简单实现过windows系统中的copy指令不清楚的可以去看看视频教程。 当然...
  • VISUAL BASIC能不能像C++一样读取命令行参数,如果可以,请问怎么读取?
  • 外部直接执行python文件时,我们有时需要获得命令行的参数6ok免费资源网获得命令行参数的两种方式6ok免费资源网1、通过sys.argv6ok免费资源网sys.argv:获得一个参数列表,第一个值为文件名本身,通过sys.argv[1]...
  • int main(int argc, const char **argv) { if (argc < 4) { const char *head = "*****Segment-Tree based Cost Aggregation...我知道可以修改stereo routine的参数运行,可以在属性调试中输入参数直接运行吗?
  • 命令行参数

    2018-08-17 13:27:38
    一直没有理解什么是命令行参数,今天才搞懂 我们运行python程序时,在cmd输入python test.py 运行,其实后面可以输入一系类参数来发告知程序怎么运行 比如这样的:python test.py arg1 arg2 arg3 其实我们接触过这个...
  • win32自绘按钮,使用GDI&plus;(一)第一次写随笔,我本来想将win32窗口的标题栏设置成渐变色,像这样的效果 但发现找不到设置标题栏属性的api,SetWindowLong也只是增减窗口的固定的样式而已.所以想到一个思路,把...
  • packagemy;importjava.io.File;importjava.io.DataInputStream;importjava.io.IOException;importjava.io.FileInputStream;importjava.io.DataOutputStream;importjava.io.FileOutput...... 路径要求用户输入;*/ 展开
  • 前言在命令行运行过程序的同学应该对命令的附加参数不陌生,比如我们在windows下的命令窗口中输入help rename,则它的显示如下:其输出说明了rename这个命令的用法,如果你仔细观察就会发现,它后面带的参数不止一个...
  • 今天突然想到类似adb、ffmpeg这样的程序是怎么实现的,通过命令行输入不同的参数就可以执行不同的命令。 研究了一下,其实实现的逻辑很简单,以C#控制台程序为例,Main函数是这样的 class Program { ...
  • code::blocks怎么设置命令行参数

    千次阅读 2014-10-22 21:52:00
    Project-&gt;Set Program's Arguments...然后在相应的输入框中输入命令行参数
  • c primer plus 中讲了下命令行参数这块,可还是不太懂怎么利用命令行参数怎么打开一个文件,比如,我桌面上有一个名叫untitled的文件,我可以在product中选择edit product,然后选择argument,输入"untitled",程序...
  • 本期我们来介绍带有命令行参数输入,和命令行输出信息的代码用法。代码时间声明命令行位置参数,在类文件内$signature变量内书写:protected $signature = 'password:reset {userId} {--sendEmail}'; 其中 userId ...
  • 程序执行的时候需要命令行参数,linux中更是这样,随便在shell输入/bin/XX --help后列举出来的参数让你头晕眼花,可是这些参数是怎么进入程序的呢,我们知道程序执行的时候一般从main开始,而mian有两个参数,一个是...
  • 2017-11-02 回答本文实例讲述了python读取命令行参数的方法。分享给大家供大家参考。具体分析如下:如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢?需要模块:sys参数个数:len...
  • 命令行直接输入,不需要在package.json里配置: npm run dev --aaa=/webpack/src aaa参数名可以随便改。我们最终目的是要要拿到 /webpack/src 这个值, 然后我们在webpack的打包配置文件里,直接用下边两行代码就...
  • Eclipse中怎么设置命令行参数

    千次阅读 2007-04-16 11:48:00
    2、在左侧选择要运行的程序,然后点击右侧“(x)=自变量”标签,在下面的“程序自变量(A):”文本框中输入程序运行需要的参数。3、点击下面的“运行(R)”按钮运行程序。英文版:1、打开“Run”菜单,点击“Run...”...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 267
精华内容 106
关键字:

命令行参数怎么输入