Python命令行参数

前言

如何让自己的代码在修改最少的情况下跑更多实验,这对于一个码农来说至关重要,尤其是需要多组实验对比的情况。一个很简单的办法是把参数独立出来在命令行输入,唯一的缺点是每次都要输入长达好几行的命令,尤其是牵扯到绝对路径的时候,这种情况下有更简单的解决方法,就是用配置文件。

Python命令行参数简单用法

python内置了比较方便的命令行处理方法:argparse类

贴一个简单的snnipet,一看就会

1
2
3
4
5
6
7
8
9
10
11
import argparse

# 读取
parser = argparse.ArgumentParser(description='What R U doing')
parser.add_argument('--ainterger', default=0, type=int)
parser.add_argument('--astring', default='23456', type=str)
parser.add_argument('--config', default='', type=str)
args = parser.parse_args()

# 调用
print(args.ainterger) #输出0或你给的参数

配合yaml文件

进阶一点的做法是在使用argparse的时候配合yaml文件进行配置,yaml文件是一种通用的配置描述文件,使用缩进表示层级,在 python中读入形式为字典形式,操作方便且被广泛支持。

给一个简单的yaml文件示例

1
2
3
4
5
6
7
config1:
attribute1: 1
attribute2: '/path/to/some/dir'
config2:
attribute1: 3
attribute2:
attribute1: 'aha!'

读取使用流程就是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import argparse
import yaml

# 读取
parser = argparse.ArgumentParser(description='What R U doing')
parser.add_argument('--paraint', default=0, type=int)
parser.add_argument('--parastr', default='23456', type=str)
parser.add_argument('--config', default='', type=str)
args = parser.parse_args()

with open(args.config) as f:
config = yaml.load(f)
for k,v in config.items():
setattr(args, k, v)

# 使用
print(args.paraint) # 0
print(args.config1['attribute1']) # 1
print(args.config2['attribute2']['attribute1']) # aha!