我最近一直在开发一个python包,发现我需要访问从我的主脚本中删除许多脚本的命令行参数。 为了保持对原始命令行参数的轻松访问,我一直使用argparse来处理命令行,然后使用
保存命令行参数字典。import argparse
import json
parser = argparse.ArgumentParser()
# parser.add_argument() stuff here
args = parser.parse_args()
with open('commandLineArgs.json','w') as outfile:
json.dump(args.__dict__,outfile)
然后,文件“commandLineArgs.json”可供我稍后添加的任何脚本使用,我不必将参数从文件传递到文件。
我觉得有一种更多的Pythonic方法可以做到这一点(甚至是argparse的一种方法,我没有找到)。有没有人知道更好的(即更多Pythonic)方法呢?
======
作为参考,我的python包结构松散(现在其他用户正在添加suboptionX.py文件):
/main.py
/option1.py#基于命令行参数
/sub_option1.py#基于option1的命令行参数
/sub_option2.py
/option2.py等
答案 0 :(得分:2)
命令行参数用于自上而下的方法:参数提供给入口点函数(通常称为main),它处理参数,然后通过向子函数提供必需的参数来调用子函数
在您的情况下,您似乎希望您的脚本以相反的方式工作:每个模块独立于父模块,并且每个模块都需要访问所需的参数而不由父模块集中。在这种情况下,配置文件是可行的方法,因此任何子模块或下标都可以访问整个参数集而无需修改main()入口点。如果您的子模块使用非常不同的参数集,那么从长远来看,这也更具可读性和可管理性,因为相关参数将由相关子模块直接管理,而不是由包含main()的顶层模块管理。
根据您的描述,您似乎只是从命令行参数创建配置文件,这看起来有点多余。您可以将所有命令行参数移动到json解析器,并邀请您的用户自己设置配置文件。然后,唯一需要的命令行参数将是配置文件的位置。
这是我通过创建ConfigParser类来管理从配置文件加载的类似需求(许多子模块必须访问不同的,可能是所有参数)时所做的,并且我使所有子模块继承了配置文件通过子类化加载ConfigParser的父类。参见:
ConfigParser类:https://github.com/lrq3000/author-detector/blob/master/authordetector/configparser.py
加载ConfigParser并由子模块中的所有子项继承的基类:https://github.com/lrq3000/author-detector/blob/master/authordetector/base.py
使用这种方案,通过继承Base类,所有子类也可以访问所有配置参数,无需任何显式操作,也没有任何内存开销(因为它只是一个引用,配置不是' t为每个子类重复)。例如,如果模块complex_math_func
需要一个名为sigma
的参数,则可以在模块定义中写入:
sigma = self.config.get("sigma")
这将自动从配置文件加载变量sigma,如果它不存在,它将只返回None,以便您可以设置默认值。子模块不必再进行任何用户输入/参数处理,因为它由ConfigParser + Base类自动管理。