标签: optparse

10
推荐指数
2
解决办法
9883
查看次数

了解OptionParser

我正在尝试optparse,这是我的初始脚本.

#!/usr/bin/env python

import os, sys
from optparse import OptionParser

parser = OptionParser()
usage = "usage: %prog [options] arg1 arg2"

parser.add_option("-d", "--dir", type="string",
                  help="List of directory",
                  dest="inDir", default=".")

parser.add_option("-m", "--month", type="int",
                  help="Numeric value of the month", 
                  dest="mon")

options, arguments = parser.parse_args()

if options.inDir:
    print os.listdir(options.inDir)

if options.mon:
    print options.mon

def no_opt()
    print "No option has been given!!"
Run Code Online (Sandbox Code Playgroud)

现在,这就是我要做的事情:

  1. 如果没有给出该选项的参数,它将采用"默认"值.即myScript.py -d只列出当前目录或-m没有任何参数将当前月份作为参数.
  2. 对于"--month",只允许01到12作为参数
  3. 想要结合多个选项来执行不同的任务,即myScript.py -d this_dir -m 02与-d和-m作为个体做不同的事情.
  4. 只有在脚本没有提供选项的情况下,它才会打印" 没有选项! ".

这些可行吗?我确实访问了doc.python.org网站以获得可能的答案,但作为一个蟒蛇初学者,我发现自己迷失在页面中.非常感谢你的帮助; 提前致谢.干杯!!


更新:16/01/11 …

python optparse optionparser

10
推荐指数
1
解决办法
6万
查看次数

如何知道optparse选项是在命令行中传递还是作为默认值传递

使用python optparse.py,有没有办法计算出是从命令行还是从默认值设置了特定的选项值.

理想情况下,我希望像默认值一样使用dict,但包含实际从命令行提供的选项

我知道您可以将每个选项的值与默认值进行比较,但这不能区分通过与默认值匹配的命令行传递的值.

谢谢!


编辑

对不起我原来的措辞不是很清楚.

我有大量的脚本从批处理文件中调用.出于审计目的,我想报告正在传递的选项,以及它们是从命令行,默认还是其他方式传递到日志文件.

使用默认值可以判断选项是否与默认值匹配,但仍然不能告诉您它是否实际上是从命令行提供的.这可能是相关的:如果从命令行传递一个选项并且与默认值一致,那么如果然后更改代码中的默认值,脚本仍将获得相同的值.

对我来说,拥有一个等效的默认值是很自然的,包含实际提供的值.

为了使问题具体,在这个例子中:

>>> sys.argv = ['myscript.py','-a','xxx']
>>> import optparse
>>> parser = optparse.OptionParser()
>>> parser.add_option('-a', default = 'xxx')
>>> parser.add_option('-b', default = 'yyy')
Run Code Online (Sandbox Code Playgroud)

我如何知道从命令行传递的选项a.是手动解析命令行的唯一方法吗?

(我知道这是一个相当小的一点,但我认为如果我在optparse上遗漏了什么,那将是值得的)

再次感谢

python optparse

8
推荐指数
2
解决办法
5934
查看次数

负布尔选项 - 无论在optparse中是什么?

optparse,有一种简单的方法来定义否定选项,例如,--no-cleanup

我是这样做的,但它很麻烦且容易出错,特别是由于None检查容易忘记而遗漏:

#!/bin/env python

from __future__ import print_function
import sys
import optparse

def main(argv):
    parser = optparse.OptionParser("usage: %prog [options]")
    parser.add_option("--no-cleanup",
                      dest = "cleanup",
                      action = "store_false",
                      help = "do cleanup at end?")

    (opts, args) = parser.parse_args()

    if opts.cleanup == None:
        opts.cleanup = True

    # do stuff ...

    if opts.cleanup:
        print("Cleaning up!", file = sys.stderr)
    else:
        print("Not cleaning up", file = sys.stderr)

