美文网首页
2018-10-09 Python23 模块

2018-10-09 Python23 模块

作者: 孟媛的笔记 | 来源:发表于2018-10-09 11:17 被阅读0次

    导入的模块,一般先从当前文件夹搜索,如果当前文件夹没有再去系统文件夹搜索。

    🌰:random 模块

    In [13]: import random
    
    In [14]: random.
    random.BPF              random.expovariate      random.randrange
    random.LOG4             random.gammavariate     random.sample
    random.NV_MAGICCONST    random.gauss            random.seed
    random.RECIP_BPF        random.getrandbits      random.setstate
    random.Random           random.getstate         random.shuffle
    random.SG_MAGICCONST    random.lognormvariate   random.triangular
    random.SystemRandom     random.normalvariate    random.uniform
    random.TWOPI            random.paretovariate    random.vonmisesvariate
    random.betavariate      random.randint          random.weibullvariate
    random.choice           random.random           
    
    In [14]: random.ran
    random.randint    random.random     random.randrange  
    
    In [14]: random.randint(0,10)
    Out[14]: 2
    

     

    已安装模块 - 存放路径:

    In [15]: import os
    
    In [16]: os.__file__
    Out[16]: '/usr/lib/python3.5/os.py'
    

    所有模块都是一个.py文件:
          都是源码,用到的时候可以看看。

    mm@mm-virtual-machine:~/桌面$ cd /usr/lib/python3.5/
    mm@mm-virtual-machine:/usr/lib/python3.5$ ls -l
    总用量 4488
    -rw-r--r-- 1 root root  36970 11月 29  2017 os.py
    ...
    

     
     

    🌰下载模块:安装 pygame 模块

    # 安装模块用 pip
    
    #安装curl
    sudo apt install curl
    
    #安装pip
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    python get-pip.py --user
    
    #升级pip
    pip install --upgrade pip
    
    #安装pygame到python2里面
    pip install pygame --user
    
    -------------------------------------------------------------------------
    
    #安装pip3:
    sudo apt install python3-pip
    
    #安装pygame到python3里面:
    pip3 install pygame --user
    

     
     

    自定义模块:

    自定义一个模块 cathie.py

      1 def test():
      2     print("--- cathie test ---")
      3 
      4 #当单独执行此文件,而不是作为一个模块被导入到其他文件中时,执行以下代码测试程序
      5 if __name__ == "__main__":
      6     test()
    

    新建 main.py

      1 # import cathie
      2 # cathie.test()
      3 
      4 # from cathie import test,aaa,...
      5 from cathie import *   #尽量避免用这种,假如两个模块的函数重名,后面导入的方法会覆盖前面的
      6 test()
    

    运行 main.py

    mm@mm-virtual-machine:~/桌面/mm$ ls
    cathie.py  main.py
    mm@mm-virtual-machine:~/桌面/mm$ python3 main.py
    --- cathie test ---
    

    文件夹下,多了一个 __pycache__ 文件:
    引用的那个模块编译后的二进制文件(字节码)缓存起来,避免多次重复编译浪费时间。

    mm@mm-virtual-machine:~/桌面/mm$ ls
    cathie.py  main.py  __pycache__
    mm@mm-virtual-machine:~/桌面/mm$ tree
    .
    ├── cathie.py
    ├── main.py
    └── __pycache__
        └── cathie.cpython-35.pyc  #引用的那个模块编译后的二进制文件(字节码)给它存起来,避免多次重复编译浪费时间
    
    1 directory, 3 files
    

     
     

    __all__ 属性:

    • 如果不写__all__属性,用哪种方式导入都可以被访问。
    • 如果__all__属性:
      • import cathie as ca方式导入,还是都可以被访问的。
      • from cathie import *方式导入,那么包含在list中的全局变量名才可以被访问。
      1 __all__ = ["test1","Test"]
      2 
      3 def test1():
      4     print("--- cathie test1 ---")
      5 
      6 def test2():
      7     print("--- cathie test2 ---")
      8     
      9 num = 2
     10 
     11 class Test(object):
     12     pass
     13     
     14 
     15 #当单独执行这个文件,而不是作为一个模块被导入到其他文件中时,执行以下代码测试程序
     16 if __name__ == "__main__":
     17     test1() 
     18     test2()
    

    导入模块测试:

    In [1]: from cathie import *
    
    In [2]: test1()
    --- cathie test1 ---
    
    In [3]: Test()
    Out[3]: <cathie.Test at 0x7f1e7e654438>
    
    In [4]: test2()
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-4-35ebc1c532fc> in <module>()
    ----> 1 test2()
    
    NameError: name 'test2' is not defined
    
    In [5]: num
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)
    <ipython-input-5-cb54072dd80a> in <module>()
    ----> 1 num
    
    NameError: name 'num' is not defined
    

     

    包:

    1. 文件夹下建 __init__.py 文件
    mm@mm-virtual-machine:~$  ls
    display.py  Msg
    
    mm@mm-virtual-machine:~$  tree
    .
    ├── display.py
    └── Msg
        ├── __init__.py
        ├── recvmsg.py
        └── sendmsg.py
    
    2 directories, 7 files
    

    2 和 3 并列,也可以都写,互不影响。

    1. __init__.py 里写 __all__ = [] 变量,在list中写入模块的名字。
      外部程序导入包内模块:from 包名 import *
    mm@mm-virtual-machine:~$  cat Msg/__init__.py 
    __all__ = ["sendmsg","recvmsg"]
    
    mm@mm-virtual-machine:~$  ipython3
    In [1]: from Msg import *
    
    In [2]: sendmsg.test1()
    --- sendmsg test1 ---
    
    In [3]: recvmsg.test2()
    --- recvmsg test2 ---
    
    1. __init__.py 里面导入包内模块:import modulesimport前加from .python3可用。
      外部程序导入包: import Package
    mm@mm-virtual-machine:~$  cat Msg/__init__.py
    from . import sendmsg
    from . import recvmsg
    print("\t\t\t*********** Msg Package **********")
    
    
    mm@mm-virtual-machine:~$  ipython3 
    In [1]: import Msg
                *********** Msg Package **********
    
    In [2]: Msg.
    Msg.recvmsg  Msg.sendmsg  
    
    In [2]: Msg.sendmsg.test1()
    --- sendmsg test1 ---
    
    In [3]: Msg.recvmsg.test2()
    --- recvmsg test2 ---
    

     


    构建、打包(发布)、安装
     

    构建模块:

    在包的同目录下建 setup.py 文件:

    from distutils.core import setup
    
    setup(name="MsgUtil", version="1.0", description="mm's MsgUtil module", 
          author="mm", py_modules=['package1.module1', 'package1.module2', 
                                   'package2.module3', 'package2.module4'])
    

    执行 python setup.py build 命令:

    # 构建后的目录结构,多了一个build文件夹:
    .
    ├── build
    │   └── lib
    │       ├── package1
    │       │   ├── module1.py
    │       │   ├── module2.py
    │       │   └── __init__.py
    │       └── package2
    │           ├── module3.py
    │           ├── module4.py
    │           └── __init__.py
    ├── setup.py
    ├── package1
    │   ├── module1.py
    │   ├── module2.py
    │   └── __init__.py
    └── package2
        ├── module3.py
        ├── module4.py
        └── __init__.py
    

     

    生成发布压缩包📦

    执行 python setup.py sdist 命令:

    # 打包后的目录结构,多了一个dist目录和一个MANIFEST文件,dist目录下放着压缩包。
    .
    ├── build
    │   └── lib
    │       ├── package1
    │       │   ├── module1.py
    │       │   ├── module2.py
    │       │   └── __init__.py
    │       └── package2
    │           ├── module3.py
    │           ├── module4.py
    │           └── __init__.py
    ├── dist
    │   └── MsgUtil-1.0.tar.gz
    ├── MANIFEST
    ├── setup.py
    ├── package1
    │   ├── module1.py
    │   ├── module2.py
    │   └── __init__.py
    └── package2
        ├── module3.py
        ├── module4.py
        └── __init__.py
    

    这个模块的tar.gz可以发布到Github上面去。

     

    安装

    • 别人要使用你的模块,可以下载你的压缩包文件。
    • 解压
    • 安装到系统目录。
    • 使用
    #解压
    tar -zxvf MsgUtil-1.0.tar.gz
    
    #解压后的目录结构
    .
    ├── PKG-INFO   #构建模块时setup()函数中传入的参数信息
    ├── setup.py
    ├── package1
    │   ├── module1.py
    │   ├── module2.py
    │   └── __init__.py
    └── package2
        ├── module3.py
        ├── module4.py
        └── __init__.py
    
    
    #安装到系统路径
    进入setup.py文件的所在文件夹
    python setup.py install 
    
    
    #在程序中,import导入即可使用模块的功能。
    

    相关文章

      网友评论

          本文标题:2018-10-09 Python23 模块

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