美文网首页程序员大数据 爬虫Python AI Sql
03-Python-包&模块-包和模块的一般操作

03-Python-包&模块-包和模块的一般操作

作者: 撩课学院 | 来源:发表于2018-12-05 08:08 被阅读8次

学习地址:

撩课-Python大数据+人工智能1
撩课-Python大数据+人工智能2
撩课-Python大数据+人工智能3
撩课-Python大数据+人工智能4
撩课-Python大数据+人工智能5
撩课-Python大数据+人工智能6
撩课-Python-GUI编程-PyQt5

1.包/模块的创建

创建模块

 直接创建一个.py文件即可

创建包

  创建一个文件夹, 文件夹内务必创建一个__init__.py这个文件
  其实3.3版本往后可以不用创建
  但是为了代码版本兼容, 以及做一些其他包处理操作, 目前还是建议创建
  __init__.py文件作用
  第一次导入这个包的时候, 都会自动的执行这个文件

创建多层级包

            在包里面直接创建另外一个包即可, 可以无限级嵌套

包/模块的基本信息

        包和模块名称
            模块名称
                去除.py后缀名后的文件名称
                例如
                    sz.py
                        是一个模块
                    模块名称是
                        sz

包名

      文件夹名称
        包和模块的存放位置
            import os
            print(os.__file__)
                会打印os模块所在路径
        查看包和模块里面的内容
            dir(模块/包名称)
    导入包/模块的方式
        友情提醒
            这一块知识点本身比较碎; 需要自己多做实验慢慢体会掌握

理论基础

    导入模块的作用
    可以使用这个模块里面的内容

2.常规导入

            方式
                import M
                    导入单个模块
                    解释
                        M
                            模块
                            如果是某个包里的模块, 可以通过点语法来定位
                import M1, M2
                    导入多个模块
                    解释
                        M1
                            模块
                                如果是某个包里的模块, 可以通过点语法来定位
                        M2
                            模块
                                如果是某个包里的模块, 可以通过点语法来定位
                import M as 别名
                    导入模块时,给模块起个别名
                    应用场景
                        简化资源访问前缀
                            例如
                                源码
                                    调用资源时
                                        xx1.xx2.xx3.xx4.资源
                                    import xx1.xx2.xx3.xx4
                                优化后
                                    import xx1.xx2.xx3.xx4 as hehe
                                    调用资源时
                                        hehe.资源
                        增加程序的扩展性
                            例如
                                if file_extension == "txt":
    import txt_parse
    txt_parse.open()
    txt_parse.read()
    txt_parse.close()
elif file_extension == "doc":
    import doc_parse
    doc_parse.open()
    doc_parse.read()
    doc_parse.close()
                                优化后
                                    if file_extension == "txt":
    import txt_parse as parse
elif file_extension == "doc":
    import doc_parse as parse

parse.open()
parse.read()
parse.close()
            注意
                使用时,需要指明资源的模块名称
                    例如:p1.my_moudle.run()
            补充
                如果导入的是一个包
                    默认不会导入任何模块
                    解决方案
                        1. 在__init__文件中, 再次导入需要的模块
                        2. 应该以from ... import ... 的形式导入

from语句导入

            作用
                想要导入一个模块或包中的某个部分
                从哪里, 导入哪些资源到当前位置
            语法
                from A import B [as C]
                    理论(sz)
                        明确一点
                            只能从大的地方找小的东西
                            从盆里面找碗是可以
                            反之, 从碗里面找盆就有问题
                        按照大小顺序可以将几个资源排序
                            包 > 模块 > 模块资源
                        注意面向关系
                            模块里面只能看到模块资源
                    最终组合
                        包里面只能看到模块
                            看不到模块资源
                        1. 从包中导入模块
                            单个
                            多个
                            起别名
                            包有多层级
                        2. 从模块中导入模块资源
                            单个
                            多个
                            起别名
                            模块有多层级
                    注意
                        保证B部分路径最简
                            原则: 从那里能看到谁才能导入谁
                        举个栗子
                            from 大包 import 小包.模块
                                from 大包.小包 import 模块
                            from 包 import 模块.子资源
                                from 包.模块 import 子资源
            特例
                from 模块 import *
                    * 代表是所有非下划线_开头资源导入到当前位置
                    配合__all__
                        是一个列表
                            __all__ = ["a", "run", "Person"]
                            列表中每个元素都是字符串
                        代表到时*能匹配到的资源
                    慎用
                        因为你无法预知到时会导入哪些内容到当前位置,容易产生变量名冲突
                from 包 import *
                    会识别__init__文件中__all__列表中的指定模块

