一、模块

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中添加环境变量
import sys ,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 import settings def sayhi():
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 import settings
def sayhi():
print('hello world!') print(settings.DATABASES)

这样执行会报错。

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

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

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

  1. 文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
  2. 不能作为顶层模块来执行该文件夹中的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支持相对导入,但对模块间的路径关系要求比较严格,处理不当就容易出错,
  不建议使用。 以上内容摘录与总结于:https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/mo-kuai-3001-bao-jie-shao-he-xiang-guan-yu-fa.html
 

Python模块及其导入的更多相关文章

  1. 11、python模块的导入

    前言:本文主要介绍python模块的导入,包括模块的定义.模块的作用.导入方式以及模块的搜索路径. 一.模块的定义 python模块(module),简单来说就是一个python文件,以.py结尾,文 ...

  2. 6.python模块(导入,内置,自定义,开源)

    一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过 ...

  3. python模块以及导入出现ImportError: No module named 'xxx'问题

    python中,每个py文件被称之为模块,每个具有__init__.py文件的目录被称为包.只要模块或者包所在的目录在sys.path中,就可以使用import 模块或import 包来使用如果你要使 ...

  4. 浅谈python模块的导入操作

    1.什么是模块 在Python中有一个概念叫做模块(module). 所谓模块,就是将代码量较大的程序分割成多个有组织的,彼此独立但双能互相交互的代码片段, 这些自我包含的有组织的代码段就是模块. 2 ...

  5. Python模块的导入以及软件开发规范

    Python文件的两种用途 1 . 当脚本直接使用,直接当脚本运行调用即可 def func(): print("from func1") func() 2 . 当做模块被导入使用 ...

  6. Python——模块以及导入注意事项

    在Python中,每一个文件都应该是可以被导入的. 每一个独立的python文件都是一个模块 在导入文件时,文件中所有没有任何缩进的代码都会被执行一遍. 而在实际应用时,每个模块都是有专人负责独立开发 ...

  7. dive into python:模块的导入和搜索文件路径的配置

    1.Python中导入模块:import sys:相当于Java中的导入包.类. 比如,我们导入sys模块,使用:import sys; 2.Python中调用函数的时候,会从默认配置的库文件夹中(s ...

  8. python 模块安装导入

    一.定义 python模块就是一个.py文件,一个模块中可以有多个函数,在使用模块时,只需要import下,就可以使用模块中的函数功能.import模块的过程相当于把这个py文件中的所有内容都执行一遍 ...

  9. python模块的导入详解

    一:一个小问题:什么是模块? 我的理解是:有通用功能的文件的集合. 二:为什么要使用模块? 我们通常为了使自己以前写的东西保存下来,会把东西写入文件中保存下来,必要时我们把这些文件当脚本去执行,也可以 ...

随机推荐

  1. 【git】git知识梳理(二):服务器

    (四) 远程仓库通常只是一个裸仓库(bare repository):.git子目录 四种协议:本地传输, SSH, GIT, HTTP, 除了http,均需要在服务器端安装运行git. SSH:SS ...

  2. Matlab批量读取文件夹文件

    现在有一个文件夹 里面有50个左右的txt文件 每个文件大概三万行 两列 第一列是字符串 第二列是浮点数字 我只需要读第二列 现在我想写一个.M文件 批量读取这个文件夹里的txt文件 读取完以后的数组 ...

  3. [qt][问题记录] 无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll

    无法定位程序输入点 _ZdaPvj 于动态链接库 libstdc++-6.dll 该问题是没有打包库的问题,之所以出现这个问题的是直接用系统自带的命令行使用qt的windeployqt命令导致提供的库 ...

  4. Freemarker 自定义标签 实现TemplateDirectiveModel

    1 自定义标签需要实现TemplateDirectiveModel这个接口中的execute方法 实例代码如下 public class UserListDirective implements Te ...

  5. SSM框架——Spring+SpringMVC+Mybatis的搭建

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One  ...

  6. 剑指offer-第六章面试中的各项能力(数字在排序数组中出现的次数)

    题目:统计一个数字在排序数组中出现的次数. 思路:采用二分查找,找到该数字在数组中第一次出现的位置,然后再找到组后一个出现的位置.两者做减法运算再加1.时间复杂度为O(logn) Java代码: // ...

  7. c#模拟键盘输入

    System.Windows.Forms.SendKeys.SendWait("j");

  8. 关于matlab浮点转定点总结

    1,算式长度不应该太长,否则在转换过程中提示位宽超过128位,(用的64位matlab),长算式改为短算式就可以了. 2,不要过于相信推荐字长,有些地方需要更高的精度,如果用推荐字长,可能结果误差较大 ...

  9. saas服务提供商

    这段时间接触了不少行业的东西,这里谈几点肤浅的看法.从市场行情上讲,SaaS风口还在,不过热度明显向大数据.物联网.人工智能.区块链等转移. 做得比较好的有这些SaaS提供商,每个领域的都有那么几家的 ...

  10. VS2010环境下MFC使用DataGrid绑定数据源

    如果MFC的软件中 使用DataGrid控件后,在别的电脑上不能运行行,需要拷贝一个 MSDATGRD.ocx 和msstdfmt.dll  文件在软件的目录中,并写一个批处理文件 reg.dat 文 ...