Python全栈之路----常用模块----包及跨模块导入
当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相互的放入一个文件夹。

像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包。
那不同包之间的模块如何相互导入呢?
crm/views.py 内容
def sayhi():
print('hello world!')
通过 manage.py 调用
from my_pro.crm import views #从包里导入包里的文件
views.sayhi()
在文件夹下,加一个 __inint__.py 这个文件就会被 python2 识别为一个包,python3 不加也能被识别为包。
从 manage.py 里导入 views.py,从 views.py 里导入 settings.py。因为在 sys.path 里已经把 manage.py 所在的位置当作入口导入,即 sys.path 里的 " " ,所以 views.py 可以从高它一级的 proj 里导入 settings.py 。
从 views.py 里直接导入 settings.py ,而 settings.py 存在于高 views.py 一级的 proj 里,由于入口文件是 views.py ,所以 settings.py 不存在于 sys.path 里面,需要获取settings 的绝对路径添加到 sys.path 里,进行模块导入。
import sys, os
#获取此程序所在文件的绝对目录的上一层的上一层,即proj所在绝对路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#将proj所在文件路径添加到sys.path里面,即导入模块的搜寻范围
sys.path.append(BASE_DIR)
from proj import settings
相对导入
从当前目录下直接导入,意思是被导入的文件和导入文件二者为同级别文件,存在于同一个文件夹下。
#在 views.py 里导入 models.py
from . import models
在 views.py 里导入 settings.py
# '.' 代表当前目录,那 '..proj' 应该就能代表当前目录的平级中的 proj 文件
from ..proj import settings
执行结果报错了
SystemError: Parent module '' not loaded, cannot perform relative import
或者有人会看到这个错
ValueError: attempted relative import beyond top-level package
其实这两个错误的原因归根结底是一样的:在涉及到相对导入时,package 所对应的文件夹必须正确的被 python 解释器视作 package ,而不是普通文件夹。否则由于不被视作 package ,无法利用 package 之间的嵌套关系实现 python 中包的相对导入。
文件夹被视 python 解释器视作 package 需要满足两个条件:
- 文件夹中必须有 __init__.py 文件,该文件可以为空,但必须存在该文件。
- 不能作为顶层模块来执行该文件夹中的 py 文件(即不能作为主函数的入口)。
所以这个问题的解决办法就是,既然你在 views.py 里执行了相对导入,那就不要把 view.py 当作入口程序,可以通过上一级的 manage.py 调用 views.py 。
正确的代码目录结构如下:

再执行 manage.py 就不会报错了。
注:虽然 python 支持相对导入,但对模块间的路径关系要求比较严格,处理不当就容易出错,so并不建议在项目里经常使用。
Python全栈之路----常用模块----包及跨模块导入的更多相关文章
- Python全栈之路----常用模块----hashlib加密模块
加密算法介绍 HASH Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...
- Python全栈之路----常用模块学习----模块的种类和导入方法
什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...
- Python全栈之路----常用模块----os模块
os模块提供了很多允许你的程序和操作系统直接交互的功能 得到当前工作目录,即当前Python脚本工作的目录路径:os.getcwd() #test.py import os print(os.getc ...
- Python全栈之路----常用模块----软件开发目录规范
目录基本内容 log #日志目录 conf #配置目录 core/luffycity #程序核心代码目录 #luffycity 是项目名,建议用小写 libs/modules #内置模块 d ...
- Python全栈之路----常用模块----shutil模块
高级的 文件.文件包.压缩包 处理模块 参考Python之路[第四篇]:模块 #src是原文件名,fdst是新文件名 shutil.copyfileobj(fsrc, fdst[, len ...
- Python全栈之路----常用模块----re 模块
正则表达式就是字符串的匹配规则,在多数编程语言里都有相应的支持,python里对应的模块是 re. re的匹配语法有以下几种 re.match 从头开始匹配 re.search 匹配包含 re.fin ...
- Python全栈之路----常用模块----logging模块
很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...
- Python全栈之路----常用模块----subprocess模块
我们经常需要通过Python去执行一条系统命令或脚本,系统的shell命令是独立于你的python进程之外的,每执行一条命令,就是发起一个新进程,通过python调用系统命令或脚本的模块在python ...
- Python全栈之路----常用模块----datetime模块详解
相比于time模块,datetime模块的接口则更直观,更容易调用. datetime模块定义了下面这几个类: datetime.date:表示日期的类,常用的属性有year,month,day: d ...
随机推荐
- Windows server 2016安装Docker EE
Windows server 2016安装Docker EE 下载 windows server 2016 180天评估版本. 地址:https://www.microsoft.com/en-us/e ...
- Windows Update Medic Service 拒绝访问
修改注册表:HEKY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc 中Start的值改为4.
- vmware workstation 14 快速安装操作系统
一.NAT网络配置 设置子网IP.子网掩码 网关IP:子网IP前三位+2 DHCP设置 二.网卡配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYP ...
- 力扣(LeetCode) 821. 字符的最短距离
给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleetcode", C ...
- 前端UI框架选择区别对比推荐
UI选择务必慎重,货比三家. 弱水三千只取一瓢:弱水三千只取一瓢,源起佛经中的一则故事,警醒人们在一生中可能会遇到很多美好的东西,但只要用心好好把握住其中的一样就足够了 老牌构建于jQuery框架之上 ...
- 巧用同步请求处理react页面刷新问题
很多时候,我们会遇到这种情况,组件加载需要请求后台数据,然后填充组件.那么我们一般会这样处理:如[使用异步请求的方式]代码: 加载组价的时候,未获得数据,render一个空的div: 然后异步请求数据 ...
- vue form表单验证
<el-select v-model="ruleForm.region" placeholder="请选择活动区域"> <el-option ...
- 《HTTP 权威指南》笔记:第十五章 实体与编码
 如果把 「HTTP 报文」想象为因特网货运系统的「箱子」,那么「HTTP 实体」就是报文中的实际的「货物」. 其中,实体又包含了「实体首部」 和 「实体主体」,实体首部用于描述各种参数,实体主体就 ...
- 20190315xlVBA_删除无用的区域
'经常遇见天眼查表格文件特别大,原因是使用了整个表格,虽然无法解释为什么,但是经过验证以下代码是凑效的 Private Sub DeleteUselessRegion(ByVal sht As Wor ...
- 安卓MVP框架
一.理解MVP 原文地址 我的Demo 效果图: 项目结构: 实现 一.Model层 首先定义一个实体类User package app.qcu.pmit.cn.mvpdemo.model; /** ...