注意

            1. 导入模块后具体做了什么事?
                第一次导入时
                    1. 在自己当下的命名空间中, 执行所有代码
                    2. 创建一个模块对象, 并将模块内所有顶级变量以属性的形式绑定在模块对象上
                    3. 在import的位置, 引入import后面的变量名称到当前命名空间
                第二次导入时
                    直接执行上述第3步
                结论
                    注意: 两种导入方式都会大致执行以上的步骤
                    1. 多次导入模块, 该模块并不会执行多次
                    2. 两种导入方式不存在哪一种更省内存
                        区别在于把哪一部分内容拿到当前位置来用
            2. 从哪个位置找到需要导入的模块?
                第一次导入时
                    按照模块检索路径顺序去找
                        第一级
                            内置模块
                        第二级
                            sys.path
                                构成
                                    当前目录
                                        import os
                                        os.getcwd()
                                    环境变量 PYTHONPATH 中指定的路径列表
                                    特定路径下的.pth文件中的文件路径列表
                                        查看特定路径
                                            import site
                                            print(site.getsitepackages())
                                        后缀名为.pth文件
                                            名称随意
                                            一个路径占一行
                                    在 Python 安装路径的 lib 库中搜索
                                注意
                                    自己测试优先级顺序
                            追加路径的方式
                                1. 直接修改sys.path
                                    只作用于本次
                                2. 修改环境变量
                                    PYTHONPATH
                                    注意
                                        仅仅在shell中有效
                                        pycharm需要另外一种设置方式
                                3. 添加.pth文件
                第二次导入时
                    从已经加载过的模块中去找
                    查看已加载模块
                        import sys
                        sys.modules
            3. 导入模块的常见场景?
                局部导入
                    在某个局部范围内导入模块
                        在其他范围无法使用
                    所以,如果想要全局范围都能使用,在文件顶部导入相关模块
                    使用场景
                        当一个模块使用并不频繁, 而且导入时间过长时
                覆盖导入
                    场景1
                        自定义模块和非内置的标准模块重名
                            根据前者存储位置, 有可能前者会覆盖后者
                        结论
                            自定义模块命名不要与后者重名
                    场景2
                        自定义模块和内置模块重名
                            内置肯定覆盖自定义
                        你又特别想用自定义模块
                            使用from...import... 指明绝对路径进行导入
                循环导入
                    假设有两个模块A, B
                    模块A内导入了模块B; 模块B内也导入了模块A;这样就造成了循环导入
                可选导入
                    概念
                        两个功能相近的包, 根据需求优先选择其中一个导入
                    场景
                        有两个包A和B都可以实现相同的功能
                        想优先使用A; 而且需要做到在没有A的情况下, 使用B做备选
                    实现
                        使用try...except...进行实现
                包内导入
                    绝对导入和相对导入
                        理论
                            Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的
                            包内导入即是包内的模块导入包内部的模块
                        概念
                            绝对
                                参照sys.path路径进行检索
                                例如
                                    指明包名或模块名
                                        import a
                                        from a import b
                                注意
                                    以上结论基于Python3.x之后
                            相对
                                使用.来指代相对路径
                                    .
                                        根据模块名称所获取的当前目录
                                    ..
                                        根据模块名称所获取的上层目录
                                例如
                                    from . import a
                                    from .. import a
                                注意
                                    解释器是根据模块名称而确定层级关系, 并不是存放目录
                                    可以通过__name__来查看模块名称
                        补充
                            Python3.x版本之前, 直接import a
                                优先从本地当前目录查找, 并非是sys.path
                                解决方案
                                    from __future__ import absolute_import
                                    使用上述语句, 改变import 行为
                        结论
                            正确用法
                                包内导入
                                    使用相对导入
                                包外导入
                                    使用绝对导入

