【问题标题】:Automate python argparse script with pre-generated inputs使用预先生成的输入自动化 python argparse 脚本
【发布时间】:2020-07-31 04:51:50
【问题描述】:

我有一个程序,它通过带有 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 并不是我真正想要的,如果可能的话,我想保留根和数据标志,而不仅仅是用输入文件替换它们或标准输入。

【问题讨论】:

  • 如果您将argparse 放在文件末尾的if __name__=='__main__' 块中,那么它只会与文件被称为脚本一起使用。如果文件被导入,解析器不会运行,您可以通过导入脚本设置这些参数。
  • 你的意思是有另一个脚本来导入这个脚本,并且该脚本可以处理输入文件吗?这可能是一个解决方案,但我想知道是否有一种聪明的方法可以在这个脚本中做到这一点,而不必制作另一个脚本来导入它。

标签: python-3.x stdin argparse


【解决方案1】:

如果使用argparsedefault 关键字参数是解决问题的好标准方法;将程序的默认行为嵌入脚本源,而不是外部配置文件。但是,如果您有多个想要以不同方式部署的配置文件,那么您提到的方法(从输入预先生成)是可取的。

argparse 到字典

argparse 命名空间可以转换为字典。这很方便,因为我们可以创建一个接受字典或关键字参数的函数,并让它使用方便的函数签名来处理程序。此外,文件解析器可以很容易地加载字典并与相同的函数进行交互。以 pythonjson 模块为例。当然,也可以使用其他的。

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

pythonFire 模块也可以更方便地使用。它具有多种模式,可以轻松地与文件进行交互。 github repo 可用here

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 2020-04-28
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多