Python 基础教程

Python 高级教程

Python 相关应用

Python 笔记

python 脚本命令行参数传递及解析的几种方式

Python 笔记 Python 笔记


在运行 python 脚本时,需要传入一些参数,常用的有如下三种方式。

sys.argv

sys 模块是 python 标准库提供的模块,它封装了与 python 解释器相关的数据;如 sys.modules 里面有已经加载了的所有模块信息,sys.path 里面是 PYTHONPATH 的内容,而 sys.argv 则封装了传入的参数数据。

sys.argv 是 list 类型,第一个值对应的是执行脚本的文件名,如 demo.py,从第二个值开始对应用户传入的自定义参数(如果存在),具体示例如下:

[dev@Linux ~]$ python demo.py knowledge dict

demo.py 代码如下:

import sys

print(sys.argv)
print(sys.argv[0])
print(sys.argv[1])
print(sys.argv[2])

输出如下:

['demo.py', 'knowledge', 'dict']
demo.py
knowledge
dict

argparse

argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。

import argparse

parser = argparse.ArgumentParser(description='manual to this script')
parser.add_argument('--gpus', type=str, default = None)
parser.add_argument('--batch-size', type=int, default=32)
args = parser.parse_args()
print(args.gpus)
print(args.batch_size)

需要注意的是,脚本运行命令 python script.py -gpus=0,1,2 --batch-size=10 中的 --batch-size 会被自动解析成 batch_size。

parser.add_argument 方法的 type 参数理论上可以是任何合法的类型,但有些参数传入格式比较麻烦,例如 list,所以一般使用 boolintstrfloat 这些基本类型就行了,更复杂的需求可以通过 str 传入,然后手动解析。bool 类型的解析比较特殊,传入任何值都会被解析成 True,传入空值时才为 False。

tf.app.run

tensorflow 也提供了一种方便的解析方式。

脚本的执行命令为:

python script.py -gpus=0,1,2 --batch_size=10

对应的 python 代码为:

import tensorflow as tf
tf.app.flags.DEFINE_string('gpus', None, 'gpus to use')
tf.app.flags.DEFINE_integer('batch_size', 5, 'batch size')

FLAGS = tf.app.flags.FLAGS

def main(_):
    print(FLAGS.gpus)
    print(FLAGS.batch_size)

if __name__=="__main__":
    tf.app.run()

tensorflow 只提供以下几种方法:

  • tf.app.flags.DEFINE_string
  • tf.app.flags.DEFINE_integer
  • tf.app.flags.DEFINE_boolean
  • tf.app.flags.DEFINE_float

四种方法,分别对应 str,int,bool 和 float 类型的参数。这里对 bool 的解析比较严格,传入1会被解析成 True,其余任何值都会被解析成 False。

tf.app.run() 会寻找并执行入口脚本的 main 方法。也只有在执行了 tf.app.run() 之后才能从 FLAGS 中取出参数。