三方包/模块的安装和升级

        理论
            1. 为什么要安装三方模块?
                因为标准模块有时不能满足我们的需求
            2. 三方模块和标准模块的区别和联系?
                首先,两者都是为了完成某个功能需求
                标准模块
                    由官方发布
                    使用可靠,几乎没有bug,即使有也有团队立即修复
                    有健全的使用文档说明
                三方模块
                    由网友提供,可能有如下缺点
                    文档不健全
                    更新不及时或者根本不更新
                    功能有bug
            3. 为什么标准模块不做的超级全?
                每个人的需求不同,做并集会导致整个文件非常庞大,你愿意一次性下载好几个G而且有可能根本用不到文件吗?
                所以,做了需求的交集;大多数人都需要的功能被放到了标准模块
            4. 什么叫模块的安装?
                三方模块本质就是别人写的代码
                所谓安装,就是想办法把这个代码搞到本地,让我们可以来用
            5. 安装的方式?
                源码安装
                    自己手动去某个地方去下载,然后安装到本地
                包管理器安装
                    更加简单的自动化的为用户安装管理包和模块
                    只需要一个或几个命令就可以完成
            6. 包管理项目简史
                distutils
                    产生背景
                        三方库的存在是必然
                        为了让用户更好的使用和管理三方库,官方就开发了这个项目
                        1998-2000
                    角色定位
                        属于Python标准库(官方发行)
                    功能特点
                        只需要通过合适的命令运行一个叫做setup.py的文件即可
                        只能处理简单的包安装
                setuptools
                    产生背景
                        自从distutils开发停止之后,一些开发人员在它的基础之上进行开发自己的工具
                        其中最成功的的就是setuptools
                            说明还有其他很多不太成功的
                    角色定位
                        属于三方库
                    功能特点
                        更加频繁的更新
                        更多的高级功能
                            自动依赖处理
                            egg分发格式
                            easy_install命令
                        与distutils的兼容
                distribute
                    产生背景
                        setuptools开发变缓慢了(不支持Python3),以为会如同distutils一样停止开发
                        另一批开发人员又基于setuptools(fork)创建了名为distribute的库
                    角色定位
                        依然是三方库
                    功能特点
                        bug更少
                        支持Python3
                    现状
                        2013年setuptools和distribute两个开发组织决定再次合并到setuptools项目中
                        所以,distribute被废弃
                            setuptools又成了正主
                ...
                    目前为止有很多包管理工具
                        disutils2
                        distlib
                        ...
                    但是官方支持的且认可度高的就两个
                        distutils
                            官方标准库
                            从python2 到python3.6全部内置支持
                        setuptools(合并distribute后的)
                            三方库
                            部分 Python 子社区已然是事实上的标准
                    更多包管理项目请看
                        https://packaging.python.org/key_projects/
                总结
                    distutils
                        是标准库的一部分
                            能处理简单的包的安装
                        通过setup.py进行安装
                    setuptools
                        现在的包安装标准
                            曾经差点被废弃,现在有继续开发
                        自带了一个easy_install 安装脚本
                            后来出现个更牛逼的pip安装脚本来替代它
                        引入了.egg格式
                            后来出现个更好的whl格式来代替它
                    setuptools是目前的主要选择
            7. 常见已发布三方包和模块的形式?
                源码
                    单文件模块
                    多文件模块(由包管理工具发布的项目)
                        基于distutils工具发布的项目特点
                            包含setup.py文件
                        setuptools也是基于distutils
                .egg
                    setuptools引入的一种格式
                    setuptools可以识别它,安装它
                .whl
                    本质是.zip格式
                    是为了替代egg
            8. 安装方式
                本地安装
                    对于单文件模块
                        直接拷贝到相关文件夹就可以
                    对于带setup.py的文件
                        通过setup.py 脚本即可安装
                    .egg文件
                        使用setuptools的自带的安装脚本 easy_install进行安装
                    .whl
                        使用pip进行安装
                远程安装
                    easy_install
                    pip
                    pycharm
                安装源
                    Python官方
                        https://pypi.python.org/simple
                    豆瓣
                        http://pypi.douban.com/simple/
                    阿里
                        http://mirrors.aliyun.com/pypi/simple/
                    中国科学技术大学
                        https://pypi.mirrors.ustc.edu.cn/simple/
                    服务器在国外,所以国内访问有可能非常慢,网络不好
                    镜像地址,服务器在国内,所以网络比较通畅,速度快!

