python的命令行,python基础命令解读

  python的命令行,python基础命令解读

  随着我们编程经验的增长,我们更加熟悉命令行。我想很多人会逐渐意识到使用命令行带来的高效率。本文将介绍Python解析命令行的两种方法,有需要的可以参考。

  00-1010 1.人工分析2。getopt模块汇总如何优雅地解析命令行选项

  随着我们编程经验的增长,我们更加熟悉命令行。我想很多人会逐渐意识到使用命令行带来的高效率。

  自然,很多我们自己编写的程序(或者干脆就是脚本)也希望能够像原生命令等程序一样,通过运行时输入的参数来设置和改变程序的行为;您不必一层一层地寻找相应的配置文件,而是必须找到相应的内容、修改、保存并退出.

  想想就麻烦,好吗

  

目录

  所以我们开始解析命令行参数吧~

  在之前关于模块的文章中,我们提到了变量sys.args,它保存了调用当前脚本时传入的命令行参数。

  让我们先来看看这个变量:

  #测试_系统. py

  导入系统

  打印(sys.argv)

  从命令行调用:

  $ python test _ sys . py-d today-t now-author just dopython-country China-auto

  获得以下输出结果:

  [test_sys.py ,-d , today ,-t , now ,- author , justdopython ,- country , China ,- auto]

  可以看出sys.argv实际上是命令行参数用空格分割后得到的字符串列表。此外,第一个命令行参数是当前运行的脚本的名称。

  如果要提取每个参数及其对应的值,首先要区分命令行的长参数和短参数,分别用“-”和“-”来标识。所以我们也以此为条件来判断长度参数:

  导入系统

  对于sys.argv[1:]:中的command_arg

  if command _ arg . starts with(-):

  Print(%s是长参数 % command_arg )

  elif command _ arg . starts with(-):

  Print(%s是短参数 % command_arg)

  测试结果:

  $ python manually _ parse _ argv . py-d today-t now-author just dopython-country China-auto

  -d是一个短参数

  -t是一个短参数

  - author是一个长参数。

  -国家是一个长参数。

  - auto是一个长参数。

  然后,我们需要在解析长、短参数的基础上,解析相应的参数值:

  #手动_解析_argv.py

  导入系统

  #因为sys.argv的第一个变量是当前脚本名,所以跳过它。

  对于索引,枚举中的command _ arg(sys . argv[1:]):

  if command _ arg . starts with(-):

  尝试:

  value=sys.argv[1:][index 1]

  如果不是value.startswith(-):

  Print(%s是一个长参数,参数值为%s% (command_arg,value))

  继续

  除了IndexError:

  及格

  Print(%s是一个长参数,没有参数值 % command_arg )

  elif command_arg.startswith(

  -):

   try:

   value = sys.argv[1:][index+1]

   if not value.startswith(-):

   print("%s 为短参数,参数值为 %s" % (command_arg, value))

   continue

   except IndexError:

   pass

   print("%s 为短参数,无参数值" % command_arg)

  再测试一下:

  

$ python manually_parse_argv.py -d today -t now --author justdopython --country China --auto
-d 为短参数,参数值为 today
-t 为短参数,参数值为 now
--author 为长参数,参数值为 justdopython
--country 为长参数,参数值为 China
--auto 为长参数,无参数值

  

  看起来还不错。

  但是再看看我们的代码……真正的逻辑还没开始,反倒是为了解析命令行参数已经写了几十行代码。这一点都不pythonic——这还不包括一些其他关于异常情况的处理。

  更何况是要在每个类似的程序中加入这么一段程序了。

  

  

2. getopt模块

  Python的好处就在于,生态过于丰富,几乎你要用到的每个功能,都已经有人为你写好了现成的模块以供调用。

  衣来伸手饭来张口的日子除了能在梦中想想,在用Python写程序的时候也不是不可以奢望。

  比如命令行参数解析,就有一个名为getopt的模块,既能够准确区分长短命令行参数,也能够恰当地提取命令行参数的值。

  咱们先来看看:

  

# test_getopt.py

  import sys

  import getopt

  opts, args = getopt.getopt(sys.argv[1:], d:t:, ["author=", "country=", "auto"])

  print(opts)

  print(args)

  打印结果:

  

