Python 配置导入方式

本文介绍了解耦Python程序与配置信息的方法,包括通过设置setting.py文件存储数据库配置,并利用import导入,以及使用configparser模块进行配置文件的读写操作。
部署运行你感兴趣的模型镜像

1. python文件导入

在封装自己的数据库工具类的时候,最开始使用 pymysql.connect,分别传入不同的配置,但是在使用的时候 配置信息都写到了程序中,耦合性过高,如:

接着想法是使用io读写文件,设置配置信息;但是:io读取有可能会有权限的问题, 尽量用import导入。 由编译器来帮你把数据处理到内存里,最后发现这种写法:

定义setting.py,以json的形式存储数据

db_config={
	'host': '192.168.xxx.xxx',
	'user': 'root',
	'password': 'xxx',
	'db': 'xxx',
}

在调用的时候使用import导入模块

from setting import db_config
import pymysql

conn = pymysql.connect(**db_config)
with conn:
	print(conn.open)  # True

 2. configparser模块

该模块适用于配置文件的格式与windows ini文件类似,可以包含一个或多个节(section),每个节可以有多个参数(键=值)

例如:

[database]
host: localhost
password : root
port : 3306
dbname : test

 (1) 读取配置文件

from configparser import ConfigParser # 导入内置模块

CONFIG_PATH = "" # 配置文件路径

cfg = ConfigParser() # 创建实例
cfg.read(CONFIG_PATH) # 读取配置文件

print(f"sections are: {cfg.sections()}") # 获取配置中的分组信息
print(f"port: {cfg.getint('database', 'port')}") # 根据分组信息获取字段值
print(f"host: {cfg.get('database', 'host')}")

 将ConfigParser实例对象当作字典操作即可

(2)写入配置文件

from configparser import ConfigParser # 导入内置模块

CONFIG_PATH = "" # 配置文件路径

cfg = ConfigParser() # 创建实例
cfg.read(CONFIG_PATH) # 读取原有配置

cfg['test'] = {
   "name": "righteye",
   "age": 18,
   "address": "bbb"
 }
 with open(CONFIG_PATH, 'w') as file:
   cfg.write(file)

