什么是模块?

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。

使用模块有什么好处?

  1. 最大的好处是大大提高了代码的可维护性.
  2. 使用模块还可以避免函数名和变量名冲突.

模块分类

模块分为三种:

  • 内置标准模块(又称标准库)执行help('modules')查看所有python自带模块列表
  • 第三方开源模块,可通过pip install 模块名 联网安装
  • 自定义模块

模块调用

import module

from module import xx

from module.xx.xx import xx as rename  

from module.xx.xx import *

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

自定义模块

这个最简单, 创建一个.py文件,就可以称之为模块,就可以在另外一个程序里导入.

当调用一个模块时,python到底从哪儿去找被调用的模块呢?

import sys
print(sys.path) # python会到sys.path输出的目录里去寻找被调用的模块.如果找不到被调用的模块,就会报错.

安装第三方模块:

1.在python交互模式下,进入到要安装的模块目录下.运行 python3 setup.py bulid. 运行结束后,再运行一次 python3 setup.py install  一般模块就安装成功了.默认安装在python安装目录下的lib\stie-packages

删除一个安装的模块.pip3 uninstall 模块名.

2. 在线安装模块.默认可以使用pip install 模块名  来安装.但是对于大体积的模块,会很慢,因为要从国外下载.建议使用豆瓣源下载安装.

--trusted-host pypi.douban.com是信任豆瓣源.不然安装不了.
pip install -i http://pypi.douban.com/simple/ alex_sayhi --trusted-host pypi.douban.com   #alex_sayhi是模块名

包的概念:

当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据库交互的都放一个文件夹,把与页面交互相关的放一个文件夹,像这样,一个文件夹管理多个模块文件,这个文件夹就被称为包.下面就是一个包

模块导入:

 from crm import views   # 调用级别目录下的模块.
import views # 这样导入的时候,会到python的环境变量里去找views文件,由于当前目录并不在环境变量中,所以会报错. # 注意,在上面的目录结构不变动的情况下,在python2中运行上面的导入模块目录会出错,在python2,组成包还有一个必不可少的文件'__init__.py'.
如果没有这个文件,python2默认这个'包'只是一个文件夹.python的包可以没有"__init__.py"这个文件.但是为了规范,python3也请建立一个__init__.py的文件.内容可以为空.

思考一个问题.如果我想从views里面调用proj里面的setting.py.该怎么实现呢?

# 在views.py中添加调用代码
from proj import settings
# 我们运行一下manager.py.发现竟然没有报错.这是为啥呢?
#注意了.当我们运行manager.py的时候,manager.py的当前路径已经加入到到python的环境变量中了.
当我们在views中调用settings的时候,其实是在manager的目录下,找到proj中的settings,在调用的.

上面是可以通过views调用proj下面的settings.但不是我想要的结果.我想直接从views里调用.就是说views是入口程序了.那又该怎么实现呢?

# 第一种方法.就是把my_proj这个目录添加到sys.path的环境变量中.
import sys
sys.path.append('D:\My Documents\PycharmProjects\OldBoy\chapter4-常用模块\packages\my_proj')
# 上面这种方法是可以用了.但是发现一个问题.如果我把这个文件发给别人,那么别人就无法执行了.因为这个绝对路径是我电脑自己的路径.别人电脑上的路径不可能和我的完全一样.
#第二种方法.既然我们的程序已经写好了项目目录层级.那么我们程序的目录结构是肯定不会再改变了.那么我们是不是只要获取我们程序目录前面的路径就可以了?
import sys
print(dir()) # 打印dir(),我们发现有一个__file__的文件.我们打印输入看看是什么
print(__file__)
#输出:
# D:/My Documents/PycharmProjects/OldBoy/chapter4-常用模块/packages/my_proj/crm/views.py
#原来就是我们当前运行程序的路径.
BASE_ADDRESS = os.path.dirname(os.path.dirname(__file__))
print(BASE_ADDRESS)
sys.path.append(BASE_ADDRESS)  # 把上面的路径添加到环境变量中,再执行下面的调用,就不会报错了
from proj import settings
#这样我们就获取了程序的根目录.os.path.dirname(),会认为路径的最后一项是一个文件,就会把它去掉.

上面我们终于实现了在views中调用proj下面的settings.真爽呀.赶紧去python里执行试试.哼着小曲,啃着鸡爪.就去敲代码了.一执行程序,我擦.报错了.鸡爪也没心情吃了.为啥会报错呢?

我们来找找原因.

'''我们打印一下print(__file__)
发现路径变成了'views.py'.原来这个__file__获取的是程序运行的当前路径.并不是绝对路径,只是一个相对路径.
想要获取绝对路径,只能通过os.path.abspath(__file__)
然后再脱掉2层目录,就到了程序的根目录了.'''
BASE_DRESS = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DRESS)
print(BASE_DRESS)
#输出:
# D:\My Documents\PycharmProjects\OldBoy\chapter4-常用模块\packages\my_proj

