Python3快速入门(四)——Pyth

发布时间:2019-09-27 07:09:51编辑:auto阅读(1871)

    Python3快速入门(四)——Python包管理

    一、Python包简介

    1、包

    Python中使用包管理模块,包通常对应一个目录,必须在目录下创建一个init.py模块,init.py模块的模块名称即为包名,Python才会将目录解析为包。
    init.py文件内可以定义初始化包的内容,导入包的内容,限制包内模块的导出。
    init.py文件可以为空,也可以是一个模块,其模块名称为包名称。
    导入包或包的模块、变量、函数时,init .py文件会被自动执行。

    2、模块

    Python中一个.py文件就是一个模块。
    Python 中用 import 或者 from...import 来导入相应的模块。
    将整个模块(somemodule)导入,格式为: import somemodule
    从某个模块中导入某个函数或变量,格式为: from somemodule import somefunction
    从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
    将某个模块中的全部函数或变量导入,格式为: from somemodule import *

    import sys
    print('================Python import module==========================')
    print('命令行参数为:')
    for i in sys.argv:
        print(i)
    print("python 路径为", sys.path)
    
    from sys import argv, path  # 导入特定的成员
    
    print('================python from import===================================')
    print(argv)
    print(path)

    对导入的模块进行重命名
    Import package.module as name
    import导入包或模块时,如果导入模块较多需要换行,可以使用反斜杠,或是将使用小括号将包含所有的模块。
    包和模块不会被重复导入。

    3、模块的内置变量

    模块内部预定义了内置变量:
    name :当前模块名称
    package :当前模块所属包的名称
    doc :当前模块的注释内容
    file :当前文件

    # -*- coding:utf-8 -*-
    print("name: " + __name__)
    print("package: " + (__package__ or "当前模块不属于任何包"))
    print("doc: " + (__doc__ or "当前模块没有任何注释"))
    print("file: " + __file__)
    # name: __main__
    # package: 当前模块不属于任何包
    # doc: 当前模块没有任何注释
    # file: test.py

    如果某个文件被当作入口文件,内置变量package 没有值,name 值为maindoc file 值为文件名称(不含路径)。
    每个模块都可以任意写一些没有缩进的代码,并且在载入时自动执行,为了区分模块是主执行文件还是被调用的模块文件,Python引入了一个变量name,当文件是被调用时,name的值为模块名,当文件作为入口被执行时,name为'main'。因此,可以在每个模块中写上测试代码,测试代码仅当模块被Python直接执行时才会运行,代码和测试结合在一起,完美实现对测试驱动开发(TDD)的支持。

    if __name__ == "__main__":
        function_name()

    将一个模块文件作为模块执行而不是应用执行的命令如下:
    python3 -m package.module

    二、Python包管理

    1、导入包和模块

    import只能导入包和模块,不能直接导入变量或者函数。对于多层包嵌套后导致导入名称过长,可以为其重命名。

    import package1.package2.module_name
    import package1
    import package1.module_name
    import package1.package2.module_name as new_name

    导入包和模块时需要避免循环导入,两个或者多个模块文件互相导入会报错。
    Python在导入模块时,会执行模块里的所有内容,但多次导入只会执行一次。
    Import导入包或模块时,Python 解释器寻找模块的优先级如下:
    A、当前目录
    B、环境变量PYTHONPATH
    C、sys.path(list 类型)
    模块在被导入执行时,Python解释器为加快程序的启动速度,会在与模块文件同一目录下自动生成.pyc文件,.pyc是经过编译后的字节码。
    Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行。

    2、导入变量和函数

    导入某个模块的变量,多个使用逗号分隔
    from package1.package2.module_name import variable_name

    导入某个模块的函数,多个使用逗号分隔
    from package1.package2.module_name import function_name
    导入某个包的某个模块,多个使用逗号分隔
    from package1 import module_name
    导入模块的所有变量和函数
    from package1.module_name import *
    在模块内使用内置all属性指定本模块可以导出的变量或函数,外部导入只能使用指定的变量或函数。
    在模块(*.py)中使用导出all列表里的类、函数、变量等成员,否则将导出所有不以下划线开头(私有)的成员,在模块中使用all属性可避免在相互引用时的命名冲突。

    #!/usr/bin/python3
    
    __all__ = ["variable1", "variable2", "function_name1", "function_name2"]
    
    variable1 = 0
    variable2 = 0
    
    def function_name1(args):
        pass
    
    def function_name2(args):
        pass

    在导入变量和函数时,如果变量和函数太多需要换行,则可以使用反斜杠换行或是使用小括号修饰多个变量或函数。

    from package1.module_name import variable1, variable2 \
        variable3, function_name1
    
    from package1.module_name import (variable1, variable2, 
                                      function_name2, function_name2)

    3、顶级包

    顶级包与入口文件 main.py 的位置有关,与 main.py 同级的包是顶级包,因此main.py入口文件不属于任何包。

    4、相对导入

    相对导入是导入模块时指定被导入模块名称的相对路径。
    import 不支持相对导入,只能使用 from ... import ... 格式实现相对导入,
    “ .  ..  ... ” 来表示相对路径,一个点表示当前包,两个点表示上一级包,以此类推。
    入口文件中没有包的概念,因此不能使用相对导入。
    使用相对导入不要超出顶级包,入口文件同级的包都不能使用相对导入。
    在main.py如果作为模块执行时,可以使用相对导入,此时使用如下命令执行:
    python3 -m main.py

    5、绝对导入

    绝对导入是导入时必须指定从顶级包到被导入模块名称的完整路径,可以使用import 和 from ... import ...进行导入。

    6、init.py模块

    init.py文件存在包的根目录下,当包或者包中的任意模块或模块中变量、函数被导入时,init.py中内容会首先自动被执行。因此,init.py文件可以实现如下应用:
    A、限制本包的模块导入
    init.py中写入内置函数all,决定哪些模块可以被外部导入。
    __all__ = ["module_name1", "module_name2"]
    B、批量导入
    如果包内多个模块文件都需要用到某些模块文件时,可以在包的init.py文件中导入需要的模块文件,然后就可以在本包不同的模块文件中直接使用导入的模块 。

    三、Python项目结构

    1、Python文件结构

    通常,Python文件结构如下:

    #!/usr/bin/python3
    
    # 模块文档
    """
        This is an example.
    """
    
    # 模块导入
    import sys
    import os
    
    # 定义全局变量
    debug = True
    
    # 定义类
    class class_name:
        pass
    
    # 定义函数
    def function_name():
        pass
    
    # 主程序
    if __name__ == "__main__":
        function_name()

    2、Python项目目录结构

    通常,Python项目的目录结构如下:
    README:项目说明文档。
    bin(scripts):存放项目的可执行脚本。
    project_name:存放项目的所有源代码,程序的入口文件最好命名为main.py。
    docs: 存放项目文档。
    tests:测试代码目录。
    extras:项目扩展部分,不属于项目必需的部分,存放与项目相关的sample、poc,通常子目录如下dev_example、production_example、test1_poc、test2_poc。
    setup.py:项目安装、部署、打包的脚本。
    requirements.txt:存放软件依赖的外部Python包列表。
    README:项目说明文件。
    LICENSE.txt:版权声明
    ChangeLog.txt:版本变更日志记录
    AUTHORS:作者清单
    INSTALL:安装说明
    MANIFEST.in:装箱清单文件
    MAKEFILE:编译脚本

    四、pipenv包管理工具

    1、pipenv简介

    Python项目开发中,在开发需求完成并测试好后,需要发布到正式服务器,此时会面临环境依赖问题。Python项目可能会有多个第三方模块包,并且可能会有版本约束问题,因此需要一个虚拟环境,在虚拟环境里面模拟出跟服务器相同的环境。
    pipenv ,全称为Python Development Workflow for Humans,旨在为开发项目自动创建和管理虚拟环境并管理 Python 包,是virtualenv 和pip的合集,通过创建指定python版本的虚拟环境和安装依赖包,提供各个项目隔离的开发环境。

    2、pipenv安装

    对于Python3,安装命令如下:
    pip3 install pipenv
    安装结果查看:
    pipenv –version

    3、pipenv常用命令

    pipenv --three
    pipenv -- two
    pipenv --python 3.x.x
    pipenv --python 2.x.x
    创建虚拟环境,并指定Python版本
    pipenv shell从系统环境切换到虚拟环境
    pipenv install xxxx在虚拟环境安装软件包
    exit退出虚拟环境
    pipenv uninstall [module_name] 删除Python包
    pipenv --rm删除虚拟环境
    pipenv --where 列出本地工程路径
    pipenv --venv 列出虚拟环境路径
    pipenv --py 列出虚拟环境的Python可执行文件
    pipenv install 创建虚拟环境
    pipenv install [moduel] 安装包
    pipenv install [moduel] --dev 安装包到开发环境
    pipenv uninstall [module] 卸载包
    pipenv graph 查看包依赖
    pipenv lock 生成lockfile
    pipenv run python [pyfile] 运行py文件
    pipenv uninstall --all 卸载全部包并从Pipfile中移除

    4、更换源

    pipenv默认的Pipfile 文件中指定使用官方源锁定依赖,会导致速度过慢,解决方案自然是更换国内源,常用国内源如下:
    阿里云:http://mirrors.aliyun.com/pypi/simple/
    清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
    中国科学技术大学:https://pypi.mirrors.ustc.edu.cn/simple/
    源更换需要将Pipfile 文件中url的值替换为国内源。

    [[source]]
    name = "pypi"
    url = "http://mirrors.aliyun.com/pypi/simple/ "
    verify_ssl = true
    
    [dev-packages]
    
    [packages]
    pymysql = "*"
    pymango = "*"
    mysql-connector = "*"
    mysqldb = "*"
    mysql-python = "*"
    
    [requires]
    python_version = "3.7"

关键字