本文目录导读:

我会详细说明Python脚本初始化项目配置的几种常用方法。
使用配置文件(推荐)
JSON配置文件
import json
import os
class ProjectConfig:
def __init__(self, config_file='config.json'):
self.config_file = config_file
self.config = self.load_config()
self.setup_project()
def load_config(self):
"""加载配置文件"""
if os.path.exists(self.config_file):
with open(self.config_file, 'r', encoding='utf-8') as f:
return json.load(f)
else:
return self.create_default_config()
def create_default_config(self):
"""创建默认配置"""
default_config = {
"project": {
"name": "my_project",
"version": "1.0.0",
"author": "developer"
},
"database": {
"host": "localhost",
"port": 5432,
"database": "mydb",
"user": "admin",
"password": ""
},
"paths": {
"log_dir": "./logs",
"data_dir": "./data",
"output_dir": "./output"
},
"logging": {
"level": "INFO",
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
}
}
# 保存默认配置
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(default_config, f, indent=4, ensure_ascii=False)
print(f"已创建默认配置文件: {self.config_file}")
return default_config
def setup_project(self):
"""初始化项目目录结构"""
for path in self.config.get('paths', {}).values():
os.makedirs(path, exist_ok=True)
print(f"创建目录: {path}")
def get(self, key, default=None):
"""获取配置项"""
keys = key.split('.')
value = self.config
for k in keys:
if isinstance(value, dict):
value = value.get(k, default)
else:
return default
return value
# 使用示例
if __name__ == "__main__":
config = ProjectConfig()
print(f"项目名称: {config.get('project.name')}")
print(f"数据库主机: {config.get('database.host')}")
YAML配置文件
import yaml
import os
class YAMLProjectConfig:
def __init__(self, config_file='config.yaml'):
self.config_file = config_file
self.config = self.load_config()
self.setup_project()
def load_config(self):
"""加载YAML配置文件"""
if os.path.exists(self.config_file):
with open(self.config_file, 'r', encoding='utf-8') as f:
return yaml.safe_load(f)
else:
return self.create_default_config()
def create_default_config(self):
"""创建默认YAML配置"""
default_config = {
'project': {
'name': 'my_project',
'version': '1.0.0',
'author': 'developer'
},
'database': {
'host': 'localhost',
'port': 5432,
'database': 'mydb',
'user': 'admin',
'password': '${DB_PASSWORD}' # 环境变量引用
},
'paths': {
'log_dir': './logs',
'data_dir': './data',
'output_dir': './output'
},
'logging': {
'level': 'INFO',
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
}
}
with open(self.config_file, 'w', encoding='utf-8') as f:
yaml.dump(default_config, f, default_flow_style=False, allow_unicode=True)
print(f"已创建默认配置文件: {self.config_file}")
return default_config
def resolve_env_vars(self, value):
"""解析环境变量"""
if isinstance(value, str) and value.startswith('${') and value.endswith('}'):
env_var = value[2:-1]
return os.getenv(env_var, value)
return value
def setup_project(self):
"""初始化项目目录"""
for path in self.config.get('paths', {}).values():
os.makedirs(path, exist_ok=True)
def get(self, key, default=None):
"""获取配置项(支持环境变量解析)"""
keys = key.split('.')
value = self.config
for k in keys:
if isinstance(value, dict):
value = value.get(k, default)
else:
return default
return self.resolve_env_vars(value)
# 安装PyYAML: pip install pyyaml
if __name__ == "__main__":
config = YAMLProjectConfig()
print(f"项目名称: {config.get('project.name')}")
使用环境变量
import os
from dotenv import load_dotenv
class EnvConfig:
def __init__(self, env_file='.env'):
self.env_file = env_file
self.load_env()
self.setup_project()
def load_env(self):
"""加载环境变量文件"""
if os.path.exists(self.env_file):
load_dotenv(self.env_file)
print(f"已加载环境变量文件: {self.env_file}")
else:
self.create_default_env()
def create_default_env(self):
"""创建默认环境变量文件"""
default_env = """
# 项目配置
PROJECT_NAME=my_project
PROJECT_VERSION=1.0.0
# 数据库配置
DB_HOST=localhost
DB_PORT=5432
DB_NAME=mydb
DB_USER=admin
DB_PASSWORD=
# 路径配置
LOG_DIR=./logs
DATA_DIR=./data
OUTPUT_DIR=./output
# 日志配置
LOG_LEVEL=INFO
"""
with open(self.env_file, 'w') as f:
f.write(default_env.strip())
load_dotenv(self.env_file)
print(f"已创建默认环境变量文件: {self.env_file}")
def setup_project(self):
"""创建项目目录"""
dirs = [
os.getenv('LOG_DIR', './logs'),
os.getenv('DATA_DIR', './data'),
os.getenv('OUTPUT_DIR', './output')
]
for dir_path in dirs:
os.makedirs(dir_path, exist_ok=True)
print(f"创建目录: {dir_path}")
def get(self, key, default=None):
"""获取环境变量"""
return os.getenv(key, default)
# 安装python-dotenv: pip install python-dotenv
if __name__ == "__main__":
config = EnvConfig()
print(f"项目名称: {config.get('PROJECT_NAME')}")
print(f"数据库主机: {config.get('DB_HOST')}")
使用argparse命令行参数
import argparse
import os
import json
class ArgparseConfig:
def __init__(self):
self.parser = argparse.ArgumentParser(description='项目初始化配置')
self.add_arguments()
self.args = self.parse_args()
self.setup_project()
def add_arguments(self):
"""添加命令行参数"""
self.parser.add_argument('--config', type=str,
help='配置文件路径')
self.parser.add_argument('--project-name', type=str,
default='my_project', help='项目名称')
self.parser.add_argument('--db-host', type=str,
default='localhost', help='数据库主机')
self.parser.add_argument('--db-port', type=int,
default=5432, help='数据库端口')
self.parser.add_argument('--log-level', type=str,
default='INFO', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'])
self.parser.add_argument('--init-dirs', action='store_true',
help='是否初始化目录')
def parse_args(self):
"""解析参数"""
args = self.parser.parse_args()
# 如果指定了配置文件,从配置文件加载
if args.config and os.path.exists(args.config):
with open(args.config, 'r') as f:
config_data = json.load(f)
# 合并配置
for key, value in config_data.items():
if not getattr(args, key.replace('-', '_'), None):
setattr(args, key.replace('-', '_'), value)
return args
def setup_project(self):
"""初始化项目"""
if self.args.init_dirs:
dirs = ['./logs', './data', './output']
for dir_path in dirs:
os.makedirs(dir_path, exist_ok=True)
print(f"创建目录: {dir_path}")
def get(self, key, default=None):
"""获取配置值"""
return getattr(self.args, key.replace('-', '_'), default)
# 使用示例
if __name__ == "__main__":
config = ArgparseConfig()
print(f"项目名称: {config.get('project_name')}")
print(f"数据库主机: {config.get('db_host')}")
综合使用(推荐的最佳实践)
import os
import json
import argparse
from pathlib import Path
from dotenv import load_dotenv
class ProjectInitializer:
"""项目初始化器 - 综合多种配置方式"""
def __init__(self):
self.config = {
'project': {},
'database': {},
'paths': {},
'logging': {}
}
self.initialize()
def initialize(self):
"""按优先级加载配置"""
# 1. 加载默认配置文件
self.load_default_config()
# 2. 加载环境变量
self.load_env_config()
# 3. 加载命令行参数
self.load_cli_config()
# 4. 设置项目
self.setup_project()
def load_default_config(self):
"""加载默认配置"""
config_file = 'config.json'
if os.path.exists(config_file):
with open(config_file, 'r') as f:
self.config.update(json.load(f))
print(f"已加载配置文件: {config_file}")
else:
self.create_default_config()
def create_default_config(self):
"""创建默认配置"""
default_config = {
'project': {
'name': 'my_project',
'version': '1.0.0',
'debug': False
},
'database': {
'host': 'localhost',
'port': 5432,
'name': 'mydb'
},
'paths': {
'log_dir': './logs',
'data_dir': './data',
'temp_dir': './temp'
},
'logging': {
'level': 'INFO',
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
}
}
with open('config.json', 'w') as f:
json.dump(default_config, f, indent=4)
print("已创建默认配置文件: config.json")
self.config.update(default_config)
def load_env_config(self):
"""加载环境变量配置"""
if os.path.exists('.env'):
load_dotenv('.env')
# 环境变量覆盖配置
env_mapping = {
'PROJECT_NAME': ('project', 'name'),
'DB_HOST': ('database', 'host'),
'DB_PORT': ('database', 'port'),
'LOG_LEVEL': ('logging', 'level')
}
for env_key, config_path in env_mapping.items():
env_value = os.getenv(env_key)
if env_value:
section, key = config_path
if section in self.config:
if key == 'port':
self.config[section][key] = int(env_value)
else:
self.config[section][key] = env_value
def load_cli_config(self):
"""加载命令行参数"""
parser = argparse.ArgumentParser(description='项目初始化')
parser.add_argument('--project-name', type=str, help='项目名称')
parser.add_argument('--db-host', type=str, help='数据库主机')
parser.add_argument('--db-port', type=int, help='数据库端口')
parser.add_argument('--debug', action='store_true', help='调试模式')
parser.add_argument('--init', action='store_true', help='初始化项目')
args, unknown = parser.parse_known_args()
if args.project_name:
self.config['project']['name'] = args.project_name
if args.db_host:
self.config['database']['host'] = args.db_host
if args.db_port:
self.config['database']['port'] = args.db_port
if args.debug:
self.config['project']['debug'] = True
def setup_project(self):
"""初始化项目目录结构"""
paths = self.config.get('paths', {})
for name, path in paths.items():
Path(path).mkdir(parents=True, exist_ok=True)
print(f"创建目录: {path}")
def get(self, section, key, default=None):
"""获取配置值"""
try:
return self.config[section][key]
except KeyError:
return default
def __str__(self):
return json.dumps(self.config, indent=2, ensure_ascii=False)
# 使用示例
if __name__ == "__main__":
initializer = ProjectInitializer()
print("\n当前配置:")
print(initializer)
# 使用配置
print(f"\n项目名称: {initializer.get('project', 'name')}")
print(f"数据库主机: {initializer.get('database', 'host')}")
print(f"日志级别: {initializer.get('logging', 'level')}")
使用配置管理库(推荐)
# 使用 dynaconf 库
# pip install dynaconf
from dynaconf import Dynaconf
settings = Dynaconf(
envvar_prefix="MYPROJECT",
settings_files=['settings.toml', '.secrets.toml'],
environments=True,
load_dotenv=True,
)
# settings.toml
"""
[default]
project_name = "my_project"
version = "1.0.0"
debug = false
[development]
debug = true
database_host = "localhost"
[production]
database_host = "prod-server.com"
"""
推荐的选择
- 小型项目:使用
json或yaml配置文件 - 需要安全配置:使用环境变量 +
.env文件 - 命令行工具:使用
argparse - 大型项目:使用
dynaconf或python-decouple等配置管理库 - 最佳实践:组合使用 JSON/YAML 配置 + 环境变量 + 命令行参数
这些方法可以根据项目需求灵活选择和组合使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播