我几天来一直在努力解决这个问题,但仍然没有一个好的解决方案。这个问题最近一直导致无用的切线,而不是提供代码,让我简单地告诉你我想要完成什么,也许这将简化解决方案。
我正在尝试运行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。
感谢您的帮助!
答案 0 :(得分:0)
使用subparsers。文档提供了一个很好的示例,说明如何使用set_defaults
指定应为每个子分析器调用的函数:
处理子命令的一种特别有效的方法是结合使用add_subparsers()方法和对set_defaults()的调用,以便每个子分析器知道它应该执行哪个Python函数。
在您的示例中,parrot
和datamine
在单独的模块中是单独的解析器,而add
和search
将分别是它们下的子分析器。例如,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
➜ ~