在运行 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,所以一般使用 bool
、int
、str
和 float
这些基本类型就行了,更复杂的需求可以通过 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 中取出参数。