if __name__ == "__main__":
    main(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想这样做Getoptions::Long在Perl,在那里我可以定义一个选项cleanup为布尔,然后它会自动提供--cleanup--no-cleanup …

python optparse

8
推荐指数
1
解决办法
1654
查看次数

带引号的Python argparse参数

有什么办法可以告诉argparse不要吃引号吗?

例如,当我用引号给出一个参数时,argparse只将引号内的内容作为参数.我也想捕获引号(不必在命令行上转义它们.)

pbsnodes -x | xmlparse -t "interactive-00"
Run Code Online (Sandbox Code Playgroud)

产生

interactive-00
Run Code Online (Sandbox Code Playgroud)

我想要

"interactive-00"
Run Code Online (Sandbox Code Playgroud)

python optparse argparse

8
推荐指数
1
解决办法
6899
查看次数

Ruby optparse限制

我目前使用Python编写脚本但我希望尝试Ruby有几个原因.我查看了很多示例代码,并在上周阅读了大量文档.我所关注的一点是缺乏适当的命令行参数来解析Ruby中的库.Ruby专家,不要生我的气 - 也许我不知道.这就是我在这里的原因.

在Python中,我习惯使用argparse它在我看来简直是完美的(可能是我的需要).不幸的是,OptionParser不允许灵活性和功能argparse.

我现在特别关注以下约束:

  1. 如何制作互斥选项列表?例如,一个名为的程序的非常小的选项列表test.

    usage: test [-h] [-a | -b | -c] [-d] [filename]
    
    Run Code Online (Sandbox Code Playgroud)

    我可以编写一些代码:

    # implement a ----------------------------------------------
    opts.on( "-a", "--alpha",
             "implement alpha") do
        #...
    end
    
    Run Code Online (Sandbox Code Playgroud)

    等等.但后来,我已经没有办法让a,bc相互排斥的,除非我那些代码的置换,并做一些错误处理.例如

    test -ab #should through an error
    
    Run Code Online (Sandbox Code Playgroud)

    在Python中,我可以通过一种非常简单的方式完成此操作:

    # create an command line argument parser object
    cmd_line_parser = argparse.ArgumentParser()
    
    # create a mutually exclusive group
    cmd_line_group = cmd_line_parser.add_mutually_exclusive_group()
    
    Run Code Online (Sandbox Code Playgroud)
    1. 其次,除非我专门为这种排列编写代码-d,-a否则我无法配对.疯了吧.

    2. 我自己要写[OPTION] …

ruby python optparse command-line-arguments argparse

7
推荐指数
1
解决办法
1666
查看次数

python optparse,可选选项的默认值

这更像是一个代码设计问题.对于文件的字符串/目录/全名类型的可选选项,什么是良好的默认值?

我们假设我有这样的代码:

import optparse
parser = optparse.OptionParser()
parser.add_option('-i', '--in_dir', action = "store", default = 'n', help = 'this is an optional arg')
(options, args) = parser.parse_args()  
Run Code Online (Sandbox Code Playgroud)

然后我做:

if options.in_dir == 'n':
    print 'the user did not pass any value for the in_dir option'
else:
    print 'the user in_dir=%s' %(options.in_dir)
Run Code Online (Sandbox Code Playgroud)

基本上我想要有默认值,这意味着用户没有输入这样的选项与实际值.使用'n'是随意的,有更好的推荐吗?

python optparse

7
推荐指数
1
解决办法
5640
查看次数

在iPython Notebook中调用parse_args()时出现SystemExit:2错误

我正在学习使用Python和scikit-learn并执行以下代码块(最初来自http://scikit-learn.org/stable/auto_examples/document_classification_20newsgroups.html#example-document-classification-20newsgroups-py) iPython笔记本(使用Python 2.7):

from __future__ import print_function
from optparse import OptionParser

# parse commandline arguments
op = OptionParser()
op.add_option("--report",
              action="store_true", dest="print_report",
              help="Print a detailed classification report.")
op.add_option("--chi2_select",
              action="store", type="int", dest="select_chi2",
              help="Select some number of features using a chi-squared test")
op.add_option("--confusion_matrix",
              action="store_true", dest="print_cm",
              help="Print the confusion matrix.")
op.add_option("--top10",
              action="store_true", dest="print_top10",
              help="Print ten most discriminative terms per class"
                   " for every classifier.")
op.add_option("--all_categories",
              action="store_true", dest="all_categories",
              help="Whether to use all categories or not.")
op.add_option("--use_hashing",
              action="store_true",
              help="Use a hashing vectorizer.")
op.add_option("--n_features",
              action="store", …
Run Code Online (Sandbox Code Playgroud)

python optparse ipython-notebook

7
推荐指数
1
解决办法
4672
查看次数

argparse和optparse的子命令替代

对于子命令,argparse/optparse是否有任何直观的替代方法?他们都很糟糕 - 这是疯狂的配置或疯狂的输出.

真实世界的例子(被盗,不想要):

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(title='subcommands',
...                                    description='valid subcommands',
...                                    help='additional help')
>>> subparsers.add_parser('foo')
>>> subparsers.add_parser('bar')
>>> parser.parse_args(['-h'])
usage:  [-h] {foo,bar} ...

optional arguments:
  -h, --help  show this help message and exit

subcommands:
  valid subcommands

  {foo,bar}   additional help
Run Code Online (Sandbox Code Playgroud)

通缉:

>>> parser = cmdline.Parser(
...   tplheader='Usage: tool [command] [options]',
...   tplcommandhead='Available commands:',
...   tplfooter='Use \"tool help\" to get full list of supported commands.')
>>> parser.add('foo', help='foo.')
>>> parser.add('bar', help='bar.')
>>> parser.parse(['-h'])
Usage: tool …
Run Code Online (Sandbox Code Playgroud)

python optparse argparse

7
推荐指数
2
解决办法
2984
查看次数

optparse - 为什么可以忽略该选项的最后一个字符?使用`--file`它的行为与`--fil`相同

这是代码的简单示例:

from optparse import OptionParser

parser = OptionParser()
parser.add_option("-f", "--file", dest="filename")

(options, args) = parser.parse_args()
print options
Run Code Online (Sandbox Code Playgroud)

我已将其保存到文件并运行.有用:

$ python script.py --file some_name
{'filename': 'some_name'}
Run Code Online (Sandbox Code Playgroud)

但这是诀窍:

$ python script.py --fil some_name
{'filename': 'some_name'}
Run Code Online (Sandbox Code Playgroud)

它也适用于未声明的选项fil.为什么它以这种方式表现?

python optparse

7
推荐指数
1
解决办法
169
查看次数