我正在尝试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)
现在,这就是我要做的事情:
myScript.py -d只列出当前目录或-m没有任何参数将当前月份作为参数.myScript.py -d this_dir -m 02与-d和-m作为个体做不同的事情.这些可行吗?我确实访问了doc.python.org网站以获得可能的答案,但作为一个蟒蛇初学者,我发现自己迷失在页面中.非常感谢你的帮助; 提前致谢.干杯!!
使用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上遗漏了什么,那将是值得的)
再次感谢
有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 …
有什么办法可以告诉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编写脚本但我希望尝试Ruby有几个原因.我查看了很多示例代码,并在上周阅读了大量文档.我所关注的一点是缺乏适当的命令行参数来解析Ruby中的库.Ruby专家,不要生我的气 - 也许我不知道.这就是我在这里的原因.
在Python中,我习惯使用argparse它在我看来简直是完美的(可能是我的需要).不幸的是,OptionParser不允许灵活性和功能argparse.
我现在特别关注以下约束:
如何制作互斥选项列表?例如,一个名为的程序的非常小的选项列表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,b并c相互排斥的,除非我那些代码的置换,并做一些错误处理.例如
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)
其次,除非我专门为这种排列编写代码-d,-a否则我无法配对.疯了吧.
我自己要写[OPTION] …
这更像是一个代码设计问题.对于文件的字符串/目录/全名类型的可选选项,什么是良好的默认值?
我们假设我有这样的代码:
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和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) 对于子命令,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) 这是代码的简单示例:
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.为什么它以这种方式表现?