如何使用argparse让用户更改现有程序的输出?

时间:2015-07-19 17:34:32

标签: python arrays command-line-interface command-line-arguments argparse

我有一个程序可以生成一个数据数组并打印出来非常好。我寻求解决方案的挑战如下:

  • 在打印之前将数据中的数据填满,例如,插入 非UTF-8字符,将字段排列错误, 更改日期格式。
  • 让用户选择" muck ups"发生。

以下是我现有程序的精简版本,其输出我希望拦截和删除:

ex_matrix = [[402, 'Mayonnaise', '0123', 2014-12-18, '(Burlington, -, -)', 1.0],
             [413, 'Peanuts', '0177', 2014-11-10, '(Place, Florida, South Afrika)', 1.0],
             [415, 'Seaweed', '0713', 2014-12-02, '(The Pub, -, Newfoundland)', 1.0]]

def print_forecasts(matrix, num_rows):
    for r in xrange(num_rows):
        print("{%s, [%s, %s, %s, %s], %s}" % (matrix[r][0], matrix[r][1],
              matrix[r][2], matrix[r][3], matrix[r][4], matrix[r][5]))
        print "# Generated using pickles_program.py \n"

def main():
    print_forecasts(ex_matrix, 3)

main()

从我读过的Python argparse tutorialPEP re. argparse和几个StackOverflow答案中,似乎argparse是这个问题的关键。这是我写的,只是试图了解argparse的工作原理:

import argparse

num_rows = 3

parser = argparse.ArgumentParser(description="base rate model: error adder")

parser.add_argument("muck2", help="muck up the population field", nargs='?')
args = parser.parse_args()
for i in xrange(num_rows):
    matrix[i][1] = "^&*#$)(*DJJJJ)"
    print matrix

将有> 10种类型的muck-up供用户选择。我想我希望用户能够对命令行说," python pickles_program.py 1 3 8 11,"或类似的东西,并且发生了肮脏的1,3,8和11,并且对于" python pickles_program.py --help"显示所有muck-up选项。

如果这是一个愚蠢的问题,我希望你能原谅我。我是Python新手,还在学习如何使用许多资源来学习这门优秀的语言,但我已经搜索过高和低的SO和Python文档 - 请相信我,如果有答案的话我的问题出在那里,对于像我这样的人来说,或者说得不够好,或者它太难找到,因为我还没有找到它。

请告知,尤其是关于如何更好/更清楚地提出我的问题!

2 个答案:

答案 0 :(得分:2)

在我看来,将“muck ups”作为旗帜而不是数字来处理会更容易。然后,您可以使用ArgParse检查是否启用了这些标志。例如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
   print "verbosity turned on"

这样,通过parser.add_argument(“argument”,action =“store_true”)添加所有“muck ups”,然后在一系列if语句下为每个“muck up”执行逻辑。

答案 1 :(得分:0)

为了你的学习目的,没有任何额外的模块就可以开始。只需直接从sys.argv开始工作即可。例如

import sys
muck_ups = []
if sys.argv[1:]:  # values beyond the program name
    muck_ups = [int(i) for i in sys.argv[1:]]
    # this will throw an error if one of the strings can't be converted to an int
    # we can refine that later

if len(muck_ups)==0:
    print('help...')
    sys.exit(1)
    # print help if they don't give you any numbers

for m in muck_ups:
    if m in [1]:
       pass # do one muckup
    elif m in [2]:
       <do another>
    elif m in [3]:
       <etc>
    else:
        print('muckup %s not found'%m)

muck_ups值不一定是数字。它们可以是字符串,你可以有别名,例如

 elif m in [1,'1','one','first']:
    ....

如果要按muck_ups值指示的顺序执行操作,请使用此类逻辑。如果您想要action1 1 in muck_ups,然后action2 if 2 in muck_ups:等,则需要使用其他逻辑。

一个简单的argparse解析器:

parser.add_argument('muck_ups', type=int, nargs='*')

会在args.muck_ups中给出相同的整数列表。如果你想添加更多的开关和选项,argparse会很有用,但对于像这样的一个参数,它没有多大区别。

argparse(及相关模块)主要是解析输入的一种方式;弄清楚用户想要做什么。它不是执行机制。并且不要因为做某些事情而感到困惑。