将 sys.argv 转换为位置 argparse 参数?

Posted

技术标签:

【中文标题】将 sys.argv 转换为位置 argparse 参数?【英文标题】:Converting sys.argv to positional argparse argument? 【发布时间】:2021-08-01 09:16:03 【问题描述】:

我有一个脚本,当前同时接受 sys.argvargparse 参数。我需要将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”有啥区别?

如何在 sys.argv 存在的情况下使用 argparse

python使用argparse解析命令行参数

python- sys.argv CLI 参数的帮助程序列表