在Python中,我们如何找到为脚本提供的命令行参数并处理它们?
相关背景阅读:“sys.argv [1]”是什么意思?(sys.argv是什么,它来自哪里?)。对于更具体的示例,请参见如何实现“[命令] [操作] [参数]”样式的命令行界面?和如何使用Python的optparse格式化位置参数帮助?。
相关背景阅读:“sys.argv [1]”是什么意思?(sys.argv是什么,它来自哪里?)。对于更具体的示例,请参见如何实现“[命令] [操作] [参数]”样式的命令行界面?和如何使用Python的optparse格式化位置参数帮助?。
最近我们的几个生物技术客户提出了以下两个问题:
我在下面附上了一个Python脚本,我相信它可以回答这两个问题。假设以下Python脚本保存在test.py文件中:
#
#----------------------------------------------------------------------
#
# file name: test.py
#
# input values: data - location of data to be processed
# date - date data were delivered for processing
# study - name of the study where data originated
# logs - location where log files should be written
#
# macOS usage:
#
# python3 test.py "/Users/lawrence/data" "20220518" "XYZ123" "/Users/lawrence/logs"
#
# Windows usage:
#
# python test.py "D:\data" "20220518" "XYZ123" "D:\logs"
#
#----------------------------------------------------------------------
#
# import needed modules...
#
import sys
import datetime
def main(argv):
#
# print message that process is starting...
#
print("test process starting at", datetime.datetime.now().strftime("%Y%m%d %H:%M"))
#
# set local values from input values...
#
data = sys.argv[1]
date = sys.argv[2]
study = sys.argv[3]
logs = sys.argv[4]
#
# print input arguments...
#
print("data value is", data)
print("date value is", date)
print("study value is", study)
print("logs value is", logs)
#
# print message that process is ending...
#
print("test process ending at", datetime.datetime.now().strftime("%Y%m%d %H:%M"))
#
# call main() to begin processing...
#
if __name__ == '__main__':
main(sys.argv)
脚本可以在 macOS 计算机的终端 shell 上执行,如下所示,并将结果打印到标准输出(确保当前目录包含 test.py 文件):
$ python3 test.py "/Users/lawrence/data" "20220518" "XYZ123" "/Users/lawrence/logs"
test process starting at 20220518 16:51
data value is /Users/lawrence/data
date value is 20220518
study value is XYZ123
logs value is /Users/lawrence/logs
test process ending at 20220518 16:51
D:\scripts>python test.py "D:\data" "20220518" "XYZ123" "D:\logs"
test process starting at 20220518 17:20
data value is D:\data
date value is 20220518
study value is XYZ123
logs value is D:\logs
test process ending at 20220518 17:20
这个脚本可以回答上述两个问题,也是开发将作为带有输入值的命令执行的脚本的良好起点。
这个处理简单的开关,带有可选替代标志的值开关。
import sys
# [IN] argv - array of args
# [IN] switch - switch to seek
# [IN] val - expecting value
# [IN] alt - switch alternative
# returns value or True if val not expected
def parse_cmd(argv,switch,val=None,alt=None):
for idx, x in enumerate(argv):
if x == switch or x == alt:
if val:
if len(argv) > (idx+1):
if not argv[idx+1].startswith('-'):
return argv[idx+1]
else:
return True
//expecting a value for -i
i = parse_cmd(sys.argv[1:],"-i", True, "--input")
//no value needed for -p
p = parse_cmd(sys.argv[1:],"-p")