解析命令行参数的最佳方法是什么?

时间:2020-03-05 18:41:32  来源:igfitidea点击:

解析Python命令行参数最简单,最有趣,最灵活的方法或者库是什么?

解决方案

回答

使用标准库随附的optparse。例如:

#!/usr/bin/env python
import optparse

def main():
  p = optparse.OptionParser()
  p.add_option('--person', '-p', default="world")
  options, arguments = p.parse_args()
  print 'Hello %s' % options.person

if __name__ == '__main__':
  main()

来源:使用Python创建UNIX命令行工具

但是从python 2.7开始不推荐使用optparse,请参阅:为什么使用argparse而不是optparse?

回答

几乎每个人都在使用getopt

这是doc的示例代码:

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError:
        # print help information and exit:
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-o", "--output"):
            output = a

简而言之,这就是它的工作原理。

我们有两种选择。那些正在接受争论的人,以及那些正在
就像开关一样。

sys.argv是C语言中的char argv。与C语言一样,我们跳过第一个元素即程序名称,仅解析参数:sys.argv [1:]。

getopt.getopt将根据我们在参数中给出的规则来解析它。

这里的" ho:v"描述了简短的参数:-ONELETTER。 表示-o接受一个参数。

最后,[[" help"," output ="]描述了长参数(--MORETHANONELETTER`)。
输出后的" ="再次表示输出接受一个参数。

结果是一对夫妇(选项,参数)的列表

如果选项不接受任何参数(例如此处的--help),则arg部分为空字符串。

然后,我们通常希望在此列表上循环并测试示例中的选项名称。

回答

希望这对我们有所帮助。

from ctypes import *

def wmain(argc, argv):
    print argc
    for i in argv:
        print i
    return 0

def startup():
    size = c_int()
    ptr = windll.shell32.CommandLineToArgvW(windll.kernel32.GetCommandLineW(), byref(size))
    ref = c_wchar_p * size.value
    raw = ref.from_address(ptr)
    args = [arg for arg in raw]
    windll.kernel32.LocalFree(ptr)
    exit(wmain(len(args), args))
startup()

回答

以防万一,如果我们需要在Win32(2K,XP等)上获取unicode参数,这可能会有所帮助:

我更喜欢optparse而不是getopt。声明性很强:我们可以告诉它选项的名称以及它们应具有的效果(例如,设置一个布尔字段),然后它会根据要求将字典交给我们。

回答

http://docs.python.org/lib/module-optparse.html

这个答案建议使用" optparse",它适用于较旧的Python版本。对于Python 2.7及更高版本,argparse取代了optparse。有关更多信息,请参见此答案。

正如其他人指出的那样,我们最好使用optparse而不是getopt。 getopt几乎是标准getopt(3)C库函数的一对一映射,并且使用起来不是很容易。

optparse有点冗长,但结构更好,以后也更容易扩展。

parser.add_option('-q', '--query',
            action="store", dest="query",
            help="query string", default="spam")

这是向解析器添加选项的典型行:

这几乎可以说明一切。在处理时,它将接受-q或者--query作为选项,将参数存储在名为query的属性中,如果未指定则具有默认值。它也是自记录的,我们可以在该选项的附近声明help参数(与-h /-help一起使用时将使用该参数)。

options, args = parser.parse_args()

通常,我们使用以下方法解析参数:

默认情况下,这将解析传递给脚本的标准参数(sys.argv [1:])

然后,将options.query设置为我们传递给脚本的值。

parser = optparse.OptionParser()

我们只需执行以下操作即可创建解析器

import optparse

parser = optparse.OptionParser()

parser.add_option('-q', '--query',
    action="store", dest="query",
    help="query string", default="spam")

options, args = parser.parse_args()

print 'Query string:', options.query

这些都是我们需要的所有基础知识。这是显示此内容的完整Python脚本:

5行Python,向我们展示了基础知识。

python sample.py

将其保存在sample.py中,然后运行一次

python sample.py --query myquery

然后一次

回答

除此之外,我们会发现optparse非常容易扩展。
在我的一个项目中,我创建了一个Command类,该类使我们可以轻松地将子命令嵌套在命令树中。它大量使用optparse将命令链接在一起。这不是我可以轻松地用几行来解释的内容,但是可以随时在我的存储库中浏览主类以及使用它的类和选项解析器

from werkzeug import script

# actions go here
def action_foo(name=""):
    """action foo does foo"""
    pass

def action_bar(id=0, title="default title"):
    """action bar does bar"""
    pass

if __name__ == '__main__':
    script.run()

我认为大型项目的最佳方法是optparse,但是如果我们正在寻找一种简单的方法,那么http://werkzeug.pocoo.org/documentation/script可能是我们想要的。

python foo.py 
usage: foo.py <action> [<options>]
       foo.py --help

actions:
  bar:
    action bar does bar

    --id                          integer   0
    --title                       string    default title

  foo:
    action foo does foo

    --name                        string

回答

因此,基本上每个函数action_ *都在命令行中公开,并且很不错
免费生成帮助消息。

由于这些原因,新的髋关节方式是" argparse"。 argparse> optparse> getopt

段落数量不匹配