一、模块的实现方式
实际上有两种不同的方法可以在Python中定义模块:
- 模块可以用Python本身编写。
- 模块可以用C编写并在运行时动态加载,就像
re
(正则表达式)模块一样。 - 一个内置的模块,本质上已经包含在了 Python 解释器中,像
itertools
模块。
以上情况下,模块的内容都以相同的方式访问:使用import
语句
模块还可以分为
1.内置模块 ,就是 python 解释器中自带的. 如: os re itertools
2.第三方模块, 这些模块需要自己安装,就像是在 Linux 系统中安装软件一样。
3.自定义模块, 这个就是自己编写的模块。
第三方模块
即安装外部模块
1.pip3工具安装
例如下面的示例是安装用于执行远程主机命令的模块 paramiko
注意: pip3 是 bash 环境下的命令
$ pip3 install paramiko
2.源码安装
源码安装就是,从网络上下载没有封装的 python 文件的源码,之后在本地执行其源码中的 setup.py 文件进行安装。
模块的源码一般都有一个主目录,主目录中包含了一个到多个子目录和文件。
但是主目录下一定有一个 setup.py 的文件,这个是源码安装的入口文件,就是需要执行这个文件并且传入一个 install 参数进行源码安装。
1)下载源码包
wget https://files.pythonhosted.org/packages/4a/1b/9b40393630954b54a4182ca65a9cf80b41803108fcae435ffd6af57af5ae/redis-3.0.1.tar.gz
2)解压源码包
tar -xf redis-3.0.1.tar.gz
3)安装
cd redis-3.0.1
python3 setup.py
自定义模块
#这个模块里面有下面几个对象
x = 10
li = ['shark',18]
def foo():
return 20
class person():
def __init__(self,name,age):
self.name= name
self.age=age
模块调用的时候最好导入的模块与被导入的处在同级目录中
#同级目录下,另一个py文件调用之前模块内的函数
import some_mod
print(some_mod.x)
print(some_mod.foo())
如果不在同级目录
#如果不在同级目录,执行文件中的写法
from page import some_mod #如果处于执行文件所在目录的下一级目录,可用
print(some_mod.x)
print(some_mod.foo())
如果你的文档的所在目录每次的不一样的时候就要学会找路径
import sys
print(sys.path) #查找路径
当你知道模块和执行文件的共同的目录的路径的时候,可以直接写死查询的路径
添加路:sys.path.insert(0,'/root/python_learning')
当你要拿别人的文件来运行的时候,但是你不知道他们执行的文件放在那里,那么就要去找这个文件的路径
import sys,os
#如果你无法再找到你的当前文件的执行的地点
#获取到程序的基础目录
absp = os.path.abspath(__file__)
print(absp)
#print(sys.path)
输出>>/root/python_learning/bin/some.py
=====================
import sys,os
#如果你无法再找到你的当前文件的执行的地点
#获取到程序的基础目录
absp = os.path.abspath(__file__) #绝对路径
print(absp)
#获取到程序的基础目录
BASE_DIR = os.path.dirname(os.path.dirname(absp))
#dirname就是取得路径的目录,不要文件名
print(BASE_DIR)
#print(sys.path)
====================
取得路径之后;修改路径
sys.path.insert(0,BASE_DIR)
#先找到上一级目录
from page import some_mod
#再通过这个方法找到就可以了
模块的内置函数__file__
二、包
python2里面一定要有__init__.py才可以,__init__是名称的存放空间
记住一点:不论是导入包还是模块,从左向右的顺序来说,最后一个点儿的左边一定是一个包名,而不能是一个模块名
如何写init这个文件
1.单独导入包
__init__文件:
n = 10000
import package <---注意
------------------------------
执行文件show.py:
import show_mod
show_mod.x
show_mod.foo()
2.从包中导入下面的模块
__init__
from package import some_mod
------------------------------
执行文件
import x
3.从包或子的模块中导入具体的对象
__init__
import package
---------------------
执行文件
from package.some_mod import foo
#最后一个.的前面一定不能是模块
from package.some_mod import x as y # 把 x 导入后起个别名 y
内置变量__name__
每个 .py 文件都有一个变量名__name__, 这个变量名的值会根据这个文件的用途不同而随之变化。
当文件作为模块被其他文件使用时,__name__ 的值是这个文件的模块名
当文件作为脚本(就是作为可执行文件)使用时,__name__ 的值是字符串类型的 '__main__'
def foo():
pass
def func():
pass
def main():
foo()
func()
if __name__ == '__main__':
#只有做执行文件的时候执行下列的东西;做模块的时候不会执行
main()
__name__当单独执行的时候会为__main__