热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python教程分享python命令行参数有什么用(详解python命令行参数作用)

借鉴c语言的历史,学习如何用python编写有用的cli程序。python教程分享python命令行参数有什么用(详解python命令行参数作用)的目标很简单:帮助新的python

python命令行参数有什么用(详解python命令行参数作用)

借鉴 c 语言的历史,学习如何用 python 编写有用的 cli 程序。

python教程分享python命令行参数有什么用详解python命令行参数作用)的目标很简单:帮助新的 python 开发者了解一些关于 命令行接口 (cli)的历史和术语,并探讨如何在 python 中编写这些有用的程序。

最初……

首先,从 unix 的角度谈谈命令行界面设计。

unix 是一种计算机操作系统,也是 linux 和 macos(以及许多其他操作系统)的祖先。在图形用户界面之前,用户通过命令行提示符与计算机进行交互(想想如今的 bash 环境)。在 unix 下开发这些程序的主要语言是 c ,它的 功能 非常强大。

因此,我们至少应该了解 c 程序 的基础知识。

假设你没有读过上面那个链接的内容,c 程序的基本架构是一个叫做 main 的函数,它的签名是这样的。

   int main(int argc, char **argv)    {    ...    }

对于 python 程序员来说,这应该不会显得太奇怪。c 函数首先有一个返回类型、一个函数名,然后是括号内的类型化参数。最后,函数的主体位于大括号之间。函数名 main 是 运行时链接器 (构造和运行程序的程序)如何决定从哪里开始执行你的程序。如果你写了一个 c 程序,而它没有包含一个名为 main 的函数,它将什么也做不了。伤心。

函数参数变量 argc 和 argv 共同描述了程序被调用时用户在命令行输入的字符串列表。在典型的 unix 命名传统中,argc 的意思是“ 参数计数(argument count)”,argv 的意思是“ 参数向量(argument vector)”。向量听起来比列表更酷,而 argl 听起来就像一个要勒死的求救声。我们是 unix 系统的程序员,我们不求救。我们让其他人哭着求救。

再进一步

$ ./myprog foo bar -x baz

如果 myprog 是用 c 语言实现的,则 argc 的值是 5,而 argv 是一个有五个条目的字符指针数组。(不要担心,如果这听起来过于技术,那换句话说,这是一个由五个字符串组成的列表。)向量中的第一个条目 argv[0] 是程序的名称。argv 的其余部分包含参数。

   argv[0] == "./myprog"    argv[1] == "foo"    argv[2] == "bar"    argv[3] == "-x"    argv[4] == "baz"        /* 注:不是有效的 c 代码 */

在 c 语言中,你有很多方法来处理 argv 中的字符串。你可以手动地循环处理数组 argv,并根据程序的需要解释每个字符串。这相对来说比较简单,但会导致程序的接口大相径庭,因为不同的程序员对什么是“好”有不同的想法。

