带有 CLI 和配置脚本的 python 项目结构

Posted

技术标签:

【中文标题】带有 CLI 和配置脚本的 python 项目结构【英文标题】:python project structure with CLI and config script 【发布时间】:2021-05-14 18:34:20 【问题描述】:

我有一个应用程序,目前它已设置为脚本之一 config.py 从 config.yaml 配置文件中读取数据并设置了一些默认值。到目前为止,这很好用,因为所有内容都在一个地方定义。

我现在想从 CLI 传递应用程序参数。我将如何做到这一点,以便我也可以替换 config.py 中的参数?我可能会以次优方式构建应用程序,因此感谢您提供任何反馈。

我在这里看到了一篇关于此的大量帖子:Most Pythonic way to provide global configuration variables in config.py?

我目前正在遵循提到的最简单的“常规”方法,即:

config.py

mysql_PORT = 3306
MYSQL_DATABASE = 'mydb'
MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']

因此,全局变量通过以下方式之一导入:

另一个脚本.py

from config import MYSQL_PORT

我能否将配置中的所有内容封装在一个对象或类中,而无需更改从 config.py 导入的所有代码。

【问题讨论】:

【参考方案1】:

定义一个配置对象或类。让您的应用程序从配置对象中读取。然后,您可以在外部文件中设置默认值,然后对其进行解析,或通过 CLI 传递。

【讨论】:

我稍微扩展了我的问题。我的代码版本 1 是按照我的解释编写的。现在我想扩展以使用 CLI,而不需要大量更改代码库(如果可能的话)。谢谢! 我认为你应该只在一个地方加载配置,比如application.py。之后, another_script.py 不会从 config 中读取,而是从 app 对象中读取。一旦你有了它,你就可以初始化你的应用程序并从 CLI 参数、外部文件或 config.py 中的硬编码值更新配置【参考方案2】:

在做了一些研究并与同事交谈后,我发现了这个包,它很好地解决了这个问题:

https://pypi.org/project/munch/

来自网站:

Munch 是一个支持属性样式访问的字典,类似于 javascript

>>> b = Munch()
>>> b.hello = 'world'
>>> b.hello
'world'
>>> b['hello'] += "!"
>>> b.hello
'world!'
>>> b.foo = Munch(lol=True)
>>> b.foo.lol
True
>>> b.foo is b['foo']
True

【讨论】:

以上是关于带有 CLI 和配置脚本的 python 项目结构的主要内容,如果未能解决你的问题,请参考以下文章

带有快速项目的 angular-cli

vue证明题三,vue项目的包结构和配置

将Vue-cli搭建的项目改造成多页面应用时对项目结构和配置的调整

将Vue-cli搭建的项目改造成多页面应用时对项目结构和配置的调整

vue-cli#2.0项目结构分析

通过Ansible运行带有模块的python脚本