python 命令行库,python安装扩展库常用的命令
Python有一个名为argparse的内置库,可以用来创建命令行界面。本文将详细讲解如何使用argparse创建命令行应用,有需要的可以参考。
00-1010解析参数简介创建帮助信息添加别名使用互斥参数创建搜索工具的简单摘要
目录
当创建一个应用程序时,通常希望能够告诉你的应用程序如何做一些事情。有两种流行的方法来完成这项任务。您可以让应用程序接受命令行参数或创建一个图形用户界面。有些应用程序两者都支持。
当您需要在服务器上运行代码时,命令行界面非常有用。大多数服务器没有图形界面,尤其是当它们是Linux服务器时。在这种情况下,即使您想运行GUI,也可能无法运行。
Python有一个名为argparse的内置库,可以用来创建命令行界面。在本文中,您将了解以下内容。
解析参数,创建有用的信息,添加别名,并创建一个具有互斥参数的简单搜索工具。argparse模块的内容比本文将要介绍的要多得多。如果想了解更多,可以查看文档。
现在是时候开始从命令行解析参数了。
介绍
在学习如何使用argparse之前,最好知道还有另一种方法可以将参数传递给Python脚本。您可以将任何参数传递给Python脚本,并通过使用sys模块来访问它们。
要了解其工作原理,请创建一个名为sys_args.py的文件,并在其中输入以下代码:
# sys_args.py
导入系统
定义主():
打印(“您通过了以下参数:”)
打印(sys.argv)
if __name__==__main__:
主()
这段代码被导入sys并打印出sys.argv中的任何内容。argv属性包含传递给脚本的所有内容的列表,第一个列表是脚本本身。
下面是运行这段代码和几个参数时会发生什么的例子。
$ python3 sys_args.py - s 45
您通过了以下论证:
[sys_args.py ,- s , 45]
使用sys.argv的问题是,您无法控制可以传递给应用程序的参数。
不能忽略参数,不能创建默认参数,也不能判断什么是有效参数。这就是为什么argparse是使用Python标准库的方式。argparse模块非常强大和有用。让我们考虑命令行应用程序遵循的一般过程。
传递:传入文件do:对程序中的文件做一些事情output: Output Results下面是它如何工作的一个通用示例。继续创建file_parser.py并添加以下代码。
#文件解析器. py
导入argparse
def文件解析器(输入文件,输出文件=):
打印(f 处理{输入文件} )
打印(“已完成处理”)
if输出文件:
打印(f 创建{输出文件} )
定义主():
parser=argparse。ArgumentParser(“文件分析器”)
parser.add_argument( - infile ,help=Input file )
parser.add_argument( - out ,help=输出文件)
args=parser.parse_args()
if args.infile:
file_parser(args.infile,
args.out)
if __name__ == __main__:
main()
file_parser()函数是进行解析的逻辑所在。在这个例子中,它只接收一个文件名,并将其打印出来。output_file参数的默认值是一个空字符串。
程序的重点在 main()中。在这里你创建了一个 argparse.ArgumentParser()的实例,并给你的解析器起了一个名字。然后你添加两个参数, --infile和 --out。为了使用这个解析器,你需要调用 parse_args(),它将返回传递给你的程序的任何有效参数。最后,你要检查用户是否使用了 --infile 标志。如果他们使用了,那么你就运行 file_parser()。
下面是你如何在你的终端中运行代码。
$ python file_parser.py --infile something.txtProcessing something.txt
Finished processing
在这里,你用 --infile标志和一个文件名来运行你的脚本。这将运行 main(),然后调用 file_parser()。
下一步是使用你在代码中声明的两个命令行参数尝试运行你的应用程序。
$ python file_parser.py --infile something.txt --out output.txtProcessing something.txt
Finished processing
Creating output.txt
这一次,你得到了一个额外的输出行,提到了输出文件名。这代表你的代码逻辑中的一个分支。当你指定一个输出文件时,你可以让你的代码通过使用一个新的代码块或一个函数来生成该文件。如果你不指定一个输出文件,那么那个代码块就不会运行。
当你使用argparse创建你的命令行工具时,你可以很容易地添加信息,当你的用户不确定如何正确地与你的程序互动时,可以帮助他们。
现在是时候找出如何从你的应用程序中获得帮助了
创建帮助信息
argparse库将使用你在创建每个参数时提供的信息,自动为你的应用程序创建一个有用的信息。这里是代码:
# file_parser.pyimport argparse
def file_parser(input_file, output_file=):
print(fProcessing {input_file})
print(Finished processing)
if output_file:
print(fCreating {output_file})
def main():
parser = argparse.ArgumentParser(File parser)
parser.add_argument(--infile, help=Input file)
parser.add_argument(--out, help=Output file)
args = parser.parse_args()
if args.infile:
file_parser(args.infile, args.out)
if __name__ == __main__:
main()
现在试着用 -h标志运行这段代码,你应该看到以下内容。
$ file_parser.py -husage: File parser [-h] [--infile INFILE] [--out OUT]
optional arguments:
-h, --help show this help message and exit
--infile INFILE Input file
--out OUT Output file
add_argument()的帮助参数被用来创建上面的帮助信息。argparse会自动添加 -h和 -help选项。你可以通过给它一个描述和后记来使你的帮助信息更丰富。
让我们用它们来改进你的帮助信息。首先,把上面的代码复制到一个新的文件中,命名为 file_parser_with_description.py,然后把它修改成下面的样子。
# file_parser_with_description.pyimport argparse
def file_parser(input_file, output_file=):
print(fProcessing {input_file})
print(Finished processing)
if output_file:
print(fCreating {output_file})
def main():
parser = argparse.ArgumentParser(
File parser,
description=PyParse - The File Processor,
epilog=Thank you for choosing PyParse!,
)
parser.add_argument(--infile, help=Input file for conversion)
parser.add_argument(--out, help=Converted output file)
args = parser.parse_args()
if args.infile:
file_parser(args.infile, args.out)
if __name__ == __main__:
main()
在这里,把description和epilog参数传递给ArgumentParser。还更新了 add_argument()的帮助参数,使其更具描述性。
在做了这些修改之后,当你用 -h或 --help运行这个脚本时,你会看到以下输出。
$ python file_parser_with_description.py -husage: File parser [-h] [--infile INFILE] [--out OUT]
PyParse - The File Processor
optional arguments:
-h, --help show this help message and exit
--infile INFILE Input file for conversion
--out OUT Converted output file
Thank you for choosing PyParse!
现在可以在你的帮助输出中看到新的description 和epilog。这给了你的命令行程序一些额外的修饰。
你也可以通过ArgumentParser的 add_help参数在你的应用程序中完全禁用帮助。如果你认为你的帮助文本过于冗长,你可以像这样禁用它。
# file_parser_no_help.pyimport argparse
def file_parser(input_file, output_file=):
print(fProcessing {input_file})
print(Finished processing)
if output_file:
print(fCreating {output_file})
def main():
parser = argparse.ArgumentParser(
File parser,
description=PyParse - The File Processor,
epilog=Thank you for choosing PyParse!,
add_help=False,
)
parser.add_argument(--infile, help=Input file for conversion)
parser.add_argument(--out, help=Converted output file)
args = parser.parse_args()
if args.infile:
file_parser(args.infile, args.out)
if __name__ == __main__:
main()
通过将 add_help设置为 False,你将禁用 -h和 --help标志。
你可以看到下面的演示。
$ python file_parser_no_help.py --helpusage: File parser [--infile INFILE] [--out OUT]
File parser: error: unrecognized arguments: --help
在下一节中,你将学习如何为你的参数添加别名!
添加别名
别名是一个花哨的词,指的是使用一个替代的标志来做同样的事情。例如,你知道你可以使用 -h和 --help来访问程序的帮助信息。-h是 --help的别名,反之亦然。
看看 main()里面的 parser.add_argument()方法有什么变化。
# file_parser_aliases.pyimport argparse
def file_parser(input_file, output_file=):
print(fProcessing {input_file})
print(Finished processing)
if output_file:
print(fCreating {output_file})
def main():
parser = argparse.ArgumentParser(
File parser,
description=PyParse - The File Processor,
epilog=Thank you for choosing PyParse!,
add_help=False,
)
parser.add_argument(-i, --infile, help=Input file for conversion)
parser.add_argument(-o, --out, help=Converted output file)
args = parser.parse_args()
if args.infile:
file_parser(args.infile, args.out)
if __name__ == __main__:
main()
这里你改变了第一个 add_argument(),除了接受 -infile之外,还接受了 -i,你还在第二个 add_argument()中加入了 -o。这样就可以使用两个新的快捷标志来运行你的代码。
下面是一个例子。
$ python3 file_parser_aliases.py -i something.txt -o output.txtProcessing something.txt
Finished processing
Creating output.txt
如果你去看argparse文档,你会发现也可以给子解析器添加别名。子解析器是一种在你的应用程序中创建子命令的方法,这样它就可以做其他事情。一个很好的例子是Docker,一个虚拟化或容器应用程序。它有一系列的命令,你可以在docker下运行,以及docker compose等等。这些命令中的每一个都有独立的子命令,你都可以使用。
下面是一个典型的docker命令,用于运行一个容器。
docker exec -it container_name bash
这将用docker启动一个容器。而如果你要使用docker compose,你将使用一组不同的命令。exec和compose是subparsers的例子。
使用相互排斥的参数
有时你需要让你的应用程序接受一些参数,但不接受其他参数。例如,你可能想限制你的应用程序,使它只能创建或删除文件,而不是同时创建和删除。
argparse模块提供了 add_mutually_exclusive_group()方法,它就是这样做的。
将你的两个参数添加到一个组对象中,使其相互排斥,如下面的例子。
# file_parser_exclusive.pyimport argparse
def file_parser(input_file, output_file=):
print(fProcessing {input_file})
print(Finished processing)
if output_file:
print(fCreating {output_file})
def main():
parser = argparse.ArgumentParser(
File parser,
description=PyParse - The File Processor,
epilog=Thank you for choosing PyParse!,
add_help=False,
)
group = parser.add_mutually_exclusive_group()
group.add_argument(-i, --infile, help=Input file for conversion)
group.add_argument(-o, --out, help=Converted output file)
args = parser.parse_args()
if args.infile:
file_parser(args.infile, args.out)
if __name__ == __main__:
main()
首先,你创建了一个相互排斥的组。然后,你把 -i和 -o参数添加到组中,而不是添加到解析器对象中。现在这两个参数是互斥的。
下面是当你试图用这两个参数运行你的代码时发生的情况。
$ python3 file_parser_exclusive.py -i something.txt -o output.txtusage: File parser [-i INFILE -o OUT]
File parser: error: argument -o/--out: not allowed with argument -i/--infile
用这两个参数运行你的代码,会使你的解析器向用户显示一条错误信息,解释他们做错了什么。
在涵盖了所有这些与使用argparse有关的信息之后,你已经准备好应用你的新技能来创建一个简单的搜索工具了
创建一个简单的搜索工具
在开始创建一个应用程序之前,弄清楚你要完成的任务总是好的。你在本节中想要建立的应用程序应该能够搜索特定文件类型的文件。为了使它更有趣,你可以添加一个额外的参数,让你也能选择性地搜索特定的文件大小。
你可以使用 Python 的 glob 模块来搜索文件类型。你可以在这里阅读关于这个模块的所有信息。
还有一个 fnmatch 模块,glob 自己也使用它。你现在应该使用 glob,因为它更容易使用,但是如果你有兴趣写一些更专业的东西,那么 fnmatch 可能是你正在寻找的。
然而,由于你希望能够通过文件大小来选择性地过滤返回的文件,你可以使用 pathlib,它包括一个类似 glob 的接口。glob 模块本身并不提供文件大小的信息。
你可以先创建一个名为 pysearch.py 的文件并输入以下代码。
# pysearch.pyimport argparse
import pathlib
def search_folder(path, extension, file_size=None):
"""
Search folder for files
"""
folder = pathlib.Path(path)
files = list(folder.rglob(f*.{extension}))
if not files:
print(fNo files found with {extension=})
return
if file_size is not None:
files = [
f
for f in files
if f.stat().st_size >= file_size
]
print(f{len(files)} *.{extension} files found:)
for file_path in files:
print(file_path)
在上面的代码片段中,首先导入了argparse和pathlib。接下来,创建了search_folder()函数,它接收了三个参数。
- path - 要搜索的文件夹
- extension - 要寻找的文件扩展名
- file_size - 要过滤的文件大小,以字节为单位。
把路径变成pathlib.Path对象,然后使用其rglob()方法在文件夹中搜索用户传入的扩展名。如果没有找到文件,就向用户打印一个有意义的信息,然后退出。
如果找到了任何文件,就检查是否已经设置了filesize。如果它被设置了,就用一个list comprehension来过滤出小于指定的filesize的文件。
接下来,打印出找到的文件的数量,最后在这些文件上循环,打印出它们的名字。
为了使这一切正常工作,需要创建一个命令行界面。你可以通过添加一个包含argparse代码的main()函数来做到这一点,像这样。
def main():parser = argparse.ArgumentParser(
PySearch,
description=PySearch - The Python Powered File Searcher,
)
parser.add_argument(-p, --path,
help=The path to search for files,
required=True,
dest=path)
parser.add_argument(-e, --ext,
help=The extension to search for,
required=True,
dest=extension)
parser.add_argument(-s, --size,
help=The file size to filter on in bytes,
type=int,
dest=size,
default=None)
args = parser.parse_args()
search_folder(args.path, args.extension, args.size)
if __name__ == __main__:
main()
这个ArgumentParser()有三个参数,与你传递给search_folder()的参数相对应。让--path和--ext参数成为必需的,而让--size参数成为可选的。注意,--size参数被设置为type=int,这意味着你不能把它传成字符串。
add_argument()函数有一个新的参数。它是dest参数,可以用它来告诉你的参数分析器在哪里保存传递给它们的参数。
下面是一个脚本运行的例子。
$ python3 pysearch.py -p /Users/michael/Dropbox/python101code/chapter32_argparse -e py -s 6506 *.py files found:
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_aliases2.py
/Users/michael/Dropbox/python101code/chapter32_argparse/pysearch.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_aliases.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_with_description.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_exclusive.py
/Users/michael/Dropbox/python101code/chapter32_argparse/file_parser_no_help.py
现在试试用-s和一个字符串来运行它。
$ python3 pysearch.py -p /Users/michael/Dropbox/python101code/chapter32_argparse -e py -s pythonusage: PySearch [-h] -p PATH -e EXTENSION [-s SIZE]
PySearch: error: argument -s/--size: invalid int value: python
这次我们收到了一个错误,因为-s和-size只接受整数。在你自己的机器上运行一下这段代码,看看当你使用-s和整数时,它是否按你想要的方式工作。
这里有一些想法,你可以用来改进你的代码版本。
更好地处理扩展文件。现在,它将接受 *.py,这不会像你期望的那样工作。
更新代码,以便你可以一次搜索多个扩展名
更新代码,以便对文件大小的范围进行过滤(例如,1MB-5MB)。
还有很多其他的功能和改进,你可以添加到这个代码中,比如添加错误处理或单元测试。
总结
argparse模块功能齐全,可以用来创建庞大、灵活的命令行应用程序。在本章中,你了解了以下内容。
- 解析参数
- 创建有用的信息
- 添加别名
- 使用相互排斥的参数
- 创建一个简单的搜索工具
你可以用argparse模块做更多的事情,不完全包括本章所讲的。请务必查看文档以了解全部细节。
到此这篇关于利用Python内置库实现创建命令行应用程序的文章就介绍到这了,更多相关Python命令行应用程序内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。