如何在同一个 python 脚本中使用 sys 和 argparse 而不会出现无法识别的参数错误?

Posted

技术标签:

【中文标题】如何在同一个 python 脚本中使用 sys 和 argparse 而不会出现无法识别的参数错误?【英文标题】:How can I use sys and argparse in same python script without getting unrecognized argument error? 【发布时间】:2021-03-05 15:11:23 【问题描述】:

正如我的标题所暗示的,我正在使用 sys 和 argparse 将命令行参数添加到我的代码中。 Sys 用于添加 /sample/test/etc 之类的文件路径,而 argparse 用于在我的代码中添加单独的可选功能。当我只使用 argparse 时,我的代码工作得很好,但是当图片中出现 sys 时,出现以下错误:

test.py:错误:无法识别的参数:/sample/test/etc

我的代码的前几行我使用 sys 将文件路径保存到变量中:

导入系统

路径 = sys.argv[1]

无论如何我可以利用 sys 记录文件路径,同时保留我的 argparse,即 -r,稍后在代码中?

【问题讨论】:

默认情况下parse_args 使用sys.argv[1:]sys.argv[0]prog)。所以仅仅看sys.argv[1] 并不会改变argparse 看到的东西。您可以更改sys.argv,或将您自己的字符串列表作为参数传递给parse_args。另一种选择是使用parse_known_args 我认为问题在于如果 argparse 不知道位置参数(路径),它会在看到它时引发错误。我猜最好的解决方案就是用 argparse 处理所有参数(或抑制 argparse 错误)。 为什么你的解析器不能识别path 参数? (除了你没有实现它) 【参考方案1】:

您不需要使用sys.argv 来捕获路径,您可以使用argparse 处理这两个参数。如果添加不带- 前缀的参数,它将被视为强制位置参数:

import argparse

parser = argparse.ArgumentParser(description='Description')
parser.add_argument('path', help='Path')
parser.add_argument('-r', '--relative', action='store_true',
                    help='optional argument')
args = parser.parse_args()
print('path: :'.format(args.path))
print('relative: :'.format(args.relative))

用法:

myscript.py [-h] [-r] path

【讨论】:

以上是关于如何在同一个 python 脚本中使用 sys 和 argparse 而不会出现无法识别的参数错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何刷新 sys.path?

python中sys模块的argv

Python标准库之Sys模块使用详解

python 如何调用带参数的shell脚本

如何读取 sys.exit() 返回的值并将其存储在变量中

Pyspark 和使用 UDF:如何将 Python 参数(sys.argv、argparse)传递给 Python Worker?