Python3.6.6 argparse用于带有参数列表的负字符串值

时间:2018-07-26 19:43:37

标签: python-3.x argparse

我遇到了将负字符串输入argparse并导致错误的问题。我想知道是否有人想出办法解决这个问题。不幸的是,在某些情况下,我需要在字符串前面加上一个负号,因此我无法通过删除否定部分来解决此问题。

我看过其他一些stackoverflow页面,例如How to parse positional arguments with leading minus sign (negative numbers) using argparse,但对此仍然没有解决方案。我确定有人必须对此有解决方案!

这是我尝试过并正在看到的:

PyDev console: starting.
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:07:29) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
import argparse
argparser = argparse.ArgumentParser()
# arguments:
argparser.add_argument("--configfile", "--config", type=str, default=None,
                       help="A config file to parse (see src/configs/sample_config.ini for more details).")
argparser.add_argument("--starttime", "--st", type=str, default="-1h@m",
                       help="Starting time for the dump; default: one hour ago rounded to the last minute. \n"
                            "Supported structure: -[0-9]+[h,m,s]+(@[h,m,s])?; for example: -1h@m, -10h, ... OR now")
argparser.add_argument("--endtime", "--et", type=str, default="@m",
                       help="Ending time for the dump; default: current time rounded to the last minute. \n"
                            "Supported structure: -[0-9]+[h,m,s]+(@[h,m,s])?; for example: -1h@m, -10h, ... OR now")
argparser.add_argument("--indexes", "--i", type=str, nargs="+", default="-config-",
                       help="Provide one or more indexes (comma-separated with quotes around the list; "
                            "ex: \"index1, index two, index3\") to search on. Default is \"-config-\" "
                            "which means that the indeces will be gathered from file names; see the sample "
                            "config for details.")
argparser.add_argument("--format", "--f", type=str, default="csv",
                       help="Write data out to CSV file.")
import shlex
args = argparser.parse_args(shlex.split("--configfile /somepath/sample_config_test04.ini --endtime now --indexes \"index one\" index2 index3 --format csv --starttime -5h@m"))
usage: pydevconsole.py [-h] [--configfile CONFIGFILE] [--starttime STARTTIME]
                       [--endtime ENDTIME] [--indexes INDEXES [INDEXES ...]]
                       [--format FORMAT]
pydevconsole.py: error: argument --starttime/--st: expected one argument
Process finished with exit code 2

如您所见,上面的方法失败了,但是以下方法可以正常工作,所以我确定这是“-”问题:

PyDev console: starting.
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:07:29) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
import argparse
argparser = argparse.ArgumentParser()
# arguments:
argparser.add_argument("--configfile", "--config", type=str, default=None,
                       help="A config file to parse (see src/configs/sample_config.ini for more details).")
argparser.add_argument("--starttime", "--st", type=str, default="-1h@m",
                       help="Starting time for the dump; default: one hour ago rounded to the last minute. \n"
                            "Supported structure: -[0-9]+[h,m,s]+(@[h,m,s])?; for example: -1h@m, -10h, ... OR now")
argparser.add_argument("--endtime", "--et", type=str, default="@m",
                       help="Ending time for the dump; default: current time rounded to the last minute. \n"
                            "Supported structure: -[0-9]+[h,m,s]+(@[h,m,s])?; for example: -1h@m, -10h, ... OR now")
argparser.add_argument("--indexes", "--i", type=str, nargs="+", default="-config-",
                       help="Provide one or more indexes (comma-separated with quotes around the list; "
                            "ex: \"index1, index two, index3\") to search on. Default is \"-config-\" "
                            "which means that the indeces will be gathered from file names; see the sample "
                            "config for details.")
argparser.add_argument("--format", "--f", type=str, default="csv",
                       help="Write data out to CSV file.")
import shlex
args = argparser.parse_args(shlex.split("--configfile /somepath/sample_config_test04.ini --endtime now --indexes \"index one\" index2 index3 --format csv --starttime 5h@m"))
print(args)
Namespace(configfile='/somepath/sample_config_test04.ini', endtime='now', format='csv', indexes=['index one', 'index2', 'index3'], starttime='5h@m')

您可能想知道为什么我要这样调用代码;那是因为我需要对正在运行的argparse调用进行一些单元测试,因此我需要能够从命令行以及单元测试代码中对其进行调用。

如果我从命令行调用相同的代码,而在-5h @ m前面没有任何引号或\,则似乎正常,但仅适用于命令行(将其转换为\ -5h @ m)。我已经尝试了--starttime \“-5h @ m \”和--starttime \ -5h @ m,-5h @ m,'\-5h @ m'等,但是argparse似乎什么也没有接受并正确解析除了cmdl输入。

错误通常是: test.py:错误:参数--starttime /-st:预期一个参数

任何帮助将不胜感激!


更新:将输入更改为类似于-configfile = / somepath / sample_config_test04.ini -endtime = now -indexes =“索引一,索引2,索引3” -format = csv -starttime = -5h @ m似乎有效从命令行。

注意:我想保留这个答案,主要是因为另一个建议的答案有一个非常奇怪的短语标题,用Google搜索我需要的东西是我找不到的。我确实更新了问题,以反映出我也列出了其中的项目。

0 个答案:

没有答案