再去python里试试.终于没有报错了.这次可以安安心心的啃鸡爪了.

from . import models
from ..proj import settings
'''
在linux中,可以通过"."表示上层目录 ".."表示上层目录的上一层. 文件夹被python解释器视作package需要满足两个条件: 1.文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
2.不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。
所以这个问题的解决办法就是,可以把manager.py往上移动一层就好了. '''

Day 4-1 模块的导入方法和路径的更多相关文章

  1. Python3 第五周大纲(模块,导入方法、import本质,导入优化,模块的分类)

    1.定义: 模块:逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能,本质是.py结尾的文件) 2.导入方法 import module_name,module_name2,...... ...

  2. Python之路(第十二篇)程序解耦、模块介绍\导入\安装、包

    一.程序解耦 解耦总的一句话来说,减少依赖,抽象业务和逻辑,让各个功能实现独立. 直观理解“解耦”,就是我可以替换某个模块,对原来系统的功能不造成影响.是两个东西原来互相影响,现在让他们独立发展:核心 ...

  3. Exporter - 实现默认的导入方法用于模块

    Exporter - 实现默认的导入方法用于模块 简介: In module YourModule.pm: package YourModule; require Exporter; @ISA = q ...

  4. 详解Python模块导入方法

    python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...

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

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

  6. python核心编写视频笔记--模块的导入

    1. 模块的重新导入 有这样的一种情况:我们首先创建了一个.py文件,输入模块代码.保存后,我们进入ipython3的环境,引入这个模块.然后再ipython3环境外修改这个模块文件,在ipython ...

  7. day 20 - 1 序列化模块,模块的导入

    序列化模块 首先我们来看一个序列:'sdfs45sfsgerg4454287789sfsf&*0' 序列 —— 就是字符串序列化 —— 从数据类型 --> 字符串的过程反序列化 —— 从 ...

  8. 查看python中模块的所有方法

    查看python中模块的所有方法     安装的python模块,现将查看方法总结如下 一.CMD命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交 ...

  9. python模块的导入的两种方式区别详解

    Python 有两种导入模块的方法.两种都有用,你应该知道什么时候使用哪一种方法.一种方法,import module,另一种是from module import,下面是 from module i ...

随机推荐

  1. C - 继续畅通工程 最小生成树

    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可).现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经 ...

  2. Loj#6183. 看无可看

    Loj#6183. 看无可看 题目描述 首先用特征根求出通项公式\(A_n=p\cdot 3^n+q\cdot(-1)^n\).通过给定的\(f_0,f_1\)可以解出\(p,q\). 然后我们要求的 ...

  3. 基于Django rest framework 和Vue实现简单的在线教育平台

      一.基于api前端显示课程详细信息 1.调整Course.vue模块 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2 ...

  4. 禅道Bug等级划分标准

    一.严重程序 P1:致命(该问题在测试中较少出现,一旦出现应立即中止当前版本测试) 阻碍开发或测试工作的问题:造成系统崩溃.死机.死循环,导致数据库数据丢失, 与数据库连接错误,主要功能丧失,基本模块 ...

  5. SQL优化工具SQLAdvisor使用

    一.简介在数据库运维过程中,优化SQL是业务团队与DBA团队的日常任务.例行SQL优化,不仅可以提升程序性能,还能够降低线上故障的概率. 目前常用的SQL优化方式包括但不限于:业务层优化.SQL逻辑优 ...

  6. foreach 與 reference 的雷

    前陣子公司定期技術研討會時,有人提出了一個問題. $arr = [1, 2, 3]; foreach ($arr as &$a) {} foreach ($arr as $a) {} var_ ...

  7. Python:Day44 Javascript

    一个完整的Javascript实现是由三个不同的部分组成: 1.核心 ECMA Javascript 2.浏览器对象模型(DOM) document object model (整合JS.html.C ...

  8. python日志等级输出删选

    有时候我们会删选一下输出的信息 当做日志进行文件保存 但是我们程序中有可能有自己不想存到日志文件中的输出信息 我们要做一些的删选  然后进行保存 代码如下: #!/usr/bin/python # - ...

  9. PHP中静态变量和函数引用返回

    这两天看看PHP写的框架CI,源代码中写了很多静态变量和函数引用. 官方文档地址:http://php.net/manual/zh/language.references.return.php 简单写 ...

  10. Vscode的python配置(macOS)

    _ 1. Vscode是一款开源的跨平台编辑器.默认情况下,vscode使用的语言为英文(en),以下步骤改为中文 打开vscode工具,使用快捷键组合[Cmd+Shift+p],在搜索框中输入“co ...