解析Python命令行参数最简单、最简洁、最灵活的方法或库是什么?


当前回答

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


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

其他回答

这个答案建议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:])

选项。Query将被设置为您传递给脚本的值。

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

parser = optparse.OptionParser()

这些都是你需要的基本知识。下面是一个完整的Python脚本:

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

5行python代码告诉你基本原理。

将其保存在sample.py中,并使用

python sample.py

有一次

python sample.py --query myquery

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

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


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

Argparse代码可能比实际实现代码还要长!

这是我在大多数流行参数解析选项中发现的一个问题,如果您的参数只是适度的,那么用于记录它们的代码就会变得与它们所提供的好处不成比例地大。

对参数解析场景来说(我认为)一个相对的新来者是plac。

它与argparse做了一些公认的权衡,但使用内联文档并简单地包装main()类型函数:

def main(excel_file_path: "Path to input training file.",
     excel_sheet_name:"Name of the excel sheet containing training data including columns 'Label' and 'Description'.",
     existing_model_path: "Path to an existing model to refine."=None,
     batch_size_start: "The smallest size of any minibatch."=10.,
     batch_size_stop:  "The largest size of any minibatch."=250.,
     batch_size_step:  "The step for increase in minibatch size."=1.002,
     batch_test_steps: "Flag.  If True, show minibatch steps."=False):
"Train a Spacy (http://spacy.io/) text classification model with gold document and label data until the model nears convergence (LOSS < 0.5)."

    pass # Implementation code goes here!

if __name__ == '__main__':
    import plac; plac.call(main)

值得一提的是主机游戏。它很容易使用。看看吧:

from consoleargs import command

@command
def main(url, name=None):
  """
  :param url: Remote URL 
  :param name: File name
  """
  print """Downloading url '%r' into file '%r'""" % (url, name)

if __name__ == '__main__':
  main()

现在在控制台:

% python demo.py --help
Usage: demo.py URL [OPTIONS]

URL:    Remote URL 

Options:
    --name -n   File name

% python demo.py http://www.google.com/
Downloading url ''http://www.google.com/'' into file 'None'

% python demo.py http://www.google.com/ --name=index.html
Downloading url ''http://www.google.com/'' into file ''index.html''

轻量级命令行参数默认值

尽管argparse很棒,并且是完整文档化的命令行开关和高级特性的正确答案,但是您可以使用函数参数默认值非常简单地处理直接的位置参数。

import sys

def get_args(name='default', first='a', second=2):
    return first, int(second)

first, second = get_args(*sys.argv)
print first, second

'name'参数捕获脚本名称,但不使用。测试输出如下所示:

> ./test.py
a 2
> ./test.py A
A 2
> ./test.py A 20
A 20

对于只想要一些默认值的简单脚本,我发现这已经足够了。您可能还希望在返回值中包含一些类型强制,否则命令行值将全部为字符串。