模块安装的具体操作

            本地安装
                对于单文件模块
                    直接拷贝到相关文件夹就可以
                    存放位置
                        sys.path中所包含的路径都可以
                        一般存放在Lib/site-package文件夹中
                对于带setup.py的文件
                    步骤1
                        打开命令行工具
                    步骤2
                        切换到setup.py文件所在的目录
                    步骤3
                        执行命令python setup.py install
                            Python2.x
                        执行命令python3 setup.py install
                            Python3.x
                    注意
                        如果项目是使用distutils打包的,上述命令可以直接使用
                            因为distutils是Python自带模块,不需要安装
                        如果项目是使用setuptools打包的,有可能上述命令会报错
                            错误
                                
                            原因
                                setuptools属于三方模块,并非标准模块,所以有可能没有安装
                            解决方案
                                安装setuptools
                        离线安装
                            但是有时候, 包, 依赖的三方包
                            依然需要联网, 让它自动的给我们下载安装这些三方的包
                .egg文件
                    使用setuptools的自带的安装脚本 easy_install进行安装
                        要求先安装setuptools
                    语法
                        easy_install xxx.egg
                .whl
                    使用easy_install安装
                        语法
                            easy_install xxx.whl
                    使用pip进行安装
                        推荐
                        安装pip
                            通过easy_install 远程或者本地安装
                            远程
                                easy_install pip
                                自动下载,自动安装
                            本地
                                .egg
                                .whl
                                .tar.gz
                        语法
                            pip install xxx.whl
            远程安装
                概念
                    自动的从远程地址检索->下载->安装某个模块
                安装方式
                    easy_install xxx
                        需要先安装setuptools
                    pip install xxx
                        需要先安装pip
                疑问
                    从哪个地方下载的包安装到本地的?
                        默认:https://pypi.python.org/
                    安装在本地的哪个地方了?
                        一般在Lib/site_packages

模块的其他操作

easy_install

            详细介绍地址
                http://peak.telecommunity.com/DevCenter/EasyInstall
            其他常用操作
                多个Python版本的切换安装
                    场景
                        如果一台电脑上,既装了Python2.x 也装了 Python3.x
                            两个版本环境都装了setuptools, 都可以使用easy_install
                        那么,到时候,如何通过easy_install 安装到指定版本的环境中?
                    解决方案
                        easy_install-N.N
                            N.N用于指明安装在哪个Python版本环境中
                        例如
                            Python2.7.14
                                easy_install-2.7 requests
                            Python3.6.3
                                easy_install-3.6 requests
                安装指定版本包
                    场景
                        如果一个包有多个版本;而有的项目使用的是某个特定版本,那该如何安装?
                    解决方案
                        easy_install “库名 限定符 版本[, 限定符 版本]”
                            中括号部分代表可选
                            库名
                                包的名称
                            限定符
                                <
                                >
                                <=
                                >=
                                ==
                        例如
                            easy_install "requests >= 2.14.1"
                                安装大于或等于2.14.1版本的最新包
                            easy_install "requests > 1.0, < 2.0"
                                安装大于1.0 并且小于 2.0的包
                            easy_install "requests == 2.14.1"
                                安装2.14.1版本的包
                                如果已经安装,则切换到这个版本
                            ...
                升级三方包
                    场景
                        有些包的作者,修复了之前的某个Bug; 本地需要更新到最新版本
                    解决方案
                        easy_install --upgrade(-U) 库名
                        例如
                            easy_install --upgrade requests
                卸载三方包
                    场景
                        有些已经安装的包,因某些原因,想要删除(比如:使用这个包的项目已经不需要)
                    解决方案
                        方式1:手动卸载
                            删除在easy_install.pth中的包记录
                            删除对应的包文件
                        方式2:easy_install -m 包名称
                            效果
                                删除在easy_install.pth文件中对应包的记录
                            注意
                                并没有真正的把.egg包文件删除
                                    不删除原因
                                        方便多版本切换
                                    强迫症选手可以选择手动删除
                                不会删除依赖包
                                    本身也不应该删除
                                    因为这个依赖包,有可能也被其他三方包依赖
                        补充
                            easy_install.pth作用
                                记录着当前通过easy_isntall已经安装的模块
                                    多个版本的模块,值记录最后一次安装的
                                用于导入模块时的路径检索
                            -m的真正含义
                                支持多版本,可在运行时进行切换
                                    easy_install.pth 对应的库的记录删除
                                解释
                                    不直接指明包的某个版本,使得用户无法直接导入
                                        删除在easy_install.pth文件中对应包的记录
                                    用户如果想使用某个版本,需要使用如下步骤
                                        import pkg_resources
                                        pkg_resources.require("requests==2.18.4")
                                        import requests
                切换三方安装源
                    场景
                        有可能Python官方库的托管平台,服务器在国外的原因,会导致安装速度慢,甚至失败
                    解决方案
                        easy_install修改文件
                            setuptools\command\easy_install.py
                                
                        安装源
                            Python官方
                                https://pypi.python.org/simple
                            豆瓣
                                http://pypi.douban.com/simple/
                            阿里
                                http://mirrors.aliyun.com/pypi/simple/
                            中国科学技术大学
                                https://pypi.mirrors.ustc.edu.cn/simple/
                            服务器在国外,所以国内访问有可能非常慢,网络不好
                            镜像地址,服务器在国内,所以网络比较通畅,速度快!

