导入的模块,一般先从当前文件夹搜索,如果当前文件夹没有再去系统文件夹搜索。
🌰: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
包:
- 文件夹下建
__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 并列,也可以都写,互不影响。
- 在
__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 ---
- 在
__init__.py
里面导入包内模块:import modules
,import
前加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导入即可使用模块的功能。
网友评论