本文的目标很简单:帮助新的 Python 开发者了解一些关于命令行接口(CLI)的历史和术语,并探讨如何在 Python 中编写这些有用的程序。
最初……
首先,从 Unix 的角度谈谈命令行界面设计。
Unix 是一种计算机操作系统,也是 Linux 和 macOS(以及许多其他操作系统)的祖先。在图形用户界面之前,用户通过命令行提示符与计算机进行交互(想想如今的 Bash 环境)。在 Unix 下开发这些程序的主要语言是 C,它的功能非常强大。
因此,我们至少应该了解 C 程序的基础知识。
main
int main(int argc, char **argv)
{
...
}
mainmain
argcargvargcargvargl
再进一步
$ ./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 sys
if __name__ == '__main__':
for value in sys.argv:
print(value)
自给自足
argparse
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
CLI 的现代方法
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.optionargparseecho
Click
但是,等等,还有更多!
ClickClickClickTyper
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.argvargparseClickTyper
最后,在 Python 中有很多用于解析命令行参数的第三方软件包。我只介绍了我喜欢或使用过的那些。你喜欢和/或使用不同的包是完全可以的,也是我们所期望的。我的建议是先从这些包开始,然后看看你最终的结果。
去写一些很酷的东西吧。
via: https://opensource.com/article/20/6/c-python-cli
本文由 LCTT 原创编译,Linux中国 荣誉推出