include   /* 一个打印 argv 内容的简单 c 程序。 */  int main(int argc, char **argv) {     int i;         for(i=0; i

早期对命令行标准化的尝试

命令行武器库中的下一个武器是一个叫做 getopt 的 c 标准库 函数。这个函数允许程序员解析开关,即前面带破折号的参数(比如 -x),并且可以选择将后续参数与它们的开关配对。想想 /bin/ls -alsh 这样的命令调用,getopt 就是最初用来解析该参数串的函数。使用 getopt 使命令行的解析变得相当简单,并改善了用户体验(ux)。

include  #include   #define optstr "b:f:"  extern char *optarg;  int main(int argc, char **argv) {     int opt;     char *bar = null;     char *foo = null;         while((opt=getopt(argc, argv, optstr)) != eof)        switch(opt) {           case 'b':               bar = optarg;               break;           case 'f':               foo = optarg;               break;           case 'h':           default':               fprintf(stderr, "huh? try again.");               exit(-1);               /* notreached */        }     printf("%sn", foo ? foo : "empty foo");     printf("%sn", bar ? bar : "empty bar"); }

就个人而言,我希望 python 有开关,但这 永远 、永远不会 发生 。

gnu 时代

gnu 项目出现了,并为他们实现的传统 unix 命令行工具引入了更长的格式参数,比如–file-format foo。当然,我们这些 unix 程序员很讨厌这样,因为打字太麻烦了,但是就像我们这些旧时代的恐龙一样,我们输了,因为用户喜欢更长的选项。我从来没有写过任何使用 gnu 风格选项解析的代码,所以这里没有代码示例。

gnu 风格的参数也接受像 -f foo 这样的短名,也必须支持。所有这些选择都给程序员带来了更多的工作量,因为他们只想知道用户要求的是什么,然后继续进行下去。但用户得到了更一致的用户体验:长格式选项、短格式选项和自动生成的帮助,使用户不必再试图阅读臭名昭著的难以解析的 手册 页面(参见 ps 这个特别糟糕的例子)。

但我们正在讨论 python?

你现在已经接触了足够多(太多?)的命令行的历史,对如何用我们最喜欢的语言来编写 cli 有了一些背景知识。python 在命令行解析方面给出了类似的几个选择:自己解析, 自给自足(batteries-included)的方式,以及大量的第三方方式。你选择哪一种取决于你的特定情况和需求。

首先,自己解析

你可以从 sys 模块中获取程序的参数。

import sys  if __name__ == '__main__':    for value in sys.argv:        print(value)

自给自足

在 python 标准库中已经有几个参数解析模块的实现: getopt 、 optparse ,以及最近的 argparse 。argparse 允许程序员为用户提供一致的、有帮助的用户体验,但就像它的 gnu 前辈一样,它需要程序员做大量的工作和“ 模板代码 ”才能使它“奏效”。

from argparse import argumentparser  if __name__ == "__main__":     argparser = argumentparser(description='my cool program')    argparser.add_argument("--foo", "-f", help="a user supplied foo")    argparser.add_argument("--bar", "-b", help="a user supplied bar")        results = argparser.parse_args()    print(results.foo, results.bar)

好处是当用户调用 –help 时,有自动生成的帮助。但是 自给自足 (batteries included)的优势呢?有时,你的项目情况决定了你对第三方库的访问是有限的,或者说是没有,你不得不用 python 标准库来“凑合”。

cli 的现代方法

然后是 click 。click 框架使用 装饰器 的方式来构建命令行解析。突然间,写一个丰富的命令行界面变得有趣而简单。在装饰器的酷炫和未来感的使用下,很多复杂的东西都消失了,用户惊叹于自动支持关键字补完以及上下文帮助。所有这些都比以前的解决方案写的代码更少。任何时候,只要你能写更少的代码,还能把事情做好,就是一种胜利。而我们都想要胜利。

import click  @click.command() @click.option("-f", "--foo", default="foo", help="user supplied foo.") @click.option("-b", "--bar", default="bar", help="user supplied bar.") def echo(foo, bar):     """my cool program         it does stuff. here is the documentation for it.     """     print(foo, bar)     if __name__ == "__main__":     echo()

你可以在 @click.option 装饰器中看到一些与 argparse 相同的模板代码。但是创建和管理参数分析器的“工作”已经被抽象化了。现在,命令行参数被解析,而值被赋给函数参数,从而函数 echo 被魔法般地调用。

在 click 接口中添加参数就像在堆栈中添加另一个装饰符并将新的参数添加到函数定义中一样简单。

但是,等等,还有更多!

typer 建立在 click 之上,是一个更新的 cli 框架,它结合了 click 的功能和现代 python 类型提示 。使用 click 的缺点之一是必须在函数中添加一堆装饰符。cli 参数必须在两个地方指定:装饰符和函数参数列表。typer 免去你造轮子 去写 cli 规范,让代码更容易阅读和维护。

import typer  cli = typer.typer()  @cli.command() def echo(foo: str = "foo", bar: str = "bar"):     """my cool program         it does stuff. here is the documentation for it.     """     print(foo, bar)     if __name__ == "__main__":     cli()
是时候开始写一些代码了

哪种方法是正确的?这取决于你的用例。你是在写一个只有你才会使用的快速而粗略的脚本吗?直接使用 sys.argv 然后继续编码。你需要更强大的命令行解析吗?也许 argparse 就够了。你是否有很多子命令和复杂的选项,你的团队是否会每天使用它?现在你一定要考虑一下 click 或 typer。作为一个程序员的乐趣之一就是魔改出替代实现,看看哪一个最适合你。

最后,在 python 中有很多用于解析命令行参数的第三方软件包。我只介绍了我喜欢或使用过的那些。你喜欢和/或使用不同的包是完全可以的,也是我们所期望的。我的建议是先从这些包开始,然后看看你最终的结果。

去写一些很酷的东西吧。

需要了解更多python教程分享python命令行参数有什么用(详解python命令行参数作用),都可以关注python教程分享栏目—编程笔记


推荐阅读
  • 在ROS系统中,参数读写一般通过xml或者yaml格式的文件,其中yaml用得比较多。这是一种可读性高,轻量级的标记语言,简单好用。对于yaml文件,ros中用的较早版本的yaml- ... [详细]
  • 互联网世界 9 种基本的商业模式
    互联网世界9种基本的商业模式一个商业模式是运行一个公司的方法;通过该模式的运作,一个公司能维持自己的生存,就是说,能有收益。商业模式意味着一个公司是如何通过在价值链中定位自己,从而获 ... [详细]
  • 第38天:Python decimal 模块
    by程序员野客在我们开发工作中浮点类型的使用还是比较普遍的,对于一些涉及资金金额的计算更是不能有丝毫误差,Python的decimal模块为浮点型精确计算提供了支持。1简介deci ... [详细]
  • 这篇文章将为大家详细讲解有关如何使用C语言strcmp函数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一 ... [详细]
  • 这篇文章主要讲解了“GradeBook类怎么定义”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Grad ... [详细]
  • *Copyright(c)2016,烟台大学计算机与控制工程学院Allrightsreserved.文件名称:字符串加密.cpp作者:彭友程完成日期&# ... [详细]
  • 原题我们定义“区间的价值”为一段区间的最大值*最小值。一个区间左端点在L,右端点在R,那么该区间的长度为(R−L+1)。求长度分别为1~n的区间的最大价值。保证数据随机因为保证数据随 ... [详细]
  • 实验七、绕过ASLR 第二部分
    7.1实验环境VM配置:Ubuntu12.04(x86)7.2实验原理什么是爆破?使用爆破技巧,来绕过共享库地址随机化。7.3实验过程7. ... [详细]
  • 883.三维形体投影面积
    题目883.三维形体投影面积题目大意在nxn的网格grid中,我们放置了一些与x,y,z三轴对齐的1x1x1立方体。每个值vgri ... [详细]
  • 1、概念共享内存:共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同malloc()函数向不同进程返回了指向同一个 ... [详细]
  • Python3怎么获取文件属性
    这篇文章给大家分享的是有关Python3怎么获取文件属性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。os.stat(path ... [详细]
  • mysql oneproxy稳定吗_Mysql 中间件 oneProxy总结
    建议使用之前把官方的文档全部通读一遍这里提供一个我的网盘地址oneproxy百度网盘0.先对oneproxy有个大概的了解,知道他所处的位置1.MySQL服务器创建t ... [详细]
  • 使用临时文件tmpnam该函数的功能是产生一个唯一的文件名系统回味该文件分配一块内存来保存临时变量例如下面的代码#includeintmain(){charnam ... [详细]
  • 浅谈Python3中打开文件的方式(With open)
    浅谈Python3中打开文件的方式(With open)-目录0.背景知识1.常规方式:读取文件-----open()2.推荐方式:读取文件-----WithOpen1).读取方式 ... [详细]
  • Python Flask学习之安装SQL,python3,Pycharm(网上下载安装即可)
    1,下载时更改pypi源。可以额外安装虚拟化环境:pipinstall-ihttp:pypi.douban.comsimple--trusted-hos ... [详细]
author-avatar
萌星
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有