python很多时候都是作为一个脚本存在的。有时候写bat或者shell文件的时通过传入参数设置一些变量比起改脚本以外还是方便很多的。Python自身提供了sys.argv的方法,如下面的代码,但是对于复杂的环境变量配置和指定参数,还是很难满足要求。python的优点就在于库多,找了一下,用的比较多的为argparse和flaggy库,那就简单地介绍一下好了。
import sys
if __name__ == "__main__":
print("hello " + sys.argv[1])
argparse 是 Python 标准库中提供的一个命令行参数解析器,可以用于解析命令行参数和选项。它提供了一个 ArgumentParser 类,通过该类可以定义命令行参数的格式和处理方式。
使用 argparse 可以使 Python 脚本更加用户友好,因为用户可以通过命令行来传递参数,而不需要在代码中硬编码这些参数。例如,可以使用 argparse 来解析命令行参数,以指定输入文件的路径、输出文件的路径、程序的选项等。
argparse 支持多种参数格式,包括位置参数、命名参数、默认参数、必选参数、可选参数等。同时,它还提供了一些辅助函数,例如 argparse.parse_args() 和 argparse.parse_known_args() 等,用于解析命令行参数并返回一个 namespace 对象,该对象包含了所有解析出来的参数及其值。
argparse 的使用非常简单,只需要导入 argparse 模块,然后创建一个 ArgumentParser 对象,并使用 add_argument() 方法来添加参数。最后,使用 parse_args() 方法来解析命令行参数并返回一个 namespace 对象。
下载的话还是一样的,如果已经配置好了pip或者conda就可以直接安装了,如果没有配置好,建议配置一下,这边依旧是使用pip:
pip install argparse
使用的话,还是现在python代码里面引入argparse库,然后添加参数,这里给个小demo:
import argparse
parser = argparse.ArgumentParser(description='这是一段描述')
parser.add_argument('--input', type=str, nargs='?', default='input.txt', help='输入文件路径')
parser.add_argument('--output', type=str, nargs='?', default='output.txt', help='输出文件路径')
args = parser.parse_args()
print(args.input) # 输出:input.txt
print(args.output) # 输出:output.txt
在上面的代码中,我们定义了一个 ArgumentParser 对象,并使用 add_argument() 方法添加了一个必选参数 --input 和一个可选参数 --output。最后,我们使用 parse_args() 方法解析命令行参数,并打印出解析出来的参数值。
我们把这个文件叫做test.py,如果说没有输入任何参数,就是直接
python test.py
那么最终的结果,就是直接用default的值,但是如果在输入的时候添加对应的参数的话,就能够解析出来。
python test.py --input="a.txt" --output="b.txt"
这时候就会输出a.txt和b.txt。
这边的用法实际上不止这些,一般的程序都需要添加的像是:
-h, --help, show the help message
-v, --verbose show the berbosity
以及一些具体的设置参数,在库的介绍文档中已经介绍得很详细了,可以再参考下。
Argparse 教程 — Python 3.10.2 文档 (yali.edu.cn)
Flaggy 是一个 Python 命令行参数解析库,它提供了一个方便的接口用于解析命令行参数。与常见的参数解析库(如 argparse)不同,Flaggy 采用了一种独特的方式来定义和解析命令行参数。它支持多种不同的参数类型,包括位置参数、命名参数、选项参数和必填参数等。
可以通过pip下载flaggy库
pip install flaggy
然后在python程序中import就能够使用了,这边我们创建一个源文件叫test.py,然后写入下面的内容。首先我们定义一个类,继承自 flaggy.Flaggy 类,并在类中重写 parse_args 方法。在这个方法中,你可以定义参数的类型、名称、默认值等信息。
class MyParser(flaggy.Flaggy):
def parse_args(self, args):
# 定义位置参数
self.args.pos_arg1 = flaggy.PosArg(self, "pos_arg1", 1, None)
self.args.pos_arg2 = flaggy.PosArg(self, "pos_arg2", 2, None)
# 定义命名参数
self.args.named_arg1 = flaggy.NamedArg(self, "named_arg1", None, str)
self.args.named_arg2 = flaggy.NamedArg(self, "named_arg2", None, int)
# 定义选项参数
self.args.opt_arg1 = flaggy.OptArg(self, "opt_arg1", None, str)
self.args.opt_arg2 = flaggy.OptArg(self, "opt_arg2", None, int)
# 解析命令行参数
self.parse(args)
# 返回解析结果
return self.args
if __name__ == "__main__":
parser = MyParser()
args = parser.parse_args(["-h"])
print(args)
我们只需要创建一个对象,然后调用里面的parse_args方法就能够进行参数解析了。
Flaggy 的优点在于它提供了一种更简洁、更直观的方式来定义和解析命令行参数。同时,它也支持自定义参数类型和行动,可以满足一些特殊的需求。然而,相比其他流行的参数解析库(如 argparse),Flaggy 的功能和稳定性可能略有不足,因此在选择参数解析库时需要根据具体需求进行权衡。
Flaggy的缺点在于:
1. 功能相对有限:相比其他流行的参数解析库(如 argparse),Flaggy 的功能较为简单,可能无法满足一些复杂的参数解析需求。
2. 稳定性不足:由于 Flaggy 库相对较新,其在稳定性方面可能不如其他成熟库。在一些特定情况下,可能会出现解析错误或未知的行为。
3. 文档不足:Flaggy 库的官方文档相对较少,对于初学者来说可能不太友好。在使用过程中,需要自行探索和尝试。
4. 兼容性问题:Flaggy 库在 Python 3.x 和 Python 2.x 之间的兼容性可能存在问题。如果你需要在不同版本的 Python 中使用该库,需要注意潜在的兼容性风险。
5. 自定义参数类型限制:虽然 Flaggy 库支持自定义参数类型和行动,但在实际使用中,你可能会发现其自定义范围有限。这可能会限制在某些特定场景下的使用。
argparse 和 flaggy 虽然都是 Python 中常用的命令行参数解析库,但是它们在功能和性能上存在一些差异。
功能:
argparse 是 Python 标准库中用于解析命令行参数的库,提供了丰富的功能和选项,可以满足大多数命令行参数解析的需求。flaggy 则是一个第三方库,提供了一种独特的方式来定义和解析命令行参数,虽然功能相对有限,但在某些特定场景下可能更方便。
易用性:
argparse 在使用过程中需要手动编写参数类型、名称、默认值等信息,然后通过 argparse.ArgumentParser 类的 add_argument 方法添加参数。flaggy 采用了一种更加简洁、直观的方式,通过定义一个类继承自 flaggy.Flaggy,重写 parse_args 方法来定义和解析参数,使用上更加方便。
性能:
argparse 在解析命令行参数时性能较高,可以快速处理大量参数。而 flaggy 则在特定场景下可能具有更好的性能表现,例如在解析大量位置参数时,flaggy 可以比 argparse 更高效。
兼容性:
argparse 是 Python 标准库的一部分,因此具有很好的兼容性,可以在不同版本的 Python 中使用。而 flaggy 库在 Python 3.x 和 Python 2.x 之间的兼容性可能存在问题。
自定义参数类型:
argparse 和 flaggy 都支持自定义参数类型和行动。然而,argparse 在自定义参数类型方面更加灵活,可以定义各种类型的参数,包括位置参数、命名参数、选项参数和必填参数等。而 flaggy 在自定义参数类型方面相对有限。
综上所述,argparse 和 flaggy 都是优秀的命令行参数解析库,它们在功能、性能和易用性等方面存在差异。在选择参数解析库时,需要根据具体需求进行权衡。如果需要解析大量参数或需要自定义各种类型的参数,可以选择 argparse;而在某些特定场景下,使用 flaggy 可能更加方便。