我试图在输入 -a 时通过 argparse 调用函数 addPXT。它不这样做。阅读另一个问题,addPXT 不在冒号中,尝试说 addPXT 不可调用。
parser = argparse.ArgumentParser()
parser.add_argument('-a' ,action='store_const' ,const='addPXT')
results = parser.parse_args()
def addPXT():
print "hello"
Run Code Online (Sandbox Code Playgroud)
python script.py -a
Run Code Online (Sandbox Code Playgroud) 当我在 python3 中使用 arparse 时,我发现了一些奇怪的事情。
#!/usr/bin/env python3
import argparse
def create_parser():
p = argparse.ArgumentParser(add_help=True)
p.add_argument('-i', help='i parameter', required=True)
p.add_argument('-m', help='m parameter', required=True)
return p
if __name__ == '__main__':
p = create_parser()
n = p.parse_args()
print(n)
Run Code Online (Sandbox Code Playgroud)
当我尝试启动它时
python3 ./script.py -i ./some_folder/some_file -m ./
Run Code Online (Sandbox Code Playgroud)
bash 自动完成与“-i”参数一起工作,但不能与“-m”一起工作。例如,如果我将“-m”重命名为“-me”,则一切正常。
在 bash 中,我尝试使用“-m”参数启动其他命令,但它不仅适用于 argparse。这里哪里会出错?
我试图在argparse. 但是,我有两个问题:
search(不是必需的)使用位置参数。理想情况下,我认为'search'是主要功能。因此,我希望它的参数是位置性的;虽然,search是不是必需的。但是,至少需要以下一项: search, --name, --list, --add, --import, --encrypt, --decrypt, --delete-database, --rename-database, --backup
另外,--name是不是相互排斥的选项,它是那种多用途:
-n myfirstdb --decrypt--name不存在,我假设最近访问的数据库。目前,我必须运行一个开始变得繁重的检查,以查看是否调用了任何主要选项,并测试是否--name存在。
最后,显然互斥的选项不能一起使用。
我怎样才能search成为这个必需的互斥群体的一部分?我怎样才能成为--name这个必需的组中的一个,但又不与其中任何一个互斥?
我正在试验子解析器,但我不确定它们是否能解决我的问题。任何建议都可能为我节省几天的反复试验时间,非常感谢。
parser.add_argument(
'search', nargs='*', type=str, metavar='S', help='search [field] for string(s)')
parser.add_argument(
'--name', '-n', type=str, help='name of the database; created if does not exist')
main_ex_group = parser.add_argument_group(
title='main functions').add_mutually_exclusive_group()
main_ex_group.add_argument(
'--list', '-l', action='store_true', help='list …Run Code Online (Sandbox Code Playgroud) python command-line command-line-arguments argparse python-3.x
假设我创建了一个带有参数默认值的解析器,然后给它一个带有参数默认值的子解析器。
In [1]: parser = argparse.ArgumentParser(description='test')
In [2]: parser.add_argument("--test", dest="test", default="hello")
Out[2]: _StoreAction(option_strings=['--test'], dest='test', nargs=None, const=None, default='hello', type=None, choices=None, help=None, metavar=None)
In [3]: parser.get_default("test")
Out[3]: 'hello'
In [4]: subparsers = parser.add_subparsers(dest="command")
In [5]: parser_other = subparsers.add_parser("other")
In [6]: parser_other.add_argument("--other-test", dest="other_test", default="world")
Out[6]: _StoreAction(option_strings=['--other-test'], dest='other_test', nargs=None, const=None, default='world', type=None, choices=None, help=None, metavar=None)
In [7]: parser_other.get_default("other_test")
Out[7]: 'world'
Run Code Online (Sandbox Code Playgroud)
这一切都很好。但是假设我有一个函数parser从上面创建并返回父解析器,但不能直接访问子解析器。
我怎样才能打印出子解析器参数的默认值?或者分别获取每个子解析器的句柄?
In [8]: parser._subparsers._defaults
Out[8]: {}
In [9]: parser._subparsers.get_default("other_test") # is None
Run Code Online (Sandbox Code Playgroud)
似乎没有从任何更多的属性或方法,parser._subparsers或parser可能显示的默认值。
总体问题是:当您只有父解析器的句柄时,如何以编程方式访问子解析器默认值?
我有一个需要多个参数的程序,例如
breakfast.py --customer=vikings eggs sausage bacon
Run Code Online (Sandbox Code Playgroud)
其中“鸡蛋”、“香肠”和“培根”可以从特定选项列表中指定。
现在我喜欢这样的输出breakfast.py --help:
usage: breakfast.py [-h] [--customer CUSTOMER] INGREDIENT [INGREDIENT ...]
positional arguments:
your choice of ingredients:
bacon Lovely bacon
egg The runny kind
sausage Just a roll
spam Glorious SPAM
tomato Sliced and diced
optional arguments:
-h, --help show this help message and exit
--customer CUSTOMER salutation for addressing the customer
Run Code Online (Sandbox Code Playgroud)
我尝试了两种方法,但到目前为止都失败了。
使用参数选择:
import argparse
parser = argparse.ArgumentParser()
toppings = {
'bacon': "Lovely bacon",
'egg': 'The runny kind',
'sausage': 'Just a …Run Code Online (Sandbox Code Playgroud) 我正在使用 python 3.7.4,这是我的代码,但它不起作用。这是python写的ssrf扫描器,我刚开始学习'argparse'所以不知道代码有什么问题:
import sys
import argparse
error = "Please enter a valid command. If you don't know how to use, enter '--help'"
parser = argparse.ArgumentParser(version='1.0')
parser.add_argument('-u', help='URL', dest='url')
parser.add_argument('--get', help='Method GET', dest='get')
parser.add_argument('--post', help='Method POST', dest='post')
parser.add_argument('-i', help='Ip', dest='ip')
parser.add_argument('-p', help='Port', dest='port')
parser.add_argument('-d', help='Post data', dest='param')
parser.add_argument('--encode', help='Encode payloads', dest='encode')
parser.add_argument('--proxy', help='Use proxy(y|ies)',
dest='proxy', action='store_true')
parser.add_argument('-f', help='Load payloads from a file', dest='file')
parser.add_argument('-h', help='Add headers',
dest='header', const=True)
parser.add_argument('--white', help='Whitelist', dest='wlist')
parser.add_argument('--black', help='Blacklist', dest='blist')
url = args.url
get = args.get …Run Code Online (Sandbox Code Playgroud) 每当我使用时parser.parse_args(),内核就会崩溃。例如:
import argparse
import numpy as np
parser = argparse.ArgumentParser()
parser.add_argument("--return_counts", type=bool, default=True)
opt = parser.parse_args()
arr = np.random.randint(0, 10, 100)
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误:
用法:pydevconsole.py [-h] [--return_counts RETURN_COUNTS]
pydevconsole.py:错误:无法识别的参数:--mode=client --port=52085
但是,如果我使用parser.parse_known_args(),它会起作用。
import argparse
import numpy as np
parser = argparse.ArgumentParser()
parser.add_argument("--return_counts", type=bool, default=True)
opt, unknown = parser.parse_known_args()
arr = np.random.randint(0, 10, 100)
Run Code Online (Sandbox Code Playgroud)
它有效,并opt给出了这个:
print(opt)
Out[3]: Namespace(return_counts=True)
Run Code Online (Sandbox Code Playgroud)
并unknown给出了这个:
Out[4]: ['--mode=client', '--port=52162']
Run Code Online (Sandbox Code Playgroud)
有人可以解释这背后的巫术吗?
我使用 argparse 和 eval 来更改日志记录的日志级别。
parser = argparse.ArgumentParser(
description="Adds New Location to the Snipe-IT Server")
parser.add_argument('-l', '--loglevel', type=str, default='WARNING', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'])
args = parser.parse_args()
logging.basicConfig(level=eval(f"logging.{args.loglevel}"))
Run Code Online (Sandbox Code Playgroud)
我想知道在这种情况下使用 eval 是否可以节省?我不知道在这种情况下选择是否会限制输入。
让我们有一个简单的 argparser,其中一个参数代表 URL。
from argparse import ArgumentParser
def my_url(arg):
"""
Some url validation
"""
parser = ArgumentParser(
description="foobar"
)
parser.add_argument(
"-u",
"--url",
type=my_url,
help="foobar",
)
Run Code Online (Sandbox Code Playgroud)
是否准备好接受函数来验证参数是否为 URL,以便省略my_url自定义验证函数?
我有一个 Python 应用程序,它argparse使用声明的一组参数来实现:
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--arg1",
default="dev",
choices=["real", "test", "dev"],
help="arg 1"
)
parser.add_argument("--arg2", default="0", help="arg 2")
parser.add_argument(
"--arg3",
nargs="+",
default=["one", "two"],
choices=["one", "two"],
help="arg 3",
)
parser.add_argument("--arg4", action="store_true", help="arg 4")
parser.add_argument("--arg5", action="store_true", help="arg 5")
parser.add_argument("--arg6", action="store_true", help="arg 6")
parser.add_argument("--arg7", default=None, help="arg 7")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
如果我发送这些声明中未定义的参数,则会出现以下异常:
error: unrecognized arguments: arg8 value
Run Code Online (Sandbox Code Playgroud)
是否可以指示argparse接受未声明的参数?
argparse ×10
python ×8
python-3.x ×2
arguments ×1
bash ×1
command-line ×1
logging ×1
parsing ×1
python-2.7 ×1
subparsers ×1