最终将配置信息和代码成功解耦,修改配置信息不用在改动源代码

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 我们正在讨论如何使用绝对导入来解决VSCode中跨文件夹导入模块的问题。 根据引用[2]和引用[4]的内容,绝对导入是解决跨包导入的推荐方式,因为相对导入在跨包时容易出错,并且当直接运行子模块时可能会因为模块的__name__变为__main__而失败。 绝对导入是从项目根目录开始的完整导入路径。为了使用绝对导入,我们需要确保Python解释器能够找到项目根目录。常见的做法是将项目根目录添加到sys.path中,或者设置PYTHONPATH环境变量。 下面我们将详细说明绝对导入的使用方法及示例,以及如何在VSCode中配置以支持绝对导入。 ### 绝对导入的使用方法 1. **项目结构示例**: ``` my_project/ ├── src/ │ ├── package1/ │ │ ├── __init__.py │ │ └── module1.py │ └── package2/ │ ├── __init__.py │ └── module2.py ├── app/ │ └── main.py └── .env ``` 2. **绝对导入的写法**: 在`module2.py`中导入`module1.py`: ```python # 正确写法1(推荐): from src.package1 import module1 # 正确写法2: from src.package1.module1 import some_function ``` 3. **关键配置**: 为了让Python解释器识别`src`为顶级包,我们需要将项目根目录(即`my_project`)添加到Python的模块搜索路径(sys.path)中。 **方法一:通过.env文件设置PYTHONPATH(推荐)** - 在项目根目录创建`.env`文件,内容为: ``` PYTHONPATH=${workspaceFolder} ``` - 这样,在VSCode中运行或调试时,整个项目根目录就被添加到sys.path中,因此可以像上面那样使用绝对导入。 **方法二:在代码中动态添加路径(不推荐,但有时方便)** 在入口文件(如`main.py`)的开头添加: ```python import sys from pathlib import Path # 将项目根目录添加到sys.path root_path = Path(__file__).parent.parent # 假设main.py在app目录下,那么.parent.parent就是项目根目录 sys.path.append(str(root_path)) ``` **方法三:使用安装模式(通过setup.py安装包)** 对于大型项目,可以将项目打包安装到Python环境中,这样在任何地方都可以导入。但对于开发中的项目,每次修改都要重新安装,不太方便。 4. **在VSCode中验证配置**: 在`main.py`中运行以下代码,检查sys.path是否包含项目根目录: ```python import sys print(sys.path) ``` ### 示例场景 假设我们有以下文件: **文件结构**: ``` project/ ├── .vscode/ │ └── settings.json ├── src/ │ └── math_operations/ │ ├── __init__.py │ └── basic.py # 定义函数add(a, b) └── app/ └── calculator.py # 需要导入basic.py中的add函数 ``` **步骤**: 1. 在`basic.py`中: ```python def add(a, b): return a + b ``` 2. 在`calculator.py`中使用绝对导入: ```python from src.math_operations.basic import add result = add(3, 5) print(result) # 输出8 ``` 3. 配置项目根目录到PYTHONPATH: 在项目根目录(project/)下创建`.env`文件,内容为: ``` PYTHONPATH=${workspaceFolder} ``` 4. 在VSCode中配置使用`.env`文件: 打开设置(快捷键Ctrl+,),搜索“env file”,设置“Python: Env File”为`${workspaceFolder}/.env`。 5. 运行`calculator.py`,应该能正确导入并输出8。 ### 注意事项 - **__init__.py文件**:每个包目录(如`src/math_operations`)下都需要有一个`__init__.py`文件(可以是空文件),这样Python才会将其视为包。 - **避免相对导入**:在跨包导入时不要使用相对导入(如`from ..math_operations import basic`),因为当直接运行子模块时(如`python app/calculator.py`)会失败[^4]。 - **运行方式**:在VSCode中,确保运行配置正确。如果使用命令行运行,需要设置环境变量: - Linux/Mac: `export PYTHONPATH=/path/to/project` - Windows: `set PYTHONPATH=C:\path\to\project` ### 常见问题解决 1. **VSCode编辑器仍然显示红色波浪线(导入错误)**: 这可能是由于Pylint等linter没有正确识别路径。在`.vscode/settings.json`中添加: ```json { "python.linting.pylintArgs": [ "--init-hook", "import sys; sys.path.append('${workspaceFolder}')" ] } ``` 注意:将`${workspaceFolder}`替换为实际路径(在VSCode中可以使用该变量)。 2. **模块未找到错误(ModuleNotFoundError)**: - 检查PYTHONPATH是否包含项目根目录。 - 检查包结构是否正确(每个包都有__init__.py)。 - 检查导入路径的拼写(大小写敏感)。 3. **直接运行子模块的问题**: 避免直接运行深层次模块(如`python src/package/module.py`),而应该从项目根目录运行,或者使用模块运行方式(`python -m app.calculator`)[^4]。 通过以上配置,绝对导入应该可以解决跨文件夹导入模块的问题。 §§相关问题§§ 1. 如何在命令行中设置PYTHONPATH环境变量? 2. 为什么在Python项目中需要__init__.py文件? 3. 如何使用-m参数运行Python模块? </think> ### Python绝对导入方式详解及VSCode配置指南 绝对导入是解决跨文件夹导入问题的推荐方法,它使用从项目根目录开始的完整路径导入模块,避免了相对导入的位置依赖问题[^2][^4]。以下为完整解决方案: #### 📂 绝对导入核心语法 ```python # 项目结构示例: # project/ # ├── src/ # │ ├── utils.py # └── app/ # └── main.py # 在main.py中导入utils.py from src.utils import helper_function # 绝对导入 ``` #### ✅ 配置步骤(解决VSCode报错) 1. **设置项目根路径标识** - 在项目根目录创建`setup.py`(内容可为空)或`pyproject.toml`文件 - 确保每个文件夹包含`__init__.py`文件(可为空) 2. **VSCode环境配置** 在项目根目录创建`.vscode/settings.json`: ```json { "python.analysis.extraPaths": ["src"], // 添加模块路径 "python.autoComplete.extraPaths": ["src"], "terminal.integrated.env.linux": { "PYTHONPATH": "${workspaceFolder}/src" // Linux/Mac }, "terminal.integrated.env.windows": { "PYTHONPATH": "${workspaceFolder}/src" // Windows } } ``` 3. **调试配置(.vscode/launch.json)** ```json { "version": "0.2.0", "configurations": [ { "name": "Python: Current File", "type": "python", "request": "launch", "program": "${file}", "env": {"PYTHONPATH": "${workspaceFolder}/src"} } ] } ``` 4. **命令行运行配置** ```bash # Linux/Mac PYTHONPATH=./src python app/main.py # Windows PowerShell $env:PYTHONPATH = ".\src"; python .\app\main.py ``` #### 🚫 绝对导入的注意事项 1. **避免直接运行子模块** ```python # 错误方式(在app/main.py中): python app/main.py # 可能导致导入失败 # 正确方式(从项目根目录运行): python -m app.main # 使用模块运行模式[^4] ``` 2. **与相对导入的对比** | 特性 | 绝对导入 | 相对导入 | |--------------|------------------------------|-----------------------| | 路径清晰度 | ✅ 完整路径,一目了然 | ❌ 依赖当前位置 | | 跨包导入 | ✅ 支持 | ❌ 仅限同包内[^2] | | 运行方式 | ✅ 支持直接运行 | ❌ 需`-m`参数[^4] | | 项目重构 | ✅ 影响小 | ❌ 需大量修改 | 3. **典型错误解决** `ModuleNotFoundError` 的排查步骤: 1. 检查`sys.path`是否包含目标路径: ```python import sys print(sys.path) # 验证路径配置 ``` 2. 确认所有文件夹都有`__init__.py` 3. 检查VSCode底部状态栏的Python解释器是否选择正确 #### 💻 完整示例 **项目结构**: ``` my_project/ ├── src/ │ ├── __init__.py │ └── calculator.py # 包含add(a, b)函数 └── app/ ├── __init__.py └── main.py ``` **calculator.py**: ```python def add(a, b): return a + b ``` **main.py**: ```python from src.calculator import add # 绝对导入 result = add(3, 5) print(f"计算结果: {result}") # 输出: 计算结果: 8 ``` **运行命令**: ```bash # 在项目根目录执行 PYTHONPATH=./src python -m app.main ``` > **关键原则**:绝对导入路径应从项目根目录开始,所有路径组件都应是Python包(含`__init__.py`)[^2][^3]。此方法在大型项目中可显著提高代码可维护性[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值