背景:使用python指令碼傳遞引數在實際工作過程中還是比較常用,以下提供了好幾種的實現方式:
一、使用sys.argv的陣列傳入
說明:使用sys.argv必須按照先後的順序傳入對應的引數;sys.argv則封裝了傳入的引數資料,作為陣列的方式已經傳入
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)
透過命令列檢視執行結果:
二、使用argparse包傳入
說明:parser.add_argument 方法的type引數理論上可以是任何合法的型別,而且傳入的順序並沒有要求
引數使用的說明:
--xx 完整引數輸入
-x 簡寫引數輸入
type 輸入的引數將要被轉換的資料型別
default 預設值
help 引數介紹
nargs 可傳入的引數數量
required 是否為必須引數
import argparse
parser = argparse.ArgumentParser(description='argparse testing')
parser.add_argument('--name','-n',type=str, default = "bk",required=True,help="a programmer's name")
parser.add_argument('--age','-a',type=int, default=35,help='age of the programmer')
parser.add_argument('--sex','-s',type=str, default='male')
parser.add_argument('--favorite','-f',type=str, nargs="+",required=False,help="favorite of the programmer")
args = parser.parse_args()
print(args.name)
print(args.age)
print(args.sex)
print(args.favorite)
檢視執行結果:
1.使用完整引數輸入
2.使用簡寫引數輸入
3.多引數的傳入
三、使用shell指令碼的方式向python指令碼傳遞引數
1.使用shell指令碼向python指令碼傳遞引數
python指令碼依然使用sys.argv的陣列的方式傳入引數
原python如下:(python_test.py)
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指令碼如下:(shell_test.sh)
#!/bin/bash
#定義變數
para1=$1
para2=$2
python python_test.py $para1 $para2
檢視執行結果:
2.使用shell指令碼向python指令碼內的方法傳遞引數
python指令碼如下:(python_test.py)
def fun1():
return "無引數方法fun1"
def fun2(x):
return f"有引數方法fun2且傳入的引數為{x}"
shell指令碼如下:(shell_test.sh)
(1)無引數方式呼叫:
#!/bin/bash
#定義變數
python -c 'import python_test;print(python_test.fun1())'
檢視執行結果:
(2)有引數方式呼叫
#!/bin/bash
#定義變數
para=$1
python -c "import python_test;print(python_test.fun2('${para}'))"
檢視執行結果:
(3)一次呼叫所有方法,放入一個集合中,再呼叫切割方法獲取相應的值
#!/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
檢視執行結果: