【问题标题】:Most pythonic way of accepting arguments using optparse使用 optparse 接受参数的大多数 Pythonic 方式
【发布时间】:2012-08-26 16:26:58
【问题描述】:

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

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

$ python script.py -someflag file.txt > modified.txt 

同时仍保留当前功能。

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

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

【问题讨论】:

  • argparse 仍然是一个选项,它只是没有内置到 2.6 中。您仍然可以像任何第 3 方软件包一样安装它(例如,pip install argparse)。

标签: python arguments command-line-arguments argparse optparse


【解决方案1】:

argparse 仍然是一个选项,它只是没有内置到 2.6 中。您仍然可以像任何第 3 方软件包一样安装它(例如,使用 easy_install argparse)。

这方面的代码示例如下:

import sys
import argparse

p = argparse.ArgumentParser(description="script.py")
p.add_argument("-s", dest="string")
p.add_argument("-f", dest="infile")

args = p.parse_args()

if args.infile == None and args.string == None:
    print "Must be given either a string or a file"
    sys.exit(1)
if args.infile != None and args.string != None:
    print "Must be given either a string or a file, not both"
    sys.exit(1)
if args.infile:
    # process the input file one string at a time
if args.string:
    # process the single string

【讨论】:

  • 谢谢! 2.7之前不知道argparse是第三方的,代码是加分项。一旦有机会尝试,我可能会接受这个:)
  • 不客气。 argparse 是一个非常强大且直观的工具,我强烈推荐它。
  • 在针对None 进行测试时,使用isis not 来测试该值更加pythonic:if args.infile is None and args.string is None:if args.infile is not None and args.string is not None:
【解决方案2】:

在这里查看我的答案:What's the best way to grab/parse command line arguments passed to a Python script?

作为一个快捷方式,这里有一些示例代码:

import optparse

parser = optparse.OptionParser()

parser.add_option('-q', '--query',
    action="store", dest="query",
    help="query string", default="spam")

options, args = parser.parse_args()

print 'Query string:', options.query

【讨论】:

  • 注意:自 python 2.7 版起,不鼓励使用 optparse。 optparse 模块已弃用,不会进一步开发; argparse 模块将继续开发。请参阅PEP 0389 了解更多信息。
猜你喜欢
  • 2020-04-21
  • 2011-01-09
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2020-02-09
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多