在執(zhí)行python 代碼的時(shí)候,有時(shí)候需要傳遞外面的參數(shù)進(jìn)行處理,那么python如何接收參數(shù)呢?一起來(lái)了解下吧:
?
python如何接收參數(shù)
?
?
需要一個(gè)模塊
?
from sys import argv
?
當(dāng)然也可以直接只導(dǎo)入 sys
?
import sys
?
然后使用的時(shí)候, 用sys.argv也是可行的
?
import sys
?
print "the script name is ", sys.argv[0]
?
for num in range(1, len(sys.argv)):
?
? print "parameter %d is %s "% (num, sys.argv[num])
?
結(jié)果如下:
?
python test2.py this is a test last_parameter_Success
?
the script name is? test2.py
?
parameter 1 is this?
?
parameter 2 is is?
?
parameter 3 is a?
?
parameter 4 is test?
?
parameter 5 is last_parameter_Success?
?
python怎么命令接收參數(shù)
?
1. 簡(jiǎn)單使用
?
需要使用到sys庫(kù)里的argv屬性。
?
sys.argv? ?返回一個(gè)參數(shù)列表
?
len(sys.argv)? ? 返回參數(shù)個(gè)數(shù)(其中*個(gè)參數(shù)為文件名)
?
文件test.py:
?
import sys
?
print sys.argv
?
終端輸入:
?
python test.py arg1 arg2
?
Output:
?
['test.py', 'arg1', 'arg2']
?
我們注意到argv[0]表示的是腳本文件名。
?
2. 接收選項(xiàng)
?
上面所述的方法對(duì)于接收選項(xiàng)無(wú)能為力。為了適應(yīng)這種需求,我們需要使用getopt包。主要使用getopt.gnu_getopt()函數(shù)。函數(shù)簽名:
?
getopt.gnu_getopt(args, options[, long_options])
?
選項(xiàng)分兩種:有值選項(xiàng)和無(wú)值選項(xiàng)。
?
參數(shù)解釋:
?
options:? ? 短選項(xiàng),一個(gè)選項(xiàng)一個(gè)字母,如果選項(xiàng)后面有‘:’,說(shuō)明其為有值選項(xiàng)。
?
long_options:? ? 長(zhǎng)選項(xiàng)。如果后面有‘=’,說(shuō)明為有值選項(xiàng)。
?
文件test.py
?
import getopt
?
import sys
?
opts, args = getopt.gnu_getopt(sys.argv[1:], 'i:o:v', ['input=', 'output_path=', 'version'])
?
print opts
?
print args
?
終端輸入:
?
python test.py arg1 arg2 -i input --output output -v
?
輸出:
?
[('-i', 'input'), ('--output_path', 'output'), ('-v', '')]
?
['arg1', 'arg2']
?
python獲取命令行參數(shù)的方法
?
一、getopt模塊
?
?主要用到了模塊中的函數(shù):
?
options, args = getopt.getopt(args, shortopts, longopts=[])
?
參數(shù)args:一般是sys.argv[1:]。過(guò)濾掉sys.argv[0],它是執(zhí)行腳本的名字,不算做命令行參數(shù)。
?
參數(shù)shortopts:短格式分析串。例如:"hp:i:",h后面沒(méi)有冒號(hào),表示后面不帶參數(shù);p和i后面帶有冒號(hào),表示后面帶參數(shù)。
?
參數(shù)longopts:長(zhǎng)格式分析串列表。例如:["help", "ip=", "port="],help后面沒(méi)有等號(hào),表示后面不帶參數(shù);ip和port后面帶冒號(hào),表示后面帶參數(shù)。
?
返回值options是以元組為元素的列表,每個(gè)元組的形式為:(選項(xiàng)串, 附加參數(shù)),如:('-i', '192.168.0.1')
?
返回值args是個(gè)列表,其中的元素是那些不含'-'或'--'的參數(shù)。
?
在命令行運(yùn)行下述命令:
?
python test_getopt.py -i 192.168.0.1 -p 80 123 a
?
或
?
python test_getopt.py -ip=192.168.0.1 --port=80 123 a
?
test_getopt.py代碼如下:
?
?1 #encoding=utf-8
?
?2?
?
?3 import getopt
?
?4 import sys
?
?5?
?
?6 def main(argv):
?
?7? ? ?try:
?
?8? ? ? ? ?options, args = getopt.getopt(argv, "hp:i:", ["help", "ip=", "port="])
?
?9? ? ?except getopt.GetoptError:
?
10? ? ? ? ?sys.exit()
?
11?
?
12? ? ?for option, value in options:
?
13? ? ? ? ?if option in ("-h", "--help"):
?
14? ? ? ? ? ? ?print("help")
?
15? ? ? ? ?if option in ("-i", "--ip"):
?
16? ? ? ? ? ? ?print("ip is: {0}".format(value))
?
17? ? ? ? ?if option in ("-p", "--port"):
?
18? ? ? ? ? ? ?print("port is: {0}".format(value))
?
19?
?
20? ? ?print("error args: {0}".format(args))
?
21?
?
22 if __name__ == '__main__':
?
23? ? ?main(sys.argv[1:])
?
運(yùn)行結(jié)果如下:
?
test_getopt.py的運(yùn)行結(jié)果
?
?
二、argparse模塊
?
用于解析命令行選項(xiàng)和參數(shù)的標(biāo)準(zhǔn)模塊。
?
使用步驟:
?
1: import argparse #導(dǎo)入模塊
?
2: parser = argparse.ArgumentParser() #創(chuàng)建解析對(duì)象
?
3: parser.add_argument() #向該對(duì)象中添加使用到的命令行選項(xiàng)和參數(shù)
?
4: parser.parser_args() #解析命令行
?
接下來(lái)詳細(xì)介紹下方法ArgumentParser和add_argument:
?
ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparser.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True)
?
其中的參數(shù)都有默認(rèn)值,當(dāng)運(yùn)行程序時(shí)由于參數(shù)不正確或者當(dāng)調(diào)用parser.print_help()方法時(shí),會(huì)打印這些描述信息。一般只需要傳遞參數(shù)description。
?
add_argument(name or flags... [, action] [, nargs] [, const] [, default] [, type] [, choices] [, required] [, help] [, metavar] [, dest])
?
其中的常用參數(shù)解釋如下:
?
name or flags: 命令行參數(shù)名或者選項(xiàng),如-p, --port
?
action:
?
store: 默認(rèn)的action模式,存儲(chǔ)值到指定變量
?
store_const: 存儲(chǔ)值在參數(shù)的const部分指定,常用來(lái)實(shí)現(xiàn)非布爾的命令行flag
?
store_true/store_false: 布爾開(kāi)關(guān)。store_true的默認(rèn)值為False,若命令行有輸入該布爾開(kāi)關(guān)則值為True。store_false相反
?
append: 存儲(chǔ)值到列表,該參數(shù)可以重復(fù)使用
?
append_const: 存儲(chǔ)值到列表,存儲(chǔ)值在參數(shù)的const部分指定
?
count: 統(tǒng)計(jì)參數(shù)簡(jiǎn)寫的輸入個(gè)數(shù)
?
version: 輸出版本信息,然后退出腳本
?
nargs: 命令行參數(shù)的個(gè)數(shù),一般用通配符表示: ?表示只用一個(gè),*表示0到多個(gè),+表示1到多個(gè)
?
default: 默認(rèn)值
?
type: 參數(shù)的類型,默認(rèn)是string類型,還可以是float、int和布爾等類型
?
choices: 輸入值的范圍
?
required: 默認(rèn)為False,若為True則表示該參數(shù)必須輸入
?
help: 使用的幫助提示信息
?
dest: 參數(shù)在程序中的對(duì)應(yīng)的變量名稱,如:add_argument("-a", dest="code_name"),在腳本中用parser.code_name來(lái)訪問(wèn)該命令行選項(xiàng)的值
?
示例腳本test_argparse.py代碼如下:
?
?1 #encoding=utf-8
?
?2 import argparse
?
?3?
?
?4 def main(args):
?
?5? ? ?print("--address {0}".format(args.code_address))? ? #args.address會(huì)報(bào)錯(cuò),因?yàn)橹付薲est的值
?
?6? ? ?print("--flag {0}".format(args.flag))? ?#如果命令行中該參數(shù)輸入的值不在choices列表中,則報(bào)錯(cuò)
?
?7? ? ?print("--port {0}".format(args.port))? ?#prot的類型為int類型,如果命令行中沒(méi)有輸入該選項(xiàng)則報(bào)錯(cuò)
?
?8? ? ?print("-l {0}".format(args.log))? #如果命令行中輸入該參數(shù),則該值為True。因?yàn)闉槎谈袷?-l"指定了別名"--log",所以程序中用args.log來(lái)訪問(wèn)
?
?9?
?
10 if __name__ == '__main__':
?
11? ? ?parser = argparse.ArgumentParser(usage="it's usage tip.", description="help info.")
?
12? ? ?parser.add_argument("--address", default=80, help="the port number.", dest="code_address")
?
13? ? ?parser.add_argument("--flag", choices=['.txt', '.jpg', '.xml', '.png'], default=".txt", help="the file type")
?
14? ? ?parser.add_argument("--port", type=int, required=True, help="the port number.")
?
15? ? ?parser.add_argument("-l", "--log", default=False, action="store_true", help="active log info.")
?
16?
?
17? ? ?args = parser.parse_args()
?
18? ? ?main(args)
?
python如何獲取函數(shù)的參數(shù)
?
def f(a=1, b=2, c=3):
?
print(locals())#在函數(shù)內(nèi)獲取
?
#使用inspect模塊,簡(jiǎn)單方便
?
import inspectinspect.getargspec(f)
?
#使用f的內(nèi)置方法#獲取默認(rèn)值,如果參數(shù)名沒(méi)有默認(rèn)值則不在其中:
?
print(f.__defaults__)#使用__code__#總參數(shù)個(gè)數(shù)
?
print(f.__code__.co_argcount)#總參數(shù)名
?
print(f.__code__.co_varnames)
?