4

我目前正在学习如何使用 Python optparse 模块。我正在尝试以下示例脚本,但 args 变量为空。我使用 Python 2.5 和 2.6 进行了尝试,但无济于事。

import optparse

def main():
  p = optparse.OptionParser()
  p.add_option('--person', '-p', action='store', dest='person', default='Me')
  options, args = p.parse_args()

  print '\n[Debug]: Print options:', options
  print '\n[Debug]: Print args:', args
  print

  if len(args) != 1:
    p.print_help()
  else:
    print 'Hello %s' % options.person

if __name__ == '__main__':
  main() 

输出:

>C:\Scripts\example>hello.py -p Kelvin

[Debug]: Print options: {'person': 'Kelvin'}

[Debug]: Print args: []

Usage: hello.py [options]

选项:-h、--help 显示此帮助信息并退出 -p PERSON、--person=PERSON

4

4 回答 4

7

args变量包含任何未分配给选项的参数。Kelvin通过分配给person选项变量,您的代码确实可以正常工作。

如果你尝试运行hello.py -p Kelvin file1.txt,你会发现它person仍然被赋值"Kelvin",然后你args会包含"file1.txt".

另请参阅以下文档optparse

parse_args() 返回两个值:

  • options, 一个包含所有选项值的对象 - 例如,如果--file采用单个字符串参数,options.file则将是用户提供的文件名,或者None如果用户没有提供该选项
  • args, 解析选项后剩余的位置参数列表
于 2010-04-21T16:31:57.070 回答
1

根据optparse帮助:

“成功时返回一对 (values, args),其中 'values' 是一个 Values 实例(包含所有选项值),而 'args' 是解析选项后剩余的参数列表。”

尝试hello.py -p Kelving abcd- 'Kelvin' 将由 optparse 解析,'abcd' 将落在args由返回的变量中parse_args

于 2010-04-21T16:37:39.240 回答
0

注意:“选项”是包含您添加的选项的字典。“Args”是一个包含未解析参数的列表。你不应该看长度“args”。这里有一个成绩单来说明:

moshez-mb:profile administrator$ cat foo
import optparse

def main():
    p = optparse.OptionParser()
    p.add_option('--person', '-p', action='store', dest='person', default='Me')
    options, args = p.parse_args()
    print '\n[Debug]: Print options:', options
    print '\n[Debug]: Print args:', args
    print
    if len(args) != 1:
        p.print_help()
    else:
        print 'Hello %s' % options.person

if __name__ == '__main__':
    main()
moshez-mb:profile administrator$ python foo

[Debug]: Print options: {'person': 'Me'}

[Debug]: Print args: []

Usage: foo [options]

Options:
  -h, --help            show this help message and exit
  -p PERSON, --person=PERSON
moshez-mb:profile administrator$ python foo -p Moshe

[Debug]: Print options: {'person': 'Moshe'}

[Debug]: Print args: []

Usage: foo [options]

Options:
  -h, --help            show this help message and exit
  -p PERSON, --person=PERSON
moshez-mb:profile administrator$ python foo -p Moshe argument

[Debug]: Print options: {'person': 'Moshe'}

[Debug]: Print args: ['argument']

Hello Moshe
moshez-mb:profile administrator$ 
于 2010-04-21T16:36:42.127 回答
0
import ast

(options, args) = parser.parse_args()
noargs = ast.literal_eval(options.__str__()).keys()
if len(noargs) != 1:
    parser.error("ERROR: INCORRECT NUMBER OF ARGUMENTS")
    sys.exit(1)
于 2014-10-31T12:05:47.337 回答