Python3 argparse

时间:2017-05-15 23:53:04

标签: python python-3.x argparse

我几天来一直在努力解决这个问题,但仍然没有一个好的解决方案。这个问题最近一直导致无用的切线,而不是提供代码,让我简单地告诉你我想要完成什么,也许这将简化解决方案。

我正在尝试运行python程序,同时输入一些变量来控制程序的功能。请允许我举一个具体的例子。

语法结构示例

f = open('file.txt')
new_file = f.read().splitlines()

words = [i for i in f if len(i) == 20]

f.close()

通用语法示例

program_name function_to_run variable_1 variable_2 variable_n

另一个例子

parrot add "Mr Fluffy" "Red" "15oz"

所以扩展这些例子。第一个节目" parrot"有一个添加功能。运行程序并从命令行使用add函数时,程序需要三个变量(名称,颜色,重量)。在第二个例子中,程序名为" datamine"有一个名为" search"需要一个字符串(搜索词)。这个想法是,程序(数据)例如将有几个可以使用的功能。也许"添加","搜索","删除"都是例子,每个都有不同的预期变量。使用datamine帮助会列出每个函数以及所需的和/或可选的组件。

使用argparse,我还没有找到一个有效的实现。根据过去的经验,我认为解决方案将涉及使用自定义操作。有人可以帮忙解决一些示例代码吗?我顺便使用Python 3。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

使用subparsers。文档提供了一个很好的示例,说明如何使用set_defaults指定应为每个子分析器调用的函数:

  

处理子命令的一种特别有效的方法是结合使用add_subparsers()方法和对set_defaults()的调用,以便每个子分析器知道它应该执行哪个Python函数。

在您的示例中,parrotdatamine在单独的模块中是单独的解析器,而addsearch将分别是它们下的子分析器。例如,datamine模块看起来像这样:

#!/usr/bin/env python
# datamine

def add(a, b):
     print(a + b)

def search(query, search_all=True):
     run_my_search_app(query, search_all=search_all)

if __name__ == '__main__':
    # create the top-level parser
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    # create the parser for the "add" command
    parser_add = subparsers.add_parser('add')
    parser_add.add_argument('-a', type=int, default=1)
    parser_add.add_argument('-b', type=int, default=2)
    parser_add.set_defaults(func=add)

    # create the parser for the "search" command
    parser_search = subparsers.add_parser('search')
    parser_search.add_argument('query')
    parser_search.add_argument('--search-all', action='store_true')
    parser_search.set_defaults(func=search)

    args = parser.parse_args()
    args = vars(args)
    func = args.pop("func")
    func(**args)

如果此文件在您的shell中可执行datamine,则可以执行以下操作:

datamine add -a 11 -b 5
datamine search foo --search-all

答案 1 :(得分:0)

如果没有可选标记,您不需要任何花哨的东西 - 只需直接查看sys.argv

import sys

def my_add(*args):
    print( ','.join(args))

def my_search(*args):
    print(args)

fn_map = {"add": my_add, "search": my_search}

if sys.argv[1:]:
    fn = fn_map[sys.argv[1]]
    rest = sys.argv[2:]
    fn(*rest)

样本运行

1951:~/mypy$ python stack43990444.py 
1951:~/mypy$ python stack43990444.py add "Mr Fluffy" "Red" "15oz"
Mr Fluffy,Red,15oz
1951:~/mypy$ python stack43990444.py search "Chris"
('Chris',)

答案 2 :(得分:0)

使用subparsers从您的parrot示例中完全功能性地推断代码。数据集(由此代码创建)和底部的用法示例。 注意,示例集并不严格包含鹦鹉

#!/usr/bin/env python3
import argparse
import json


def add_parrot(name, weight, kind, **kwargs):
    print("Adding {} of type {} and size {}".format(name, kind, weight))
    with open('parrots.json', 'r') as parrotdb:
        parrots = json.load(parrotdb)
    parrots.append({'name': name, 'weight': weight, 'type': kind})
    with open('parrots.json', 'w') as parrotdb:
        json.dump(parrots, parrotdb)


def delete_parrot(name, **kwargs):
    print("Uh oh!  What happened to {}?".format(name))
    with open('parrots.json', 'r') as parrotdb:
        parrots = json.load(parrotdb)
    parrots[:] = [p for p in parrots if p.get('name') != name]
    with open('parrots.json', 'w') as parrotdb:
        json.dump(parrots, parrotdb)


def show_parrots(name=None, weight=0, kind=None, **kwargs):
    with open('parrots.json', 'r') as parrotdb:
        parrots = json.load(parrotdb)
    for p in parrots:
        if (name or weight or kind):
            if name in p['name'] or weight == p['weight'] or kind == p['type']:
                print("{}\t{}\t{}".format(
                    p['name'], p['weight'], p['type']))
        else:
            print("{}\t{}\t{}".format(p['name'], p['weight'], p['type']))


parser = argparse.ArgumentParser(description="Manage Parrots")
subparsers = parser.add_subparsers()
add_parser = subparsers.add_parser('insert', aliases=['add', 'a'])
add_parser.add_argument('name')
add_parser.add_argument('weight', type=int)
add_parser.add_argument('kind')
add_parser.set_defaults(func=add_parrot)

del_parser = subparsers.add_parser("delete", aliases=['del', 'd'])
del_parser.add_argument('name')
del_parser.set_defaults(func=delete_parrot)

ls_parser = subparsers.add_parser('list', aliases=['show', 'ls'])
ls_parser.add_argument('--name')
ls_parser.add_argument('--size', type=int)
ls_parser.add_argument('--type', dest='kind')
ls_parser.set_defaults(func=show_parrots)


args = parser.parse_args()
args.func(**vars(args))

数据集和用法示例:

➜  ~ cat parrots.json
[{"name": "tweety", "weight": 4, "type": "yellow"}, {"name": "donald", "weight": 18, "type": "white"}, {"name": "daffy", "weight": 12, "type": "black"}]
➜  ~ ./parrot.py ls
tweety  4   yellow
donald  18  white
daffy   12  black
➜  ~ ./parrot.py ls --name tweety
tweety  4   yellow
➜  ~ ./parrot.py delete tweety
Uh oh!  What happened to tweety?
➜  ~ ./parrot.py ls --name tweety
➜  ~