如何在输入前获取自动完成参数?

2024-06-24 13:08:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在Ubuntu 14.04 LTS中有一个文件argComp.py。我成功地安装了argcomplete 1.0.0模块。在

chmod +x argComp.py

然后呢

^{pr2}$

我希望在用户按下ENTER之前实时读取我的参数。为此,argcomplete模块应该读取--name name1中的文本name,然后通过name1检查数据。在

我能得到数据然后做一个——地址表吗?在

我想实现这个概念文件浏览器实时。。在

请帮忙,并提前谢谢你。在


Tags: 模块文件用户namepy文本参数ubuntu
1条回答
网友
1楼 · 发布于 2024-06-24 13:08:05

很难理解你的要求,但我认为这可能是你想要的:

只有使用argparse管理命令行参数时,Argcomplete才有效。在

例如,argComp.py应该是这样的

#!/usr/bin/env python
# PYTHON_ARGCOMPLETE_OK
import argcomplete, argparse

parser = argparse.ArgumentParser(description='Test passing arguments')
parser.add_argument(' name1', metavar='NAME1', nargs=1, choices=['Korea', 'Seoul'], help="First address line")
parser.add_argument(' name2', metavar='NAME2', nargs=1, choices=['USA', 'LA'], help="Second address line")

argcomplete.autocomplete(parser)
args = parser.parse_args()

# Your code here
# Print the arguments
print(args.name1[0],"-",args.name2[0])

您可以通过键入来运行argComp.py

^{pr2}$

打印使用情况详细信息

python argComp.py -h

如果您希望它是完全动态的,可以将参数存储为json格式,然后将其作为环境变量传递

假设我们要解析以下数据(json格式)

'{"name1": {"address": ["korea", "Seoul"], "gender": ["Male","Female"]}, "name2": {"address": ["USA", "LA"]} }'

然后我们将它存储在一个环境变量中,将其命名为PY_ARGS 所以在终端:

$ PY_ARGS='{"name1": {"address": ["korea", "Seoul"], "gender": ["Male","Female"]}, "name2": {"address": ["USA", "LA"]} }'
$ export PY_ARGS

当然,您可以从任何地方设置此环境变量,即另一个程序。在

现在我们的程序argComp.py将是

import argcomplete, argparse
import os
import json

args = os.environ['PY_ARGS'] # get the environment variable

# Parse env variable to dictionary
args_dict = json.loads(args)

# create the top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subparser')

# Get keys as list
top_level_keys = list(args_dict.keys()) # [name1, name2]

for i in range(0,len(top_level_keys)):
    key = top_level_keys[i] # when i=0 name1
    sub_dict = args_dict[key] # when i=0 {"address": ["korea", "Seoul"], "gender": ["Male","Female"]}
    sub_parser = subparsers.add_parser(key)
    sub_level_keys = list(sub_dict.keys()) # when i=0 [address, gender]

    for k in range(0, len(sub_level_keys)):
        sub_key = sub_level_keys[k] # when k=0 address
        choices = sub_dict[sub_key] # when k=0 [korea, Seoul]
        sub_parser.add_argument(' '+sub_key, nargs=1, choices=choices)


argcomplete.autocomplete(parser)
args = parser.parse_args()

# Your code here
print(args)

现在我们可以运行argComp.py

$ ./argComp.py name1  gender Male
Namespace(address=None, gender=['Male'], subparser='name1')

或者有地址

$ ./argComp.py name1  gender Male  address korea
Namespace(address=['korea'], gender=['Male'], subparser='name1')

这将打印错误

$ ./argComp.py name2  gender Male  address korea
usage: argComp.py name2 [-h] [ address {USA,LA}]
argcomplete2.py name2: error: argument  address: invalid choice: 'korea' (choose from 'USA', 'LA')

帮助印刷得很好

$ ./argComp.py -h
usage: argComp.py [-h] {name1,name2} ...

positional arguments:
  {name1,name2}

optional arguments:
  -h,  help     show this help message and exit

以及

$ ./argComp.py name1 -h
usage: argComp.py name1 [-h] [ gender {Male,Female}]
                             [ address {korea,Seoul}]

optional arguments:
  -h,  help            show this help message and exit
   gender {Male,Female}
   address {korea,Seoul}

这里的技巧是从json字符串创建字典并添加subparser(s)。在

可以添加更多子级别以匹配所需的参数结构。在

相关问题 更多 >