根据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 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文件,利用sys.argv [1]在命令行接受一个字符串.然后,它对该字符串执行操作,然后将修改后的字符串返回到命令行.
我想实现一个批处理模式选项,在其中我可以提供一个字符串文件(每行一个,fwiw)并让它返回到命令行,以便我可以重定向输出做类似的事情
$ python script.py -someflag file.txt > modified.txt
Run Code Online (Sandbox Code Playgroud)
同时仍然保留当前的能力.
我只运行2.6,所以argparse不是一个选项.我看到的教程要么使用argparse,要么使用getopt,要么深入研究过于复杂/不适用的示例.
检查输入并采取适当行动的最佳方法是什么?
所以我陷入了一个我正在研究的涉及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个模块的蟒蛇叫argparse
和optparse
,但我已经很难理解这两个,我不知道,如果单独两个会完成我需要做.
python command-line optparse command-line-arguments argparse
我编写了一个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) 严格按照文档中的示例完成此错误.并且你无法在任何地方找到任何关于它的澄清,无论是长篇文档页面,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分钟.:)
是的,这意味着我知道答案,但是因为这花了我很长时间才发现我想在这里"记录"它.
我试图使用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中删除已解析的选项,但是我不知道这样做的优雅方式.有什么指针吗?
考虑以下:
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)
我这样做是否遗漏了任何隐藏的问题?如果是这样,任何人都可以建议一种替代方法来实现这一目标。
使用 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。
我正在使用 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找到了源代码,但无法从中找出答案。
我怎样才能做到这一点?
optparse ×10
python ×9
argparse ×4
arguments ×1
boolean ×1
command-line ×1
file-io ×1
flags ×1
google-oauth ×1
nameerror ×1
optionparser ×1
python-2.5 ×1
python-2.7 ×1
ruby ×1