使用预生成的输入自动执行 python argparse 脚本
Automate python argparse script with pre-generated inputs
我有一个程序,它通过带有 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
,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
pythonFire
模块也可以更方便的使用。它有多种模式,文件可以以最小的努力进行交互。 github 存储库可用 here。
我有一个程序,它通过带有 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
,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
pythonFire
模块也可以更方便的使用。它有多种模式,文件可以以最小的努力进行交互。 github 存储库可用 here。