命令行运行Python脚本时传入参数的三种方式详解

Aria
Aria
发布时间:2026-10-13 | 5人浏览过
原创

本文详解在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

以上即为本文的全部内容,希望能为读者提供有益参考,也欢迎大家继续支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表