标签: optparse

使用Python的optparse模块时如何遵守PEP 257文档字符串?

根据PEP 257,命令行脚本的docstring应该是它的用法消息.

脚本(独立程序)的docstring应该可用作其"用法"消息,当使用不正确或缺少的参数(或者可能使用"-h"选项,"help")调用脚本时打印.这样的docstring应记录脚本的功能和命令行语法,环境变量和文件.用法消息可以相当复杂(几个屏幕已满),并且应该足以让新用户正确使用该命令,以及对复杂用户的所有选项和参数的完整快速参考.

所以我的docstring看起来像这样:

<tool name> <copyright info>

Usage: <prog name> [options] [args]

some text explaining the usage...

Options:
  -h, --help  show this help message and exit
   ...

现在我想使用optparse模块.optparse生成"选项"部分和解释命令行语法的"用法":

from optparse import OptionParser

if __name__ == "__main__":
    parser = OptionParser()
    (options, args) = parser.parse_args() 
Run Code Online (Sandbox Code Playgroud)

因此,使用"-h"标志调用脚本将打印:

Usage: script.py [options]

Options:
    -h, --help  show this help message and exit

这可以修改如下:

parser = OptionParser(usage="Usage: %prog [options] [args]",
                      description="some text explaining the usage...")
Run Code Online (Sandbox Code Playgroud)

结果

Usage: script.py [options] [args]

some text explaining the …

python optparse

5
推荐指数
2
解决办法
1480
查看次数

在python中将命令行参数作为元组获取

这是我想如何调用我的脚本的示例:

python script.py -f file1.txt "string1" "string2" -f file2.txt "string3" "string4"
Run Code Online (Sandbox Code Playgroud)

作为输入的每个文件将有2个与该文件关联的字符串.可以有任意数量的文件.

为了简化,我试图获得这样的打印:

('file1.txt', 'string1', 'string2')
('file2.txt', 'string3', 'string4')
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

import sys, os, traceback, optparse
import time
import re
#from pexpect import run, spawn

def main ():
    global options, args

    print options.filename

    #for filename in options.filename:
    #  print filename
      #f = file(filename,'r')
      #for line in f:
      #  print line,
      #f.close()



