python执行脚本加参数_命令行运行Python脚本时传入参数的三种方式详解以及argparse子命令subparsers()方法

1 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

10 

2 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

20 

2.1 注意事项

需要注意的是,脚本运行命令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

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

3 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()

3.1 有几点需要注意:

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。

脚本中需要定义一个接收一个参数的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只是对argpars的简单封装。

4 关于argparse子命令subparsers()方法

功能比较多的命令端程序常常将功能分解到不同子命令中,如在Python中常见的pip install、pip uninstall等。当程序比较复杂且不同功能都需要不同参数时,子命令是一个不错的方式。

参考、https://blog.csdn.net/qq_41629756/article/details/105689494
argparse 使用add_subparsers()方法去创建子命令。代码:

import argparse

parser = argparse.ArgumentParser(prog='PROG')

subparsers = parser.add_subparsers(help='sub-command help')
#添加子命令 add
parser_a = subparsers.add_parser('add', help='add help')
parser_a.add_argument('-x', type=int, help='x value')
parser_a.add_argument('-y', type=int, help='y value')
#添加子命令 sub
parser_s = subparsers.add_parser('sub', help='sub help')
parser_s.add_argument('-x', type=int, help='x value')
parser_s.add_argument('-y', type=int, help='y value')

args = parser.parse_args()

print('x', args.x, 'y', yargs.y)

终端运行程序

$python subc.py add -x 1 -y 2
x 1 y 2
$python subc.py sub -x 1 -y 2
x 1 y 2

你可能感兴趣的:(笔记,术语,python,python,pycharm,开发语言)