命令行运行Python脚本时传入参数的三种方式详解
本文详解在Python脚本中接收命令行参数的三种主流方式:sys.argv基础解析、argparse高级解析以及TensorFlow提供的tf.app.run封装。通过对比三者的代码实现、参数类型处理及默认行为,帮助开发者根据项目需求选择最合适的参数传递方案,特别指出了argparse与tf.app在布尔值及命名解析上的差异。
Python命令行传参概述
在运行Python脚本时,若需传递如gpus和batch_size等配置参数,通常可采用以下三种不同的处理机制。
python script.py 0,1,2 10
python script.py -gpus=0,1,2 --batch-size=10
python script.py -gpus=0,1,2 --batch_size=10
这三种机制分别对应sys.argv、argparse以及tf.app.run三种参数解析方式。前两者为Python标准库内置功能,后者则是TensorFlow框架提供的便捷封装(尽管在命令行执行层面的表现与argparse相似,但其底层源码实现存在差异,具体区别见下文分析)。
使用sys.argv接收参数
sys.argv
sys模块是Python中极为常用的内置模块,它封装了与Python解释器交互相关的数据。例如,sys.modules字典中存储了当前已加载的所有模块信息,
sys.path列表包含了PYTHONPATH环境变量中的路径内容,而sys.argv则专门用于封装从命令行传入的参数数据。
使用sys.argv接收前述第一个命令中参数的具体代码实现如下:
import sys
gpus = sys.argv[1]
#gpus = [int(gpus.split(','))]
batch_size = sys.argv[2]
print(gpus, type(gpus))
print(batch_size, type(batch_size))
执行上述代码后的输出结果:
D:\projects\Pycharm Projects\some-toys\something_else>python argv_test.py 1,0,2 10
1,0,2 <class 'str'>
10 <class 'str'>
使用argparse解析参数
argparse
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, type(args.gpus))
print(args.batch_size, type(args.batch_size))
执行上述代码后的输出结果:
D:\projects\Pycharm Projects\some-toys\something_else>python argv_test.py --gpus=0,1,2 --batch-size=20
0,1,2 <class 'str'>
20 <class 'int'>
需要特别注意,在脚本运行命令python script.py --gpus=0,1,2 --batch-size=10中,参数名--batch-size会被argparse自动解析为batch_size。parser.add_argument方法的type参数理论上支持任何合法类型,但由于某些复杂类型(如list)的传入格式较为繁琐,通常建议仅使用bool、int、str、float等基本类型。对于更复杂的需求,可通过str类型传入后手动解析。此外,bool类型的解析逻辑较为特殊:传入任何非空值均会被解析为True,仅当传入空值时才会解析为False。
python script.py --bool-val=0 # args.bool_val=True
python script.py --bool-val=False # args.bool_val=True
python script.py --bool-val= # args.bool_val=什么都不写False
通过该方法还可以自定义命令的帮助提示信息。具体用法请参考官方API文档:https://docs.python.org/2/library/argparse.html
使用tf.app.run解析参数
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,其余任何值(包括0、False字符串等)均会被解析为False。
脚本中必须定义一个接收单个参数的main方法,即def main(_):,该参数为脚本名称,通常无需使用,因此用下划线接收。以batch_size参数为例,传入该参数时使用的名称为--batch_size,这意味着中划线不会像argparse那样被自动转换为下划线。
tf.app.run()函数会查找并执行入口脚本中的main方法。只有在调用tf.app.run()之后,才能从FLAGS对象中获取已解析的参数。
从其函数签名来看,用户可以自行指定需要执行的方法名,不一定非要是main:
run(
main=None,
argv=None
)
tf.app.flags本质上是对argparse的简单封装。相关源码可见
https://github.com/tensorflow/tensorflow/blob/r1.2/tensorflow/python/platform/flags.py
以上即为本文的全部内容,希望能为读者提供有益参考,也欢迎大家继续支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













