使用预先生成的输入自动化python argparse脚本

问题描述 投票:0回答:1

我有一个程序,该程序使用argparse通过命令行获取文件夹路径和其他输入。我希望此脚本在服务器上自动运行,但是我也想保留其argparse功能,以防我想手动运行该脚本。有没有一种方法可以让脚本使用文件中的预生成输入,还可以使用argparse保留其基于标志的输入系统?这是我当前的实现:

parser = argparse.ArgumentParser(description='runs batch workflow on root directory')
parser.add_argument("--root", type=str, default='./', help="the path to the root directory 
                    to process")
parser.add_argument("--data", type=str, default='MS', help="The type of data to calculate ")
args = parser.parse_args()

root_dir = args.root
option = args.data

我对这些东西还很陌生,阅读argparse文档和This stack overflow question并不是我真正想要的,如果可能的话,我想保留root和data标志,而不仅仅是将它们替换为输入文件或标准输入

python-3.x stdin argparse
1个回答
1
投票

如果使用argparse,则default关键字参数是解决该问题的一种很好的标准方法;将程序的默认行为嵌入脚本源中,而不是外部配置文件中。但是,如果您有多个配置文件要进行不同的部署,则您所提到的方法(从输入中预先生成)是理想的。

argparse到字典

argparse命名空间可以转换为字典。这很方便,因为我们可以使函数接受字典或关键字参数,并使其具有方便的函数签名来处理程序。此外,文件解析器可以轻松加载字典并与同一功能进行交互。以python json模块为例。当然可以使用其他。

Python范例

def main(arg1=None, arg2=None, arg3=None):
    print(f"{arg1}, {arg2}, {arg3}")

if __name__ == "__main__":
    import sys
    import json
    import argparse

    # script called with nothing -- load default
    if len(sys.argv) == 1:
        with open("default.json", "r") as dfp:
            conf = json.load(dfp)
        main(**conf)

    else: # parse arguments
        parser = argparse.ArgumentParser()
        parser.add_argument('-a1', dest='arg1', metavar='arg1', type=str)
        parser.add_argument('-a2', dest='arg2', metavar='arg2', type=str)
        parser.add_argument('-a3', dest='arg3', metavar='arg3', type=str)
        args = parser.parse_args()
        conf = vars(args)
        main(**conf)

default.json

{
    "arg1" : "str1",
    "arg2" : "str2",
    "arg3" : "str3"
}

使用Fire

python Fire模块也可以更方便地使用。它具有多种模式,可以以最小的努力进行文件交互。 github存储库可用here

© www.soinside.com 2019 - 2024. All rights reserved.