读配置文件,而不是将配置写在代码里,将有助于在其他环境对任务调用时,避免使用的不是同一个$PYTHONPATH环境变量造成一些import导包问题,例如Dolphinscheduler调度import 自定义包时。而读文件可以写服务器上的全路径名,解决了此类问题。
当你想要在Python中读取一个配置文件并将其配置设置为全局变量时,你可以使用configparser
模块。以下是一个简单的例子,假设你的配置文件是一个INI文件格式:
首先,创建一个配置文件(例如,config.ini):
[Settings]
key1 = value1
key2 = value2
key3 = value3
然后,使用以下Python代码读取并设置全局变量:
import configparser
# 创建 ConfigParser 对象
config = configparser.ConfigParser()
# 读取配置文件
config.read('config.ini')
# 获取配置值并设置为全局变量
global_var_key1 = config.get('Settings', 'key1')
global_var_key2 = config.get('Settings', 'key2')
global_var_key3 = config.get('Settings', 'key3')
# 打印全局变量(可选)
print(f"global_var_key1: {global_var_key1}")
print(f"global_var_key2: {global_var_key2}")
print(f"global_var_key3: {global_var_key3}")
在这个例子中,configparser
模块用于读取配置文件,然后通过get
方法获取各个配置项的值,并将其设置为全局变量。你可以根据实际需要修改配置文件的路径和变量名称。这样,你就可以在整个程序中访问这些全局变量了。
此外,如果需要再 config.ini 里任然使用 configparser 来添加一个动态变量
[Settings]
# TODO 日期
today = datetime.now().strftime('%Y%m%d')
yesterday = ((datetime.strptime(datetime.now().strftime('%Y%m%d'), '%Y%m%d')) - timedelta(days=1)).strftime('%Y%m%d')
this_month_to_last_week_filename = datetime.now().date().strftime('%Y年%m月份最新医生活跃人次(截止上周且最大4次)')
运行时 configparser 会报错
ConfigParser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%&'"
这是因为 % 已经在 configparser 的低版本里有意义了,可以作为变量替换 %() 使用,所以会导致语法冲突。
解决办法是,新版 Python 3.2的 configparser 里,可以取消插值来构造函数。改成下面这句即可,
configParser = configparser.ConfigParser(interpolation=None)
或者是选择使用 RawConfigParser ,而非使用 ConfigParser,也可解决。
import codecs
import configparser
from datetime import datetime, timedelta
# 创建 ConfigParser 对象
config = configparser.ConfigParser(interpolation=None)
# 读取配置文件,使用 utf-8-sig 编码可以支持读中文编写的 config.ini
config.read_file(codecs.open('config.ini', "r", "utf-8-sig"))
# 获取配置值并设置为全局变量
global_var_key1 = config.get('Settings', 'key1')
global_var_key2 = config.get('Settings', 'key2')
global_var_key3 = config.get('Settings', 'key3')
global_var_today = eval(config.get('Settings', 'today'))
global_var_yesterday = eval(config.get('Settings', 'yesterday'))
global_var_this_month_to_last_week_filename = eval(config.get('Settings', 'this_month_to_last_week_filename'))
# 打印全局变量(可选)
print(f"global_var_key1: {global_var_key1}")
print(f"global_var_key2: {global_var_key2}")
print(f"global_var_key3: {global_var_key3}")
print(f"global_var_today: {global_var_today}")
print(f"global_var_yesterday: {global_var_yesterday}")
print(f"global_var_yesterday: {global_var_this_month_to_last_week_filename}")
参考:
ConfigParser的%问题
https://stackoverflow.com/questions/14340366/configparser-and-string-with
RawConfigParser使用 https://docs.python.org/3/library/configparser.html#rawconfigparser-objects