if __name__ == '__main__':
    try:
        start_time = time.time()
        parser = optparse.OptionParser(formatter=optparse.TitledHelpFormatter(), usage=globals()['__doc__'], version='$Id$')
        parser.add_option ('-f', '--file', dest='filename', help='write report to …
Run Code Online (Sandbox Code Playgroud)

python optparse command-line-arguments

5
推荐指数
1
解决办法
6406
查看次数

使用optparse接受参数的大多数pythonic方式

我目前有一个python文件,利用sys.argv [1]在命令行接受一个字符串.然后,它对该字符串执行操作,然后将修改后的字符串返回到命令行.

我想实现一个批处理模式选项,在其中我可以提供一个字符串文件(每行一个,fwiw)并让它返回到命令行,以便我可以重定向输出做类似的事情

$ python script.py -someflag file.txt > modified.txt 
Run Code Online (Sandbox Code Playgroud)

同时仍然保留当前的能力.

我只运行2.6,所以argparse不是一个选项.我看到的教程要么使用argparse,要么使用getopt,要么深入研究过于复杂/不适用的示例.

检查输入并采取适当行动的最佳方法是什么?

python arguments optparse command-line-arguments argparse

5
推荐指数
1
解决办法
4346
查看次数

Python命令行参数:调用函数

所以我陷入了一个我正在研究的涉及python命令行的项目.

基本上,这就是我想要完成的事情:

我在课堂上有一套功能,比方说,

def do_option1(self, param1, param2) :
    #some python code here

def do_option2(self, param1): 
    #some python code here

def do_option3(self, param1, param2, param3):
    #some python code here
Run Code Online (Sandbox Code Playgroud)

基本上,当用户filename.py option2 param1进入命令行时,我希望它调用该函数do_option2并将参数传递param1给它.

类似地,当用户放置时filename.py option3 param1 param2 param3,我希望它使用给定的参数执行do_option3函数.

我知道有2个模块的蟒蛇叫argparseoptparse,但我已经很难理解这两个,我不知道,如果单独两个会完成我需要做.

python command-line optparse command-line-arguments argparse

5
推荐指数
2
解决办法
9110
查看次数

导入的python模块覆盖选项解析器

我编写了一个python实用程序脚本,它使用optparse在脚本启动时包含选项和标志.

一切都很好,但是当我导入谷歌API oauth2client并运行它的执行功能时,它会覆盖我add_options使用的选项.

当我说'覆盖'时,我的意思是即使我的脚本向我的选项解析器添加选项,当我执行脚本时:

./myscript --help
Run Code Online (Sandbox Code Playgroud)

我得到了我添加到脚本中的选项的详细响应:

Usage: myscript [options]

Options:
    -h, --help            show this help message and exit
    -u USER, --user=USER  resources owned by this username
Run Code Online (Sandbox Code Playgroud)

但是,当我实际执行我的脚本时:

./myscript --user myuser
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

usage: smyscript [-h] [--auth_host_name AUTH_HOST_NAME]
               [--noauth_local_webserver]
               [--auth_host_port [AUTH_HOST_PORT     
               [AUTH_HOST_PORT  ...]]]
               [--logging_level 
               {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
 myscript: error: unrecognized arguments: --user myuser
Run Code Online (Sandbox Code Playgroud)

另一个要知道的重要事情是我正在使用我自己的模块包装oauth2client,如下所示:

import oauth2client
import argparse

def execute():

    parser = argparse.ArgumentParser(
            description=__doc__,
            formatter_class=argparse.RawDescriptionHelpFormatter,
            parents=[tools.argparser])
            # don't use any flags                                                                           
    flags = parser.parse_args(None)

    flow = client.flow_from_clientsecrets(
             client_secret_path,
             scope=scope_path,
             message=tools.message_if_missing(client_secret))
    # …
Run Code Online (Sandbox Code Playgroud)

python optparse argparse google-oauth

5
推荐指数
1
解决办法
1155
查看次数

名称'OptionGroup'未定义

严格按照文档中的示例完成此错误.并且你无法在任何地方找到任何关于它的澄清,无论是长篇文档页面,google还是stackoverflow.另外,阅读optparse.py显示OptionGroup在那里,这增加了混乱.

Python 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
>>> from optparse import OptionParser
>>> outputGroup = OptionGroup(parser, 'Output handling')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'OptionGroup' is not defined
Run Code Online (Sandbox Code Playgroud)

我敢打赌,有人发现我的错误不到1分钟.:)

是的,这意味着我知道答案,但是因为这花了我很长时间才发现我想在这里"记录"它.

python optparse nameerror

4
推荐指数
1
解决办法
2156
查看次数

从sys.argv中删除已解析的选项及其值

我试图使用optparse(解析我的脚本的命令行选项)和fileinput(以便通过管道或文件提供数据输入的灵活性).

import optparse, fileinput

parser = OptionParser()    
parser.add_option("-v", action="store_true", dest="verbose")
(options, args) = parser.parse_args()

for line in fileinput.input:
     process(line)
Run Code Online (Sandbox Code Playgroud)

但是fileinput尝试使用'-v'选项以及文件名导致'没有这样的文件或目录错误'.所以要么我需要创建fileinput args,要么从sys.argv中删除已解析的选项,但是我不知道这样做的优雅方式.有什么指针吗?

python file-io optparse python-2.5

4
推荐指数
1
解决办法
2142
查看次数

在 python 中使用 optparse 时抑制帮助中的选项之一

考虑以下:

parser.add_option("-f", "--file", "--secret", action = "append", type = "string", dest = "filename", default = [], help = "specify the files")
Run Code Online (Sandbox Code Playgroud)

我想在调用帮助时向用户隐藏 --secret 选项。我可以通过以下方式做到这一点吗?

parser.add_option("-f", "--file", action = "append", type = "string", dest = "filename", default = [], help = "specify the files")
parser.add_option("--secret", action = "append", type = "string", dest = "filename", default = [], help = "specify the files")
Run Code Online (Sandbox Code Playgroud)

我这样做是否遗漏了任何隐藏的问题?如果是这样,任何人都可以建议一种替代方法来实现这一目标。

python optparse

4
推荐指数
1
解决办法
2246
查看次数

将 optparse 转换为 argparse

使用 optparse,我目前有:

opts, args = parser.parse_args(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

然后将其输入到接受 opts 的函数中:

func(opts,sys.argv)
Run Code Online (Sandbox Code Playgroud)

我现在尝试使用 argparse,但 argparse 的格式不同:

args = parser.parse_args(sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

这不允许我将选项输入到函数中。

我想知道是否有任何方法可以使用 argparse,同时保持选择输入到函数中。

我正在使用Python 2.7。

python optparse python-2.7 argparse

4
推荐指数
1
解决办法
4484
查看次数

布尔选项的 Ruby OptionParser 短代码?

我正在使用 Ruby 的 OptionParser ( require 'optparse') 处理一个“详细”选项,该选项可以是 true 也可以是 false。它在代码中是这样的:

  parser.on('-v', '--[no-]verbose', 'Verbose mode') do |v|
    self.verbose = v
  end
Run Code Online (Sandbox Code Playgroud)

我支持在环境变量中指定选项(我将其内容添加到 ARGV),因此可以在该环境变量中设置详细模式,并在命令行上使用--no-verbose. 但是,我找不到用简短选项覆盖它的方法。我试过这些没有成功:

-v-
-v0
-v=0
Run Code Online (Sandbox Code Playgroud)

我在https://github.com/ruby/ruby/blob/trunk/lib/optparse.rb找到了源代码,但无法从中找出答案。

我怎样才能做到这一点?

ruby flags boolean optparse optionparser

4
推荐指数
1
解决办法
1493
查看次数