已知參數(shù)數(shù)目
#!/usr/bin/python3
import sys
if len(sys.argv) != 3:
sys.exit("Error: Please provide exactly two numbers as arguments")
else:
(num1, num2) = sys.argv[1:]
total = int(num1) + int(num2)
print("{} + {} = {}".format(num1, num2, total))
- 傳入Python程序的命令行參數(shù)自動(dòng)保存在
sys.argv
列表中 - 讓用戶知道錯(cuò)誤信息是非常好的想法
- 當(dāng)程序因?yàn)殄e(cuò)誤的使用而終止報(bào)錯(cuò)湾戳,使用
sys.exit()
獲取錯(cuò)誤信息或者一個(gè)自定義狀態(tài)碼 - Python文檔 - sys模塊
$ ./sum_of_two_numbers.py 2 3
2 + 3 = 5
$ echo $?
0
$ ./sum_of_two_numbers.py 2 3 7
Error: Please provide exactly two numbers as arguments
$ echo $?
1
$ ./sum_of_two_numbers.py 2 'x'
Traceback (most recent call last):
File "./sum_of_two_numbers.py", line 9, in <module>
total = int(num1) + int(num2)
ValueError: invalid literal for int() with base 10: 'x'
$ echo $?
1
變長(zhǎng)參數(shù)
#!/usr/bin/python3
import sys, pathlib, subprocess
if len(sys.argv) < 2:
sys.exit("Error: Please provide at least one filename as argument")
input_files = sys.argv[1:]
files_not_found = []
for filename in input_files:
if not pathlib.Path(filename).is_file():
files_not_found.append("File '{}' not found".format(filename))
continue
line_count = subprocess.getoutput('wc -l < ' + filename)
print("{0:40}: {1:4} lines".format(filename, line_count))
print("\n".join(files_not_found))
- 當(dāng)處理的用戶輸入包含文件名時(shí)版述,最好在處理之前進(jìn)行檢查
- Python文檔 - pathlib
$ ./varying_command_line_args.py
Error: Please provide at least one filename as argument
$ echo $?
1
$ #選擇性呈現(xiàn)輸出
$ ./varying_command_line_args.py *.py
calling_shell_commands.py : 14 lines
for_loop.py : 6 lines
functions_default_arg_value.py : 16 lines
functions.py : 24 lines
hello_world.py : 3 lines
if_elif_else.py : 22 lines
if_else_oneliner.py : 6 lines
shell_command_output_redirections.py : 21 lines
...
$ ./varying_command_line_args.py hello_world.py xyz.py for_loop.py abc.py
hello_world.py : 3 lines
for_loop.py : 6 lines
File 'xyz.py' not found
File 'abc.py' not found
- 如果你的Python版本不是3.4或者更高分飞,使用
os
模塊而不是pathlib
模塊進(jìn)行文件檢查
import os
if not os.path.isfile(filename):
sys.exit("File '{}' not found".format(filename))
在代碼中使用程序名
#!/usr/bin/python3
import sys, pathlib, subprocess, re
if len(sys.argv) != 2:
sys.exit("Error: Please provide exactly one filename as argument")
program_name = sys.argv[0]
filename = sys.argv[1]
if not pathlib.Path(filename).is_file():
sys.exit("File '{}' not found".format(filename))
if re.search(r'line_count.py', program_name):
lc = subprocess.getoutput('wc -l < ' + filename)
print("No. of lines in '{}' is: {}".format(filename, lc))
elif re.search(r'word_count.py', program_name):
wc = subprocess.getoutput('wc -w < ' + filename)
print("No. of words in '{}' is: {}".format(filename, wc))
else:
sys.exit("Program name '{}' not recognized".format(program_name))
- 基于程序名,同一程序可以用作不同的目的
$ ./line_count.py if_elif_else.py
No. of lines in 'if_elif_else.py' is: 22
$ ln -s line_count.py word_count.py
$ ./word_count.py if_elif_else.py
No. of words in 'if_elif_else.py' is: 73
$ ln -s line_count.py abc.py
$ ./abc.py if_elif_else.py
Program name './abc.py' not recognized
$ wc -lw if_elif_else.py
22 73 if_elif_else.py
命令行開關(guān)
#!/usr/bin/python3
import argparse, subprocess
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', help="file to be sorted", required=True)
parser.add_argument('-u', help="sort uniquely", action="store_true")
args = parser.parse_args()
if args.u:
subprocess.call(['sort', '-u', args.file, '-o', args.file])
else:
subprocess.call(['sort', args.file, '-o', args.file])
- 使用
argparse
模塊是一種更簡(jiǎn)單的方式使得構(gòu)建的程序像shell命令 - 默認(rèn)它添加一個(gè)help選項(xiàng)
-h
(短格式)和--help
選項(xiàng)(長(zhǎng)格式)處理錯(cuò)誤的使用
在這個(gè)例子中:
-
-f
或--file
聲明為必需選項(xiàng)钞艇,它接受一個(gè)參數(shù)(文件名) -
-u
是一個(gè)可選的標(biāo)記 -
help
用于指定展示的文本和選項(xiàng)的幫助信息
$ ./sort_file.py
usage: sort_file.py [-h] -f FILE [-u]
sort_file.py: error: the following arguments are required: -f/--file
$ ./sort_file.py -h
usage: sort_file.py [-h] -f FILE [-u]
optional arguments:
-h, --help show this help message and exit
-f FILE, --file FILE file to be sorted
-u sort uniquely
$ ./sort_file.py -f test_list.txt
$ cat test_list.txt
async_test
basic_test
input_test
input_test
output_test
sync_test
$ ./sort_file.py -f test_list.txt -u
$ cat test_list.txt
async_test
basic_test
input_test
output_test
sync_test
$ ./sort_file.py -f xyz.txt
sort: cannot read: xyz.txt: No such file or directory
- 指定位置參數(shù)
#!/usr/bin/python3
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('num1', type=int, help="first number")
parser.add_argument('num2', type=int, help="second number")
args = parser.parse_args()
total = args.num1 + args.num2
print("{} + {} = {}".format(args.num1, args.num2, total))
- 比手動(dòng)解析
sys.argv
更可讀的方法,同時(shí)提供默認(rèn)幫助和錯(cuò)誤處理 - 需要的類型轉(zhuǎn)換可以在構(gòu)建參數(shù)時(shí)指定
$ ./sum2nums_argparse.py
usage: sum2nums_argparse.py [-h] num1 num2
sum2nums_argparse.py: error: the following arguments are required: num1, num2
$ ./sum2nums_argparse.py -h
usage: sum2nums_argparse.py [-h] num1 num2
positional arguments:
num1 first number
num2 second number
optional arguments:
-h, --help show this help message and exit
$ ./sum2nums_argparse.py 3 4
3 + 4 = 7
$ ./sum2nums_argparse.py 3 4 7
usage: sum2nums_argparse.py [-h] num1 num2
sum2nums_argparse.py: error: unrecognized arguments: 7
進(jìn)一步閱讀