背景

    在日常使用一些数据处理脚本以及训练模型的时候,使用传递参数很常见,因此对使用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() # !解析命令行参数并将参数保存在args中
print(args.name)
print(args.age)
print(args.sex)
print(args.favorite)


# 注: nargs参数的作用是指定需要接收的参数数量
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
输出:

1
无参数方法fun1
3.2.2 (2)有参数调用:

文件名:py_test_shell.sh

1
2
3
4
#!/bin/bash
#定义变量
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

参考文章:参考文章