这是代码的简单示例:
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脚本,我希望能够从命令行调用并导入为库函数.理想情况下,命令行选项和函数应使用相同的默认值集.允许我在两个地方重用一组默认值的最佳方法是什么?
这是具有重复默认值的当前代码.
from optparse import OptionParser
def do_stuff(opt1="a", opt2="b", opt3="c"):
print opt1, opt2, opt3
if __name__ == "__main__":
parser = OptionParser()
parser.add_option("--opt1", default="a")
parser.add_option("--opt2", default="b")
parser.add_option("--opt3", default="c")
#parser.set_defaults(opt1="a")
options, args = parser.parse_args()
do_stuff(*args, **vars(options))
Run Code Online (Sandbox Code Playgroud) 当使用optparse我希望在一个选项后得到整个字符串,但我只能将它的一部分放到第一个空格.
例如:
python myprog.py --executable python someOtherProg.py
Run Code Online (Sandbox Code Playgroud)
我在'可执行'中得到的只是'python'.
是否可以使用optparse解析这些行,或者您是否必须使用argparse来执行此操作?
€:我已经尝试将其封装在"s中.但是在深入研究代码之后,我发现子进程调用无法处理参数.
带有命令行的字符串被塞入列表'args'.
args = [self.getExecutable()] + self.getArgs().split()
Run Code Online (Sandbox Code Playgroud)
就像是
"[python D:\\\workspace\\\myprog\\\src\\\myprog.py]"
Run Code Online (Sandbox Code Playgroud)
这给了我系统找不到文件异常.我用的时候
args[0]
Run Code Online (Sandbox Code Playgroud)
有用.但我放弃了可执行文件的参数.
如果第一个地方没有获得字符串,则子进程模块会从列表中构建cmdline,因此我暂时无法解释该行为.
我正在使用optparse模块进行选项/参数解析.出于向后兼容性原因,我无法使用argparse模块.如何格式化我的epilog消息以保留换行符?
在下面的例子中,我希望将epilog打印为格式化.
epi = \
"""
Examples usages:
Do something
%prog -a -b foo
Do something else
%prog -d -f -h bar
"""
parser = optparse.OptionParser(epilog=epi)
Run Code Online (Sandbox Code Playgroud) 采用以下相当标准的代码:
from optparse import OptionParser
opts = OptionParser()
opts.add_option('-f', action="store_true")
opts.add_option("-x", dest="x", type="int", default=1)
options, args = opts.parse_args()
Run Code Online (Sandbox Code Playgroud)
假设-x并且-f是互斥的:当-x和-f明确存在时,应报告错误.
如何检测是否-x明确存在?即使不是,也options列出默认值.
一种方法是避免设置我宁愿不会做的默认值,因为--help打印默认值很好.
另一种方法是检查其中sys.argv的实例-x是否有点尴尬,如果有多个名称-x(即, - long-name)并且有多对互斥选项.
它有一个优雅的解决方案吗?
我希望有这样的参数:
program dothis --additional --options
Run Code Online (Sandbox Code Playgroud)
和:
program dothat --with_this_option=value
Run Code Online (Sandbox Code Playgroud)
而且我无法理解如何做到这一点.我唯一能做的就是--在开始时使用参数.
有任何想法吗?
我已经开始认真学习Python作为我的第一门编程语言,并掌握一些算法基础知识.由于每个人都建议最好的方法是找到有用的东西,我决定用一个小脚本来管理我的存储库.
基本事项: - 启用/禁用YUM存储库 - 更改当前YUM存储库的优先级 - 添加/删除存储库
虽然解析文件并替换/添加/删除数据非常简单,但我正在努力(主要是因为可能缺乏知识)与'optparse'的单一事物......我想添加一个选项(-l)列出了当前可用的存储库...我已经创建了一个简单的函数来完成这项工作(不是非常详细的),但是我无法将它与optparse上的'-l'连接起来.任何人都可以提供如何做到这一点的例子/建议?
当前脚本是这样的:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import optparse
import ConfigParse
repo_file = "/home/nmarques/my_repos.repo"
parser = optparse.OptionParser()
parser.add_option("-e", dest="repository", help="Enable YUM repository")
parser.add_option("-d", dest="repository", help="Disable YUM repository")
parser.add_option("-l", dest="list", help="Display list of repositories", action="store_true")
(options, args) = parser.parse_args()
def list_my_repos()
# check if repository file exists, read repositories, print and exit
if os.path.exists(repo_file):
config = ConfigParser.RawConfigParser()
config.read(repo_file)
print "Found the following YUM repositories on " + …Run Code Online (Sandbox Code Playgroud) 从optparse切换到argparse后 - 我遇到了奇怪的错误.Argparse仅在不留空间时解析args:
myScript.py -oOpt
Run Code Online (Sandbox Code Playgroud)
或者给出一个等号:
myScript.py -o=Opt
Run Code Online (Sandbox Code Playgroud)
并且它不能正常工作:
myScript.py -o Opt
Run Code Online (Sandbox Code Playgroud)
这是我的argparse初始化:
#!/usr/bin/env python
# to get description use the -h flag
import argparse, os, sys
# ======================
# Python2.7 is expected:
if sys.version_info[0] != 2 or sys.version_info[1] < 7:
sys.exit('This program needs Python2.7+')
# ==========
# preambule:
desc = """Enter dirs in the current dir and makes gro out of state.cpt there."""
# parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(description=desc, version='2.3', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-w', '--workWith',
help = 'to specify a …Run Code Online (Sandbox Code Playgroud) 我正在编写一个小程序,它应该在远程服务器上执行一个命令(让我们说一个合理的愚蠢的包装器ssh [hostname] [command]).
我想这样执行它:
./floep [command]
但是,我需要不时传递某些命令行:
./floep -v [command]
所以我决定使用optparse.OptionParser.问题是,我有时命令也有参数,如果我这样做,它可以正常工作:
./floep -v "uname -a"
但我也希望它在我使用时起作用:
./floep -v uname -a
我的想法是,只要我遇到第一个非选项参数,之后的所有内容都应该成为我命令的一部分.
然而,这给了我:
Usage: floep [options] floep: error: no such option: -a
OptionParser是否支持此语法?如果是这样:怎么样?如果不是:解决这个问题的最佳方法是什么?
我试图optparse更好地了解,但我很难理解为什么以下代码的行为方式.我做了些蠢事吗?
import optparse
def store_test(option, opt_str, value, parser, args=None, kwargs=None):
print 'opt_str:', opt_str
print 'value:', value
op = optparse.OptionParser()
op.add_option('-t', '--test', action='callback', callback=store_test, default='test',
dest='test', help='test!')
(opts, args) = op.parse_args(['test.py', '-t', 'foo'])
print
print 'opts:'
print opts
print 'args:'
print args
Run Code Online (Sandbox Code Playgroud)
输出:
opt_str: -t
value: None
opts:
{'test': 'test'}
args:
['foo']
为什么'foo'不被传递给store_test()而是被解释为额外的参数?有什么问题op.parse_args(['-t', 'foo'])吗?
编辑:
以下是文档中的示例:
def store_value(option, opt_str, value, parser):
setattr(parser.values, option.dest, value)
[...]
parser.add_option("--foo",
action="callback", callback=store_value,
type="int", nargs=3, dest="foo")
Run Code Online (Sandbox Code Playgroud)