Python 中脚本集合的配置变量
Configuration variables for a collection of scripts in Python
我有一组用 Python 编写的脚本。它们中的每一个都可以独立执行。然而,大多数时候它们应该一个接一个地执行,所以有一个 MainScript.py
以适当的顺序调用它们。每个脚本都有一些可配置的变量(我们称它们为 Root_Dir
、Data_Dir
和 LinWinFlag
)。如果将此脚本集合移动到不同的计算机,或者需要处理不同的数据,则需要更改这些变量值。由于有许多脚本,这种重复很烦人且容易出错。我想将所有配置变量分组到一个文件中。
我尝试制作 Config.py
,它将根据 this thread 包含它们,但是 import Config
生成 ImportError: No module named Config
,因为它们不是包的一部分。
然后我尝试依赖变量继承:在调用所有其他变量的 MainScript.py
中定义一次。这行得通,但我意识到每个脚本都无法单独 运行。为了解决这个问题,我尝试在 MainScript.py
和其他文件中添加 useGlobal=True
:
if (useGlobal is None or useGlobal==False):
# define all variables
但是当脚本 运行 独立时,这会失败:NameError: name 'useGlobal' is not defined
。解决方法是定义 useGlobal 并在 运行 独立于 MainScript.py
运行脚本时将其设置为 False。有更优雅的解决方案吗?
执行此操作的最佳方法是使用位于主目录 (~/.config/yourscript/config.json
) 中的配置文件。
然后您可以在启动时加载文件并在文件不存在时提供默认值:
示例(config.py):
import json
default_config = {
"name": "volnt",
"mail": "oh@hi.com"
}
def load_settings():
settings = default_config
try:
with open("~/.config/yourscript/config.json", "r") as config_file:
loaded_config = json.loads(config_file.read())
for key in loaded_config:
settings[key] = loaded_config[key]
except IOError: # file does not exist
pass
return settings
对于配置文件,最好使用 json 而不是 python,因为使用您的脚本的人可以轻松编辑它。
想法是 python 想要访问文件 - 包括 Config.py - 主要作为模块的一部分。
好的是 Python 使构建模块(即 python 包)变得非常容易 - 初始化它可以通过创建
__init__.py
每个目录中的文件作为模块、子模块、子子模块等。
所以如果您已经创建了这个文件,您的导入应该会完成。
如果还有什么问题,请看优秀的python documentation。
正如 cleros 所建议的,ConfigParser module 似乎是最接近我想要的东西(每个文件中的一行语句将设置多个变量)。
我有一组用 Python 编写的脚本。它们中的每一个都可以独立执行。然而,大多数时候它们应该一个接一个地执行,所以有一个 MainScript.py
以适当的顺序调用它们。每个脚本都有一些可配置的变量(我们称它们为 Root_Dir
、Data_Dir
和 LinWinFlag
)。如果将此脚本集合移动到不同的计算机,或者需要处理不同的数据,则需要更改这些变量值。由于有许多脚本,这种重复很烦人且容易出错。我想将所有配置变量分组到一个文件中。
我尝试制作 Config.py
,它将根据 this thread 包含它们,但是 import Config
生成 ImportError: No module named Config
,因为它们不是包的一部分。
然后我尝试依赖变量继承:在调用所有其他变量的 MainScript.py
中定义一次。这行得通,但我意识到每个脚本都无法单独 运行。为了解决这个问题,我尝试在 MainScript.py
和其他文件中添加 useGlobal=True
:
if (useGlobal is None or useGlobal==False):
# define all variables
但是当脚本 运行 独立时,这会失败:NameError: name 'useGlobal' is not defined
。解决方法是定义 useGlobal 并在 运行 独立于 MainScript.py
运行脚本时将其设置为 False。有更优雅的解决方案吗?
执行此操作的最佳方法是使用位于主目录 (~/.config/yourscript/config.json
) 中的配置文件。
然后您可以在启动时加载文件并在文件不存在时提供默认值:
示例(config.py):
import json
default_config = {
"name": "volnt",
"mail": "oh@hi.com"
}
def load_settings():
settings = default_config
try:
with open("~/.config/yourscript/config.json", "r") as config_file:
loaded_config = json.loads(config_file.read())
for key in loaded_config:
settings[key] = loaded_config[key]
except IOError: # file does not exist
pass
return settings
对于配置文件,最好使用 json 而不是 python,因为使用您的脚本的人可以轻松编辑它。
想法是 python 想要访问文件 - 包括 Config.py - 主要作为模块的一部分。
好的是 Python 使构建模块(即 python 包)变得非常容易 - 初始化它可以通过创建
__init__.py
每个目录中的文件作为模块、子模块、子子模块等。
所以如果您已经创建了这个文件,您的导入应该会完成。
如果还有什么问题,请看优秀的python documentation。
正如 cleros 所建议的,ConfigParser module 似乎是最接近我想要的东西(每个文件中的一行语句将设置多个变量)。