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 ...
随机推荐
- draw9patch图片拉伸
在此吐槽Android studio的稳定性,我用的Android studio已经完全不能用了.只要新建项目资源文件就会变成乱码.解决无果,忍无可忍的我只能重新下了一个低版本的.虽然还是有点毛病,但 ...
- sql语句修改字段约束为不为空 并为其设置主键
alter table Drc_Project_Review alter column ReviewID uniqueidentifier not nullalter table Drc_Projec ...
- JS(JavaScript)的初了解(更新中···)
1.js介绍 Js全称叫javascript,但不是java,他不仅是是一门前台语言,经过发展,现在也是一门后台语言:而java是后台语言. Js作者是布兰登艾奇. 前台语言:运行在客户端的 后台语言 ...
- Odd Gnome【枚举】
问题 I: Odd Gnome 时间限制: 1 Sec 内存限制: 128 MB 提交: 234 解决: 144 [提交] [状态] [命题人:admin] 题目描述 According to t ...
- robot framework---时间控件取值
项目中遇到日期控件定位不了,网上各种找,并没有适合我的,目前通过Javascript已解决了,再次做个记录,方便自己日后查找,如有同样问题的同学也可以有个参考! 先说明,不同的定位方式是看开发同学如何 ...
- 异步async/await简单应用与探究
感谢Marco CAO指出的两点错误,已做出修改与补充 异步函数(async/await)简单应用 .NET Framework4.5提供了针对异步函数语法糖,简化了编写异步函数的复杂度. 下面通过一 ...
- 绑定方法与非绑定方法 classmethod和staticmethod
一:绑定方法:特点:绑定给谁就应该是由谁来调用,谁来调用就会将谁当做第一个参数传入 1:绑定给对象的方法:类中定义的函数默认就是绑定给对象的 例: 2:绑定给类的方法:为类中定义的函数加 ...
- 快速测试方法——JUnit
特点:写一个类,里面可以执行多个方法. 在一个方法上面添加@Test,选中方法名,右键run,即可执行当前方法 import org.junit.Test; //注:测试方法要求:不能有返回值,不能有 ...
- VSCode+python插件
1.打开VSCode 点击箭头所指地方 然后输入python 安装截图所示的插件 2.进行python路径设置 点击文件--首选项--设置 点击... 会弹出一个下拉框 选择打开setting.jso ...
- C# 关键字this用法
1.this代表当前类的实例对象 public class Test { public string Name{get;set;} public void TestChange(string strN ...