如何读取和处理命令行参数?

799

6
使用 docopt(参见 @ralbatross 在 https://dev59.com/hXNA5IYBdhLWcg3wVcFx#14790373 中的回答)。我已经尝试了其他所有方法,但实际上 docopt 是我今后唯一会使用的方法。 - Pat
3
我认为没有一种单一的最佳方法。argparse是标准且功能丰富的。docopt非常优雅,但不在标准库中。对于非常简单的轻量级使用,您可以使函数默认值处理命令行参数默认值 - Simon Hibbs
22个回答

0

最近我们的几个生物技术客户提出了以下两个问题:

  • 如何将Python脚本作为命令执行?
  • 当Python脚本作为命令执行时,如何传递输入值?

我在下面附上了一个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

脚本也可以在Windows计算机的命令提示符中执行,如下所示,并将结果打印到标准输出(请确保当前目录包含test.py文件):
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

这个脚本可以回答上述两个问题,也是开发将作为带有输入值的命令执行的脚本的良好起点。


0

这个处理简单的开关,带有可选替代标志的值开关。

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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接