pip

            详细介绍地址
                https://pip.pypa.io/en/stable/
            其他常用操作
                切换安装源
                    一次性修改
                        pip install --index-url https://pypi.douban.com/simple/ requests
                            指定检索
                            仅仅只到某一个地址检索指定包
                        pip install --extra-index-url https://pypi.douban.com/simple/ requests
                            扩展检索
                            除下到官方的pypi地址检索,也会到扩展的地址检索
                    永久性修改
                        在c://users/你的用户名/下
                            创建pip文件夹
                            在pip文件夹中创建pip.ini文件
                        文件内容
                            [global]
                            index-url = http://pypi.douban.com/simple/
                            [install]
                            trusted-host=pypi.douban.com
                    安装源
                        Python官方
                            https://pypi.python.org/simple
                        豆瓣
                            http://pypi.douban.com/simple/
                        阿里
                            http://mirrors.aliyun.com/pypi/simple/
                        中国科学技术大学
                            https://pypi.mirrors.ustc.edu.cn/simple/
                        服务器在国外,所以国内访问有可能非常慢,网络不好
                        镜像地址,服务器在国内,所以网络比较通畅,速度快!
                安装在不同的Python版本环境中
                    方式1
                        python -m pip install requests
                        python3 -m pip install requests
                    方式2
                        py -2 -m pip install requests
                        py -3 -m pip install requests
                    理论
                        Python的安装包实际上在系统中安装了一个启动器py.exe
                            C:\Windows\py.exe
                        启动器可以调用不同版本的Python去执行某些脚本
                            py -2
                            py -3
                查看包
                    所有已经安装的
                        pip list
                    不被依赖的包
                        pip list --not-required
                    过期的包
                        pip list --outdated
                    查看某个包的具体信息
                        pip show xxx
                搜索包
                    pip search xxx
                    pip search -i 检索地址 xxx
                        默认为Python官方的库地址
                         https://pypi.python.org/simple
                    例如
                        pip search peppercorn
                安装特定版本
                    pip install "requests == 2.18"
                    pip install "requests >= 2.0"
                    pip install "requests > 2.0, < 3.0"
                升级包
                    pip install --upgrade xxx
                    注意
                        pip install xxx
                        表示:只有当xxx库不存在的时候,才会安装最新版本
                卸载包
                    pip uninstall xxx
                        如果是通过easy_install安装的
                            会自动删除easy_install.pth文件中对应包路径
                            会自动删除对应.egg包的原文件
                        如果是通过pip install 安装的,会直接删除对应包文件
                生成冻结需求文本
                    场景
                        可以将当前安装的三方包记录,存储到指定的文件当中
                        以后,就可以根据这个需求文本,去安装三方包
                    用法
                        pip freeze > requirements.txt
                            用来将当前环境下安装的三方包输出到指定文件中
                            因为输出的文件,以后是为了让别人通过pip安装
                            所以,能看到的列表中自动过滤了pip, setuptools
                            可通过 --all参数查看所有包
                根据冻结需求文本安装
                    pip install -r requirements.txt

补充

            三方模块的版本规则
            三部分组成n1.n2.n3
                n3
                    当版本的bug修复之后,n3 + 1
                n2
                    新增了某一个小功能
                        n2 + 1
                n1
                    修改了之前的功能,或者, 添加了一个新功能(修改了之前的api)
                    n1 + 1
            1. 我发布了一个库
                1.0.0
            2.之前发布的库, 出现了一个bug, 然后我再本地修复了这个bug, 并且进行再次的发布
                1.0.1
            3. 往后, 在这个库里面, 新增了一个小功能
                1.1.0
            4.发现1.1.0版本出现了一个bug, 修复 -》 发布
                1.1.1
            4. 新增一个小功能
                1.2.0
            6. 发布了一个超级大的功能, api, 发布
                2.0.0
``

相关文章

网友评论

    本文标题:03-Python-包&模块-包和模块的一般操作

    本文链接:https://www.haomeiwen.com/subject/stcjcqtx.html