当前位置: 首页 > news >正文

Python项目开发结构,以及如何包内如何相互导入及如何运行命令行

问题引入

我是一个从零开始的小白入手python项目开发,在开过过程中遵循着,现在最主流的项目结构如下所示:

其中crag就是我的项目包名.
之后再document.py中使用了config.py文件中的一些函数,使用的导入语句为:
from crag.config import CHROMA_PERSIST_DIR
之后再项目的根目录下执行命令行:

(.venv)PS E:\code\VSCode\CRAG>python .\src\crag\document.py Traceback(most recent call last): File"E:\code\VSCode\CRAG\src\crag\document.py", line6,in<module>from .configimportCHROMA_PERSIST_DIR, EMBEDDING_MODEL,MODEL_DIR,DATA_DIR ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ImportError: attempted relativeimportwith no known parent package

就会报各种各样的错误.之后博主花了许多功夫菜搞懂了在python项目开发过程中最正确的使用方法.

解决问题

刚刚提到的src布局(src-layout)是目前 Python 社区(包括 PyPA 官方)最推荐的项目结构,因为它能有效防止“测试代码意外导入源码”等问题。

让我们一步一步讲解python项目开发过程中的包的导入和命令行的书写.

1. 为什么使用src布局?

src布局中,你的结构通常长这样:

CRAG/ ├── pyproject.toml # 项目配置文件(非常重要) ├── src/ │ └── crag/ # 真正的源码包 │ ├── __init__.py │ ├── config.py │ └── document.py ├── tests/ # 测试代码 └── .venv/

当你安装这个项目时,pip会将src下的crag文件夹安装到你的 Python 环境中。发布时,用户不会看到src这个文件夹,他们只能看到crag库。


2. 怎么写导入(内部相互引用)?

无论是在开发还是安装后,请统一使用“绝对导入”,不要使用相对导入。

如果你的源码包名字是crag,那么在document.py中引用config.py时,永远这样写:

# 无论你是从哪里运行,都从包的最顶层开始写fromcrag.configimportCHROMA_PERSIST_DIR,...

3. 如何在开发中运行代码?

为了让 Python 能够识别src目录,最标准的方法是以可编辑模式(Editable Mode)安装你的项目

第一步:在根目录创建pyproject.toml

CRAG/目录下创建一个简单的pyproject.toml文件:

[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "crag" version = "0.1.0"
第二步:安装项目

CRAG/目录下(确保你的虚拟环境已激活),执行:

pipinstall-e.
  • -e代表editable(可编辑)。
  • 这句话的意思是:告诉 Python,“把我当前文件夹下的src目录加入到 Python 的搜索路径中”。
  • 好处:现在你修改了代码,不需要重新安装,直接生效。
第三步:如何运行

安装后,你就不再依赖“路径”了,而是直接调用这个库。此时,你可以:

方法 A:直接在任何地方写 Python 脚本运行
因为你已经把crag安装到了环境中,你可以在任何地方运行:

# 比如在根目录建一个 run.pyfromcrag.documentimportsome_function some_function()

方法 B:使用python -m

# 只要安装了 -e . ,你直接这样运行就行,不需要管文件路径python-mcrag.document

4. 总结:最佳实践工作流

  1. 项目内部引用:全部使用绝对路径,例如from crag.utils import ...,不要用from .utils import ...
  2. 开发环境配置:每次新建项目,第一时间在根目录创建pyproject.toml,并运行pip install -e .
  3. 开发与发布的区别
    • 开发时pip install -e .让你的代码“热更新”。
    • 发布时:你打包工具(如build)会自动处理src,把crag目录提取出来分发给用户。用户安装后,他们运行代码的方式和你一模一样,不需要知道src文件夹的存在。

给你的具体操作建议:

  1. document.py里的from .config改成from crag.config
  2. CRAG根目录建一个pyproject.toml
  3. 执行pip install -e .
  4. 以后运行代码统一使用python -m crag.main这种格式。

这样配置后,你的 VSCode 警告也会消失,导入逻辑也会变得非常清晰且符合工业标准。

http://www.jsqmd.com/news/457819/

相关文章:

  • AI搜索引擎迭代下
  • 野火STM32_HAL库版课程笔记-串口发送之发送字节
  • PAT 乙级 1017
  • 矽塔科技 SA8311 2.5-10.0V/2.0A 单通道 H 桥电机驱动器 SOP8 技术解析
  • 2026夸克网盘扩容1 TB最新教程 必得1024GB~
  • 【系统分析师】11.1 软件需求
  • PTA 实验7-2-6 打印杨辉三角
  • 苍穹外卖学习day01:项目概述与环境搭建
  • 语言太“标准”反被疑?百考通注入人类写作特征,自然过检
  • 用户的精细化运营
  • 国自然申报最后10天!AI救了我的申请书,写审改一条龙太香了
  • 人工智能之语言领域 自然语言处理 第六章 情感分析
  • c++小知识点
  • 最新版国产龙虾(CoPaw0.0.5.Post1)windows10一键安装成功,用ollama选本地部署的大模型,成功使用!
  • 企业效率工具盘点:基于DeepMiner的可信智能体,人机协同新选择
  • JavaScript入门指南:从基础到实战
  • 2026年智能驾驶模拟器价格大揭秘,教你如何选到高性价比产品 - 工业品网
  • Visual Studio 2022 安装失败:无法安装 Microsoft.Net.4.8.FullRedist.20H2 解决
  • JAVA无人棋牌室源码实现方案
  • Java基础面试题拷打(2)
  • Redis基础
  • 中转API选择,五大平台哪个更适合你
  • OpenClaw 多会话配置说明
  • 【算法面试必刷】160. 相交链表
  • Flutter 组件 colorize_lumberdash 适配鸿蒙 HarmonyOS 实战:色彩化日志调试,构建直观的异常检测矩阵
  • 基于大数据+Hadoop+深度学习的经典名著推荐系统设计与开发(源码+精品论文+答辩PPT等资料)
  • 预应力塑料波纹管用途
  • DeekSeek 3.2和Qwen 3.5生成的求解24点程序对比
  • 移远通信 × 圆周率科技:PanoX V5全新亮相,将全景影像能力“装进”日常生活
  • Flutter 组件 geohash_plus 适配鸿蒙 HarmonyOS 实战:高维地理降维,构建纳秒级时空索引矩阵