一、模块

1、模块的定义:

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,

很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。

2、使用模块的好处:

<1> 提高了代码的可维护性,其次,可以被其他地方引用。

<2> 使用模块可以避免函数名和变量名冲突。

3、模块分类

分为三种:

<1> 内置标准模块(又称标准库)执行help('modules')查看所有python自带模块列表。

<2> 第三方开源模块,可通过pip install 模块名 联网安装。

<3> 自定义模块

4、模块调用的方法

import module

from module import xx

from module.xx.xx import xx as rename

from module.xx.xx import

注意:模块一旦被调用,就相当于执行了另一个py文件里的代码。

5、自定义模块

所谓自定义模块,就是创建了一个.py文件,就可以称之为模块,可以在另一个程序里导入。

6、模块查找路径

自定义模块只能在当前路径下的程序里才能导入,换一个目录再导入自己的模块就报错说找不到了, 这是为什么?

这与导入路径有关

import sys

print(sys.path)

输出:['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip','/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',

'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload','/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

python解释器会按照列表顺序去依次到每个目录下去匹配你要导入的模块名,只要在一个目录下匹配到了该模块名,就立刻导入,不再继续往后找。

注意:列表第一个元素为空,即代表当前目录,所以你自己定义的模块在当前目录会被优先导入。

7、开源模块安装与使用

https://pypi.python.org/pypi 是python的开源模块库,如何从这个平台上下载代码呢?

1.直接在上面这个页面上点download,下载后,解压并进入目录,执行以下命令完成安装

编译源码 python setup.py build安装源码 python setup.py install

2、直接通过pip安装pip3 install paramiko #parmiko 是模块名

pip命令会自动下载模块包并完成安装,软件一般会被自动安装你python安装目录的这个子目录里/your_python_install_path/3.6/lib/python3.6/site-packages

pip命令默认会连接在国外的python官方服务器下载,速度比较慢,你还可以使用国内的豆瓣源,数据会定期同步国外官网,速度快好多

sudo pip install -i http://pypi.douban.com/simple/ alex_sayhi--trusted-host pypi.douban.com #alex_sayhi是模块名

二、包(package)

└── my_proj

├── crm #代码目录

│ ├── admin.py

│ ├── apps.py

│ ├── models.py

│ ├── tests.py

│ └── views.py

├── manage.py

└── my_proj #配置文件目录

├── settings.py

├── urls.py

像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包。

crm/views.py内容

def sayhi():

print('hello world!')

通过manage.py调用

from crm import views

views.sayhi()

执行manage.py,pthon3中可以执行,但python2会出问题。包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。

在crm目录下创建一个空文件__int__.py ,再执行一次就可以了。

注意,在python3里,即使目录下没__int__.py文件也能创建成功,猜应该是解释器优化所致,但创建包还是要记得加上这个文件 。

跨模块导入

如何实现在crm/views.py里导入proj/settings.py模块呢?

直接导入会报错找不到模块。

因为路径找不到,proj/settings.py 相当于是crm/views.py的父亲(crm)的兄弟(proj)的儿子(settings.py),

settings.py算是views.py的表弟啦,在views.py里只能导入同级别兄弟模块代码,或者子级别包里的模块,

根本不知道表弟表哥的存在。该怎么做呢?

添加环境变量,把父亲级的路径添加到sys.path中,就可以了,这样导入 就相当于从父亲级开始找模块了。

#crm/views.py中添加环境变量

importsys ,os

BASE_DIR= os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印当前被执行的模块.py文件相对路径,注意是相对路径

print(BASE_DIR)

sys.path.append(BASE_DIR)from proj importsettingsdefsayhi():print('hello world!')

注意;此时在proj/settings.py写上import urls会有问题, 因为现在的程序入口是views.py , 你在settings.py导入import urls,

其实相当于在crm目录找urls.py,而不是proj目录,若想正常导入,要改成如下:

from proj import urls #proj这一层目录已经添加到sys.path里,可以直接找到

print('in proj/settings.py')

三、绝对导入和相对导入

├── __init__.py

├── crm

│ ├──__init__.py

│ ├── admin.py

│ ├── apps.py

│ ├── models.py

│ ├── tests.py

│ ├── views.py#from ..proj import settings

├── manage.py

└── proj

├──__init__.py

├── settings.py#from .import urls

├── urls.py

└── wsgi.py

#views.py里代码

from ..proj importsettingsdefsayhi():print('hello world!')print(settings.DATABASES)

这样执行会报错。

在涉及到相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。

否则由于不被视作package,无法利用package之间的嵌套关系实现python中包的相对导入。

文件夹被python解释器视作package需要满足两个条件:

文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。

不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。

所以这个问题的解决办法就是,既然你在views.py里执行了相对导入,那就不要把views.py当作入口程序,

可以通过上一级的manage.py调用views.py。

from .. import models会报错的原因是,这句代码会把manage.py所在的这一层视作package,但实际上它不是,

因为package不能是顶层入口代码,若想不出错,只能把manage.py往上再移一层。

#正确的代码目录结构如下

packages/├──__init__.py

├── manage.py#from my_proj.crm import views

└── my_proj

├── crm

│ ├── admin.py

│ ├── apps.py

│ ├── models.py

│ ├── tests.py

│ ├── views.py#from . import models; from ..proj import settings

└── proj

├──__init__.py

├── settings.py

├── urls.py

└── wsgi.py

再执行manage.py就不会报错了。

python模块导入_Python模块及其导入相关推荐

  1. python模块导入_Python模块导入详解

    定义 模块:用来从逻辑上组织Python代码(变量.函数.类.逻辑)去实现一个功能.本质就是.py结尾的Python文件. 包:用来从逻辑上组织模块的(可以放一堆模块在目录下).本质就是一个目录(必须 ...

  2. python模块导入_python模块导入

    不同的执行方式: 从IDE中执行,python程序由IDE设置环境决定. 从系统中执行,python程序由环境变量中的系统变量path决定,从上往下选择. 模块导入顺序: 系统包优先级最高 > ...

  3. python导入模块语句_python 模块导入详解

    本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句相关的概念.通常,导入模块都是使用如下语句: import...import... as ...from ... im ...

  4. py文件 添加模块映射_Python模块的定义,模块的导入,__name__用法实例分析

    本文实例讲述了Python模块的定义,模块的导入,__name__用法.分享给大家供大家参考,具体如下: 相关内容: 什么是模块 模块的导入 模块的导入 自模块的导入 同级目录导入 不同级目录导入 目 ...

  5. python3导入模块原理_Python模块导入机制与规范

    前言 在我们平常工程里使用Python的过程中,经常需要解决各个模块的导入问题,而且也常常遇到引用路径查找不到.交叉导入模块等等问题,故写这篇文章,旨在讲述Python的模块导入机制和我们平时大型项 ...

  6. python所有模块图解_Python模块结构和布局

    用模块来合理组织你的Python代码是简单又自然的方法.你应该建立一种统一且容易阅读的结构,并将它应用到每一个文件中去.下面就是一种非常合理的布局: (1) 起始行(Unix) (2) 模块文档 (3 ...

  7. python模块手册_python模块说明

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python模块说明:类似于函数式编程和面向过程编程,函数式编程则完成一个功能, ...

  8. python模块讲解_python模块详解

    使用python时,常常会涉及到库的调用,这就需要掌握模块的基本知识. 本文分为如下几个部分概念说明 模块的简单调用 包的导入 特殊的__init__.py文件 导入模块的搜索路径 __all__ 绝 ...

  9. python模块使用_PYthon模块使用教程(最新).doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspPython PYthon模块使用教程(最新).doc63页 本 ...

最新文章

  1. 在VC6.0中创建工程并输入源代码
  2. Delphi中运行时改变panel的位置及大小
  3. 前端学习(1509):单页应用SPA特点
  4. 在java程序中怎么造成死锁_java – 了解为什么在此实现中发生死锁
  5. h5端呼起摄像头扫描二维码并解析
  6. CCF CSP202012-2期末预测之最佳阈值
  7. 不要进行过度设计,某一层存在真的有意义吗?是否可以更简单。
  8. linux查看系统启动时间
  9. Java使用OpenOffice实现Office系列文件转Pdf
  10. 独奏骑士服务器维护,独奏骑士最强流派天赋加点攻略
  11. ZZULIOJ:1059: 最高分
  12. 开源生产排程aps(Advanced Planning and Scheduling)软件介绍
  13. 基于51单片机的蓝牙小车制作【新手向
  14. 山东农村商业银行计算机笔试,2021年山东农村商业银行笔试备考:计算机科目高分复习方法...
  15. 支付产品理解第一篇——使用第三方支付的信息流与资金流
  16. Yanmar(洋马)发动机SPN-FMI代码在仪表显示
  17. Linux那些事儿之我是EHCI(5) 2008年的这一场雪
  18. cesium---图加载
  19. 使用降噪自编码器【DAE】对车流量数据进行降维
  20. C/C++实现矩阵/图形90°旋转

热门文章

  1. mysql snowflake_雪花算法-snowflake
  2. 修改字段类型_PostgreSQL 关于字段类型的修改 谣言与止谣
  3. python 数据分析-读写数据csv、xlsx文件
  4. 1.数据库基本概念知识
  5. 学生管理系统代码赏析
  6. 怎么画单极交流放大电路波形图_区别在哪?:VCC、VDD、VEE、VSS、数字地、模拟地、信号地、交流地、直流地!...
  7. JavaWeb笔记:CSS总结
  8. javascript 基础知识1 数据类型
  9. Zxing二维码重复扫描,不退出。
  10. Chap-4 Section 4.2.4 指令修正方式