Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取/处理命令行参数?_Python_Command Line_Command Line Arguments - Fatal编程技术网

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

Python 如何读取/处理命令行参数?,python,command-line,command-line-arguments,Python,Command Line,Command Line Arguments,我原来是一名C程序员。我见过许多技巧和“黑客”来阅读许多不同的论点 Python程序员可以通过哪些方式实现这一点 相关的 标准库中的标准解决方案是argparse(): 以下是一个例子: from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument("-f", "--file", dest="filename", help="write rep

我原来是一名C程序员。我见过许多技巧和“黑客”来阅读许多不同的论点

Python程序员可以通过哪些方式实现这一点

相关的

    • 标准库中的标准解决方案是
      argparse
      ():

      以下是一个例子:

      from argparse import ArgumentParser
      
      parser = ArgumentParser()
      parser.add_argument("-f", "--file", dest="filename",
                          help="write report to FILE", metavar="FILE")
      parser.add_argument("-q", "--quiet",
                          action="store_false", dest="verbose", default=True,
                          help="don't print status messages to stdout")
      
      args = parser.parse_args()
      
      argparse
      支持(除其他外):

      • 任意顺序的多个选项
      • 短期和长期选择
      • 默认值
      • 生成用法帮助消息
      包含在命令行上传递给脚本的所有参数的列表
      sys.argv[0]
      是脚本名称

      基本上

      import sys
      print(sys.argv[1:])
      

      一种方法是使用
      sys.argv
      。这将打印脚本名称作为第一个参数以及传递给它的所有其他参数

      import sys
      
      for arg in sys.argv:
          print arg
      

      我喜欢stdlib的getopt,例如:

      try:
          opts, args = getopt.getopt(sys.argv[1:], 'h', ['help'])
      except getopt.GetoptError, err: 
          usage(err)
      
      for opt, arg in opts:
          if opt in ('-h', '--help'): 
              usage()
      
      if len(args) != 1:
          usage("specify thing...")
      
      最近,我一直在包装一些类似于此的东西,以使事情不那么冗长(例如,使“-h”隐式)。

      还有(stdlib的
      optpasse
      模块上的“改进”)。示例来自:

      用法:

      $ script.py 1 2 3 4
      4
      
      $ script.py --sum 1 2 3 4
      10
      

      我自己也使用optparse,但真的很喜欢Simon Willison最近引入的库的方向。其工作原理如下:

      “反思一个函数 定义(包括其参数) 以及它们的默认值)并使用 该命令用于构造命令行 参数分析器。”

      例如,此函数定义:

      def geocode(s, api_key='', geocoder='google', list_geocoders=False):
      
      已转换为此OptPass帮助文本:

          Options:
            -h, --help            show this help message and exit
            -l, --list-geocoders
            -a API_KEY, --api-key=API_KEY
            -g GEOCODER, --geocoder=GEOCODER
      
      usage: report.py [-h] [-q] [--debug] file
      
      This function writes report.
      
      positional arguments:
        file         write report to FILE
      
      optional arguments:
        -h, --help   show this help message and exit
        -q, --quiet  don't print status messages to stdout
        --debug      set logging level to DEBUG
      

      只是到处传福音,有什么更好的理由。。基本上:

      (从链接复制)

      • argparse模块可以处理位置信息 和可选参数,而 optpass只能处理可选的 论据

      • argparse并不是教条式的 您的命令行界面是什么 应该看起来像-选项像-文件 支持或/文件,如下所示 所需选项。Optparse拒绝 支持这些功能,首选 纯粹胜于实用

      • argparse产生更多 信息性使用信息,包括 命令行使用情况由 您的参数,以及的帮助消息 位置和可选的 论据。optparse模块 要求您编写自己的用法 字符串,并且无法显示 位置参数的帮助

      • argparse支持以下操作: 消耗不同数量的 命令行参数,而optpass 要求 参数(如1、2或3)是已知的 提前

      • argparse支持 调度到子命令,而 OptPass需要设置
        允许插入参数
        并执行 解析器手动分派

      我个人最喜欢的是:

      • argparse允许类型和 将操作参数添加到
        添加参数()
        用简单的 可调用,而optpasse需要 黑客类属性,如
        存储操作
        检查方法
        以获取 正确的参数检查

      您可能会对我编写的一个小Python模块感兴趣,该模块使命令行参数的处理变得更加简单(开源和免费使用)

      正如您所看到的“optparse模块已被弃用,不会进一步开发;开发将继续使用该模块。”

      我的解决方案是。例如:

      from entrypoint2 import entrypoint
      @entrypoint
      def add(file, quiet=True): 
          ''' This function writes report.
      
          :param file: write report to FILE
          :param quiet: don't print status messages to stdout
          '''
          print file,quiet
      
      帮助文本:

          Options:
            -h, --help            show this help message and exit
            -l, --list-geocoders
            -a API_KEY, --api-key=API_KEY
            -g GEOCODER, --geocoder=GEOCODER
      
      usage: report.py [-h] [-q] [--debug] file
      
      This function writes report.
      
      positional arguments:
        file         write report to FILE
      
      optional arguments:
        -h, --help   show this help message and exit
        -q, --quiet  don't print status messages to stdout
        --debug      set logging level to DEBUG
      
      这个图书馆真的很漂亮。它根据应用程序的用法字符串构建参数dict

      例如,从docopt自述文件:

      """Naval Fate.
      
      Usage:
        naval_fate.py ship new <name>...
        naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
        naval_fate.py ship shoot <x> <y>
        naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
        naval_fate.py (-h | --help)
        naval_fate.py --version
      
      Options:
        -h --help     Show this screen.
        --version     Show version.
        --speed=<kn>  Speed in knots [default: 10].
        --moored      Moored (anchored) mine.
        --drifting    Drifting mine.
      
      """
      from docopt import docopt
      
      
      if __name__ == '__main__':
          arguments = docopt(__doc__, version='Naval Fate 2.0')
          print(arguments)
      
      海军的命运。 用法: 海军命运号新。。。 海军舰艇移动[--速度=] 海军舰艇射击 海军水雷(设置|移除)[--系泊|--漂移] 海军命运号(-h |——帮助) navalu_fate.py--版本 选项: -h--帮助显示此屏幕。 --版本显示版本。 --速度=以节为单位的速度[默认值:10]。 --停泊(锚定)的矿井。 --漂流矿。 """ 从docopt导入docopt 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': arguments=docopt(\uuuu doc\uuuu,version='2.0') 打印(参数) 我建议将其视为其他方法的简单替代方法

      docopt是一个新项目,其工作原理是解析--help用法消息,而不是要求您自己实现所有内容。您只需将您的使用信息转换为POSIX格式。

      Pocoo更直观,所需的样板文件更少,并且至少与argparse一样强大


      到目前为止,我遇到的唯一缺点是,您无法对帮助页面进行太多定制,但这通常不是一个要求,而且如果需要快速且不太灵活的页面,这似乎是一个明确的选择。

      main.py:

      import sys
      
      first_name = sys.argv[1]
      last_name = sys.argv[2]
      print("Hello " + first_name + " " + last_name)
      
      然后运行
      python main.py James Smith

      要生成以下输出:

      你好,詹姆斯·史密斯

      另一个选择是。它以argparse为基础,允许您编写以下内容:

      import argh
      
      # declaring:
      
      def echo(text):
          "Returns given word as is."
          return text
      
      def greet(name, greeting='Hello'):
          "Greets the user with given name. The greeting is customizable."
          return greeting + ', ' + name
      
      # assembling:
      
      parser = argh.ArghParser()
      parser.add_commands([echo, greet])
      
      # dispatching:
      
      if __name__ == '__main__':
          parser.dispatch()
      

      它将自动生成帮助等,您可以使用decorator提供有关arg解析工作方式的额外指导。

      同样,对于python3,您可能会发现使用扩展的Iterable解包处理可选的位置参数很方便,而无需附加依赖项:

      import argparse
      
      parser = argparse.ArgumentParser(description='Process some integers.')
      parser.add_argument('integers', metavar='N', type=int, nargs='+',
                         help='an integer for the accumulator')
      parser.add_argument('--sum', dest='accumulate', action='store_const',
                         const=sum, default=max,
                         help='sum the integers (default: find the max)')
      
      args = parser.parse_args()
      print(args.accumulate(args.integers))
      
      Assuming the Python code above is saved into a file called prog.py
      $ python prog.py -h
      
      Ref-link: https://docs.python.org/3.3/library/argparse.html
      
      try:
         _, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
      except ValueError:
         print("Not enough arguments", file=sys.stderr) # unhandled exception traceback is meaningful enough also
         exit(-1)
      
      上述
      argv
      unpack使
      arg2
      arg3
      成为“可选”-如果在
      argv
      中未指定它们,则它们将为无,而如果未指定第一个,则ValueError将为:

      Traceback (most recent call last):
        File "test.py", line 3, in <module>
          _, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
      ValueError: not enough values to unpack (expected at least 4, got 3)
      
      回溯(最近一次呼叫最后一次):
      文件“test.py”,第3行,在
      _,arg1,arg2,arg3,*.=sys.argv+[None]*2
      ValueError:没有足够的值来解包(至少需要4个,得到3个)
      
      是的,这些是最好的。因为它们是标准库的一部分,所以您可以确保它们可用且易于使用。尤其是optparse功能强大且简单。optparse是最好的之一;getopt很旧,确实应该被视为不推荐使用
      Traceback (most recent call last):
        File "test.py", line 3, in <module>
          _, arg1, arg2, arg3, *_ = sys.argv + [None] * 2
      ValueError: not enough values to unpack (expected at least 4, got 3)