$ python test_getopt.py -d today -t now --author justdopython --country China --auto
[('-d', 'today'), ('-t', 'now'), ('--author', 'justdopython'), ('--country', 'China'), ('--auto', '')]
[]

  

  下面我们来分别解释一下相关参数的含义。

  getopt模块中的getopt函数用于解析命令行参数。

  该函数接受三个参数:args,shortopts和longopts,分别代表命令行参数,要接收的短选项和要接收的长选项。

  其中args和longopts均为字符串组成的列表,而shortopts则为一个字符串。

  同样地,由于sys.argv的第一个值为当前脚本名称,所以多数情况下我们会选择向args参数传入sys.argv[1:]的值。

  而shortopts这个参数接受的字符串则表示需要解析哪些短选项,字符串中每个字母均表示一个短选项:

  

import sys

  import getopt

  opts, args = getopt.getopt(sys.argv[1:], dt)

  print(opts)

  print(args)

  输出结果:

  

$ python test_getopt.py -d -t
[('-d', ''), ('-t', '')]
[]

  

  当然,如果输入的参数少于预期,也不会导致解析失败:

  

$ python test_getopt.py -t
[('-t', '')]
[]

  

  但要是给出了预期之外的参数,就会导致模块抛错:

  

$ python test_getopt.py -d -t -k

  Traceback (most recent call last):

   File "test_getopt.py", line 11, in <module>

   opts, args = getopt.getopt(sys.argv[1:], dt)

   ...

   raise GetoptError(_(option -%s not recognized) % opt, opt)

  getopt.GetoptError: option -k not recognized

  这样的处理逻辑也符合我们使用命令的体验,可以简单地理解为宁缺毋滥。

  如果短参数相应的字母后带了一个冒号:,则意味着这个参数需要指定一个参数值。getopt会将该参数对应的下一个命令行参数作为参数值(而不论下一个参数是什么形式):

  

import sys

  import getopt

  opts, args = getopt.getopt(sys.argv[1:], d:t)

  print(opts)

  print(args)

  # $ python test_getopt.py -d -t

  # [(-d, -t)]

  # []

  此外,一旦getopt在预期接收到长短选项的位置没有找到以--或-开头的字符串,就会终止解析过程,剩下的未解析字符串均放在返回元组的第二项中返回。

  

$ python test_getopt.py -d d_value o --pattern -t
[('-d', 'd_value')]
['o', '--pattern', '-t']

  

  类似地,longopts参数表示需要解析的长参数。

  列表中的每一个字符串代表一个长参数:

  

import sys

  import getopt

  opts, args = getopt.getopt(sys.argv[1:], , ["author", "country"])

  print(opts)

  print(args)

  # $ python test_getopt.py --author --country

  # [(--author, ), (--country, )]

  # []

  要解析带有参数值的长参数,还应在每个长参数后附带一个等于号(=),以标识该参数需要带值:

  

import sys

  import getopt

  opts, args = getopt.getopt(sys.argv[1:], , ["author=", "country"])

  print(opts)

  print(args)

  # $ python test_getopt.py --author justdopython --country

  # [(--author, justdopython), (--country, )]

  # []

  所以最终就得到了我们一开始的解析结果:

  

import sys

  import getopt

  opts, args = getopt.getopt(sys.argv[1:], d:t:, ["author=", "country=", "auto"])

  print(opts)

  print(args)

  # $ python test_getopt.py -d today -t now --author justdopython --country China --auto

  # [(-d, today), (-t, now), (--author, justdopython), (--country, China), (--auto, )]

  # []

  解析完成后,我们再从opts中提取相应的值即可。

  懒人福音

  getopt除了替我们节省了编写命令行参数解析代码的时间和精力,另一方面还可以让你在输入命令行参数时少打几个字母——当然,严谨来讲,我们并不建议此类行为。慎用,慎用!

  getopt对长参数的解析支持前缀匹配,只要输入的参数能够与某个指定参数唯一匹配,同样能够完成预期解析。

  

$ python test_getopt.py -d today -t now --auth justdopython --coun China --auto
[('-d', 'today'), ('-t', 'now'), ('--author', 'justdopython'), ('--country', 'China'), ('--auto', '')]
[]

  

  可以看到,author和country两个参数我们都只输入了一部分,但是getopt依然进行了正确的解析。

  

  

总结

  本文讲解了使用Python解析命令行参数的两种方式,一种是略显笨重的手动解析,即自己编写程序自定义解析;另一种则是调用现成、且更加健壮的getopt模块来完成解析。

  从此以后,我们终于可以摆脱繁琐的配置文件,用一种优雅简洁的方式来修改程序的行为了。

  以上就是详解Python如何优雅地解析命令行的详细内容,更多关于Python解析命令行的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: