背景
在日常使用一些数据处理脚本以及训练模型的时候,使用传递参数很常见,因此对使用python进行参数传递的方式进行了整理
1.使用sys.argv的数组进行传参
使用sys.argv必须按照先后的顺序传入对应的参数;sys.argv则封装了传入的参数数据,作为数组的方式进行传入。
1 2 3 4 5 6 7 8 9 10 11
| import sys
print('传入参数:', sys.argv) print("传入参数的总长度为:", len(sys.argv)) print("type:", type(sys.argv)) print("function name:", sys.argv[0]) try: print("第一个传入的参数为:", sys.argv[1]) print("第二个传入的参数为:", sys.argv[2]) except Exception as e: print("Input Error:", e)
|
运行的output:
1 2 3 4 5 6
| 传入参数: ['py_test.py', 'one', 'two'] 传入参数的总长度为: 3 type: <class 'list'> function name: py_test.py 第一个传入的参数为: one 第二个传入的参数为: two
|
2.使用argparse包传入
args.add_argument的方法的type参数理论上可以是任何合法的类型,而且传入的顺序没有要求,这点来说比较方便,因此在现在脚本的编写上,使用argparse包越来越常见。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import argparse args = argparse.ArgumentParser(description='argparse testing') args.add_argument('--name','-n',type=str, default = "bk",required=True,help="a programmer's name") args.add_argument('--age','-a',type=int, default=35,help='age of the programmer') args.add_argument('--sex','-s',type=str, default='male') args.add_argument('--favorite','-f',type=str, nargs="+",required=False,help="favorite of the programmer") args = args.parse_args() print(args.name) print(args.age) print(args.sex) print(args.favorite)
None:表示只接收一个参数 N(整数): 表示必须接收正好N个值 '?': 表示可选一个值,如果没有值则使用默认参数 '*': 表示可以接收零个或多个值,所有值被收集成一个列表 '+': 表示必须有一个或多个值,至少有一个,结果为列表
|
3.通过shell脚本的形式进行传参
3.1 使用shell脚本向python脚本进行传参
python 脚本依旧使用sys.argv的数组方式进行传入。
python文件:py_test.py
1 2 3 4 5 6 7 8 9 10
| import sys
print("传入参数的总长度为:", len(sys.argv)) print("type:", type(sys.argv)) print("function name:", sys.argv[0]) try: print("第一个传入的参数为:", sys.argv[1]) print("第二个传入的参数为:", sys.argv[2]) except Exception as e: print("Input Error:", e)
|
shell脚本文件:py_test_shell.sh
1 2 3 4 5
| #!/bin/bash #定义变量 para1=$ 1para2=$2 python python_test.py $para1 $para2
|
终端执行命令:sh py_test_shell.sh test01 test02
1 2 3 4 5
| 传入参数的总长度为: 3 type: <class 'list'> function name: py_test.py 第一个传入的参数为: test01 第二个传入的参数为: test02
|
3.2 使用shell脚本向python脚本内的方法传递参数
python脚本如下:(py_test.py)
1 2 3 4 5
| def fun1(): return "无参数方法fun1"
def fun2(x): return f"有参数方法fun2且传入的参数为{x}"
|
3.2.1 (1)无参数调用:
文件名:py_test_shell.sh
1 2 3
| #!/bin/bash
python -c 'import python_test;print(python_test.fun1())'
|
sh py_test_shell.sh
输出:
3.2.2 (2)有参数调用:
文件名:py_test_shell.sh
1 2 3 4
|
para=$1 python -c "import python_test;print(python_test.fun2('${para}'))"
|
执行命令:sh py_test_shell.sh hello
输出:有参数方法fun2且传入的参数为hello
3.2.3 (3)一次调用所有方法,放入一个集合中,再调用切割方法获取相应的值
1 2 3 4 5 6 7 8 9 10
| #!/bin/bash #定义变量 para=$1 #将结果保存为一个变量ALL_RESULTS内 ALL_RESULTS=$(python -c "import python_test;print(python_test.fun1(),python_test.fun2('${para}'))") #分别打印第一个方法的返回与第二个方法的返回 RESULTS_fun1=$(echo $ALL_RESULTS | cut -d' ' -f1) RESULTS_fun2=$(echo $ALL_RESULTS | cut -d' ' -f2) echo fun1方法的返回结果为:$RESULTS_fun1 echo fun2方法的返回结果为:$RESULTS_fun2
|
输出:
1 2
| fun1方法的返回结果为:无参数方法fun1 fun2方法的返回结果为:有参数方法fun2且传入的参数为helloworld
|
参考文章:参考文章