将 sys.argv 转换为位置 argparse 参数?
Posted
技术标签:
【中文标题】将 sys.argv 转换为位置 argparse 参数?【英文标题】:Converting sys.argv to positional argparse argument? 【发布时间】:2021-08-01 09:16:03 【问题描述】:我有一个脚本,当前同时接受 sys.argv
和 argparse
参数。我需要将sys.argv
输入更改为位置argparse
参数。我该怎么做?
脚本(不相关部分省略):
import sys
import argparse
from pathlib import Path
parser = argparse.ArgumentParser()
parser.add_argument("-ru", "--remove-unparsable", dest="remove_unparsable",
action="store_true",
help="When this option is enabled, unparsable fonts are "
"removed instead of ignored")
args, unknown = parser.parse_known_args()
def handle_path(path: Path):
if path.stem.startswith("."):
return
if path.is_dir():
for f in path.iterdir():
handle_path(f)
else:
handle_file(path)
def main():
if len(sys.argv) == 1:
print(f"Usage: sys.argv[0] [<files>]")
else:
for path in sys.argv[1:]:
if not path.startswith("-"):
handle_path(Path(path))
if __name__ == "__main__":
main()
【问题讨论】:
等等,什么?argparse
的主要目的是解析sys.argv
。你为什么还要自己处理sys.argv
?
如果您不指定其他内容,argparse
已经从 sys.argv
获取输入。
使用其中一种来修复它,而不是同时使用。
...那你为什么要看sys.argv
,而不是看unknown
? (或者,更好的是,告诉 argparse 将位置参数放入 args
内的变量中?)
该脚本之前使用了sys.argv
,我对其进行了编辑以添加argparse
参数。但是,脚本的原作者希望我将 sys.argv
输入转换为 argparse
以便他们接受我的公关。
【参考方案1】:
您可以执行以下操作:
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-ru", "--remove-unparsable", dest="remove_unparsable",
action="store_true",
help="When this option is enabled, unparsable fonts are "
"removed instead of ignored")
parser.add_argument("files", nargs="+")
args, unknown = parser.parse_known_intermixed_args()
for path in args.files:
handle_path(Path(path))
这里,ArgumentParser.parse_known_intermixed_args
处理位置files
参数,它可以与命名参数混合,例如-ru
和未知参数。 nargs="+"
参数指定必须至少存在一个文件。
【讨论】:
以上是关于将 sys.argv 转换为位置 argparse 参数?的主要内容,如果未能解决你的问题,请参考以下文章
python - 如何将python argparse与sys.argv以外的args一起使用?
Pyspark 和使用 UDF:如何将 Python 参数(sys.argv、argparse)传递给 Python Worker?
argparse:“sys.argv[1]”和“args.input”有啥区别?