Python项目中import的问题

在对python的项目运行中,常常会遇到import的问题,特别是多层文件架构的情况下. 

这样的好处包括: 1) 提高代码的复现性 2) 便于维护,可以很快发现bug

projectname/              # 项目目录
    #__init__.py          # 也可以变成包,供今后其他项目import
    construct/            # 子包construct用于建造过程
        __init__.py
        brick.py          # 制作砖头
        wall.py           # 制作墙体
        misc.py           # 其他不好归类的功能
        ...
    decoration/           # 子包decoration用于装修装饰过程
        __init__.py
        room.py           # 放间装修装饰
        clean.py          # 清洁
        ...
    doc/                  # 项目文档目录
    buildhouse.py         # 项目主程序,如果较复杂应继续分拆
    README.md             # 项目简介

以链接中的文件架构为例子: projectname中有两个文件夹construct 和 decoration. 在这些文件下面有不同的py文件, 一个py文件是一个模块. 

概览:

1. 一定要有__init__.py文件, 无论是在projectname还是在两个子文件夹下面, 否则这些文件夹会被当成是普通目录而不是包, 里面可以为空 (只限于Python3.3之前的版本). 

2. import可以使用相对路径也可以使用绝对路径. 

projectname/contrcution/brick.py是使用绝对路径

. 或者.. 是使用相对路径

其中: 

  • . 当前目录同级查找
  • .. 当前目录上级查找

在使用路径时候的注意点

首先初始位置为要进行import的这个py文件, 以下例子均以需要在wall.py中import为例,那初始的位置就是wall.py所在的位置.

分为不同的情况进行导入:

1. 如果import在同一个包中模块:

比如wall.py要引用brick.py, 对于wall而言,brick位于同一级

from . import brick

也可以是

import brick

如果是import brick中的内容:

from brick import XX

2. (跨文件夹) 如果import不在同一个包中的模块, 比如wall.py要引用room.py

有几种不同的解决方案

2.1 可以使用改为项目级别的绝对引用

from decoration.room import *

2.2 

import sys

sys.path.append("..") 

from decoration import room

参考的内容主要有:

Python项目如何合理组织规避import天坑 - 知乎

https://medium.com/pyladies-taiwan/python-%E7%9A%84-import-%E9%99%B7%E9%98%B1-3538e74f57e3

猜你喜欢

转载自blog.csdn.net/weixin_44897685/article/details/131669448
今日推荐