本文的目标很简单:帮助新的 Python 开发者了解一些关于命令行接口(CLI)的历史和术语,并探讨如何在 Python 中编写这些有用的程序。
最初……
首先,从 Unix 的角度谈谈命令行界面设计。
Unix 是一种计算机操作系统,也是 Linux 和 macOS(以及许多其他操作系统)的祖先。在图形用户界面之前,用户通过命令行提示符与计算机进行交互(想想如今的 Bash 环境)。在 Unix 下开发这些程序的主要语言是 C,它的功能非常强大。
因此,我们至少应该了解 C 程序的基础知识。
main
int main(int argc, char **argv){...}
mainmainargcargvargcargvargl再进一步
$ ./myprog foo bar -x baz
myprogargcargvargv[0]argv
argv[0] == "./myprog"argv[1] == "foo"argv[2] == "bar"argv[3] == "-x"argv[4] == "baz"/* 注:不是有效的 C 代码 */
argvargv
include <stdio.h>/* 一个打印 argv 内容的简单 C 程序。*/int main(int argc, char **argv) {int i;for(i=0; i<argc; i++)printf("%s\n", argv[i]);}
早期对命令行标准化的尝试
-x/bin/ls -alShgetoptgetopt
include <stdio.h>#include <getopt.h>#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("%s\n", foo ? foo : "Empty foo");printf("%s\n", bar ? bar : "Empty bar");}
就个人而言,我希望 Python 有开关,但这永远、永远不会发生。
GNU 时代
--file-format foo-f foo但我们正在讨论 Python?
你现在已经接触了足够多(太多?)的命令行的历史,对如何用我们最喜欢的语言来编写 CLI 有了一些背景知识。Python 在命令行解析方面给出了类似的几个选择:自己解析,自给自足的方式,以及大量的第三方方式。你选择哪一种取决于你的特定情况和需求。
首先,自己解析
你可以从 sys 模块中获取程序的参数。
import sysif __name__ == '__main__':for value in sys.argv:print(value)
自给自足
argparse
from argparse import ArgumentParserif __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)
--helpCLI 的现代方法
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 ProgramIt does stuff. Here is the documentation for it."""print(foo, bar)if __name__ == "__main__":echo()
@click.optionargparseechoClick但是,等等,还有更多!
ClickClickClickTyper
import typercli = typer.Typer()@cli.command()def echo(foo: str = "foo", bar: str = "bar"):"""My Cool ProgramIt does stuff. Here is the documentation for it."""print(foo, bar)if __name__ == "__main__":cli()
是时候开始写一些代码了
sys.argvargparseClickTyper最后,在 Python 中有很多用于解析命令行参数的第三方软件包。我只介绍了我喜欢或使用过的那些。你喜欢和/或使用不同的包是完全可以的,也是我们所期望的。我的建议是先从这些包开始,然后看看你最终的结果。
去写一些很酷的东西吧。
via: https://opensource.com/article/20/6/c-python-cli
本文由 LCTT 原创编译,Linux中国 荣誉推出