python入门系列:包和模块

基本概念

模块:将一组功能相关的代码写入一个单独的.py文件中,需要时进行导入,这个文件就是模块。
包:有层次的文件目录结构,内部有多个模块或多个子包,一般要有init.py这个文件(3.3+ 的版本不需要)。
库:完成一定功能代码的集合,完成的功能一般更加广泛,可以是模块,也可以是包。
框架:通过框架,可以快速实现解决某一个问题所需的代码骨架,后期进行填充即可。
包和模块的作用

造轮子,工具代码,供其他模块使用(模块化编程)
划分了变量作用域,解决变量/函数重名的问题
包和模块分类

内建的模块:builtin,会自动导入。
第三方包/模块:由其他人员开发,需要下载安装才能使用。
自定义包/模块:自己写的。
包和模块的一般操作

创建模块

就是创建一个 .py文件

n1 = 1
n2 = 2
n3 = 3
def test():
pass
all = ["n1", "n2", "test"] # 指定了可以导入到别的模块中的资源
创建包

新建一个文件夹,为了兼容,添加一个init.py文件(当包被导入时,会运行这个文件)。
在文件中设置all变量,可以限制能够通过from package import *所导出的模块。
包和模块的导入

"""
1.常规导入,导入了所有资源
"""
import module
module.val # 访问变量
module.func() # 调用函数

模块在其他的包中

import p.module
p.module.val

一次导入多个模块

import p.module, module, module_2

给模块起别名

import p.module as m
m.val
m.func()
"""
2.from语句导入,只导入部分资源
"""

从包中导入模块

from p import module
module.val
from p import module1, module2
from p import module1 as m1, module2 as m2
from p.sub_p import m # 正确写法
from p import sub_p.m # 错误写法

从模块中导入资源

from module import val, func
print(val) # 直接使用
func()
from p.mudule import val # True
from p import module.val # False
from p import # 导入了 p包下的所有模块,受到 init.py文件中all变量的约束
from module import
# 导入了 module下的所有资源,受到模块中 all变量的约束

使用 * 进行导入,容易产生同名冲突

导入操作的本质

第一次导入
被导入的模块会在自己的命名空间中执行所有的代码。
代码执行完成后,会产生一个模块对象,模块中的所有属性都绑定到这个对象上,对象的名称就是模块名。
目标模块在import位置建立引用,就可以根据模块对象的名称来访问资源了。
第二次导入
直接建立到对象的引用,也就是第一次导入的第三步。
两种导入方式都会执行模块的所有代码,所以不存在第二种方式更省内存的说法,只是拿不同的部分来使用。
模块检索路径

检索模块按照一定的顺序进行,优先在具有较高优先级的地方查找。
先在内置模块中查找,若自己定义了一个和内置模块重名的模块,进行导入时,会导入内置的那个模块。
然后在sys.path(是一个路径列表)中查找
当前目录
环境变量PYTHONPATH
特定路径下的.pth文件所指定的路径
python安装目录下的lib
追加路径的方式 (在sys.path中增加自定义的路径)

直接修改 sys.path

import sys
sys.path.append("xx/xx/xx") # 添加自定义的一个路径,单次执行有效
import xxx # xxx是位于自定义路径下的一个模块

直接修改 PYTHONPATH, 因为 sys.path包括了 PYTHONPATH

在 shell中有效,在 IDE中又要另外添加

作用持久

导入模块的场景

局部导入

在需要使用的范围内进行导入,其他范围无法使用,多用于函数

def cal(r):

import math
return math.pi r r
erea = cal(2)
覆盖导入

自定义的模块名称和非内置的标准模块重名,根据优先级,前者会覆盖后者
自定义的模块和内置模块重名,后者覆盖前者
循环导入

A模块导入了 B模块,B模块又导入了 A模块
会造成一些问题
可选导入

对于两个功能相似的模块,想优先导入其中一个,若不存在,再导入另外一个

try:
import module_1 as m
except ModuleNotFoundError:
import module_2 as m

m.func()
加载.py文件的两种方式

以脚本形式直接执行

当一个含有导入模块操作的个文件被执行后,会将自身所在的路径添加到sys.path,后面的所有导入(在当前文件的其他导入 + 所导入模块中的其他导入)都会参照这个sys.path。同时,该文件有一个属性:name = ‘main

作为模块被其他文件导入

此时其name属性是由该模块的加载路径所决定的。这个路径作为相对导入时的路径参照。

绝对导入和相对导入

绝对导入

参照sys.path路径进行模块检索的导入方式

import module
from module import func

相对导入

用 . 和 .. 来代替绝对路径进行模块的检索

from . import module # 参考的路径是该模块被绝对导入时加载的路径
第三方包和模块的安装

包管理项目

distutils
标准库的一部分,能处理简单的包安装,通过setup.py进行安装
setuptools
现在的包安装标准,使用pip安装脚本,使用whl格式
三方包和模块的发布形式

源代码
一个压缩包,解压后里面有setup.py文件,运行即可完成安装
.egg
setuptools引入的一种格式,压缩包,通过安装脚本easy_install进行安装
.whl
为了替代.egg,压缩包,使用pip进行安装
安装方式

本地安装

单文件模块
直接拷贝到sys.path中包含的路径即可,一般放在Lib/site-packages/
带有setup.py文件
直接使用命令进行安装:2.x:python2 setup.py install,3.x:python3 setup.py install,注意执行命令时的所在目录即可。
.egg文件的安装,使用setuptools的自带安装脚本easy_install进行安装,前提要先安装好easy_install,安装命令:easy_install xxx.egg
.whl文件的安装,推荐使用pip安装。首先要安装pip,一般会自动装上(若没有装,使用easy_install 进行远程安装)。安装命令:pip install xxx.whl
远程安装

自动地从远程下载地址进行检索、下载、安装
easy_install xxx
pip install xxx
默认安装在Lib/site_packages/下
默认是从官网上下载,建议更换安装源。
安装源(镜像地址)

豆瓣
中国科学技术大学
其他问题

easy_install

多python版本的切换安装
easy_install-2.7 xxx
easy_install-3.6 xxx
安装指定版本的包
默认是安装最新的版本
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" 安装当前版本的包,若已经安装,则切换到这个版本
升级第三方包
easy_install --upgrade requests
卸载第三方包
手动卸载:1.删除在easy_install.pth中的包记录,2.删除对应的包文件。
命令卸载:easy_install -m requests,并不是真正地卸载了库,相当于执行手动卸载的第一步。
对于命令卸载,以后还可以继续使用这个包,只不过不能直接使用
import pkg_resources
pkg_resources.require("requires==2.18.4") # 指明你需要的版本
import requests
修改安装源
setuptools/command/easy_install.py在里面修改安装源即可
pip

修改安装源(Windows)
在用户名下创建pip目录,在目录中创建pip.ini文件。C:Users\xxpippip.ini
编辑文件内容如下:
[global]
index-url = http://pypi.douban.com/simple/
trusted-host = pypi.douban.com
修改安装源(Linux)
在用户名下创建.pip目录,目录下创建pip.conf文件。/home/xxx/.pip/pip.conf
文件中的内容和上面相同
多python版本安装
python -m pip install requests
python3 -m pip install requests
查看包:pip list
安装指定版本包:pip install "requests >= 1.14.1"
升级包:pip install -- upgrade requests
安装多个版本的库,会以最后一次安装的为准,覆盖安装。若再次执行pip install requests,会给出包已经存在的提示。
卸载包:pip uninstall requests,会删除包文件。
生成冻结需求文本:将当前安装的第三方包记录,储存到指定的文件中,以后,就可以根据这个需求去安装三方包。
pip freeze > ./requirements.txt
pip install -r requirements.txt
pip在linux下的一些问题

linux默认安装了两个版本的python,我的系统是Ubuntu 16.04,有python 2.7和python 3.5两个版本
在家目录下,还会出现.local这个目录,里面记录了pip和用其安装模块的一些信息。这个是面向用户安装的,只在自己的家目录下才有的。
直接使用pip命令,会将安装的包装在python2.7的路径下,有如下对应关系:pip--->python2.7,pip3--->python3.5
使用pip show xxx会显示安装模块的信息
pip3 show pygame
Name: pygame
Version: 1.9.4
Summary: Python Game Development
Home-page: https://www.pygame.org
Author: Pete Shinners, Rene Dudfield, Marcus von Appen, Bob Pendleton, others...
Author-email: pygame@seul.org
License: LGPL
Location: /home/tc/.local/lib/python3.5/site-packages
Requires:
Required-by:
为了不出什么幺蛾子,以后最好都用下面的方式去定位不同版本的pip,简单使用pip快捷方式使得其背后指向的解释器版本不明确,如果安装了多个Python3版本的解释器,直接使用 pip 操作会更加麻烦。windows和linux的用法而且不相同,linux 下又分为面向系统和面向用户安装……

都是操作系统级别的包,不会装在自己的家目录下,管理更加方便

python -m pip //for 2.x
python3 -m pip //for 3.x
pythonx.x -m pip //for x.x
喜欢python + qun:839383765 可以获取Python各类免费最新入门学习资料!

原文地址:http://blog.51cto.com/14186420/2349774

时间: 2024-10-06 17:11:49

python入门系列:包和模块的相关文章

Python 入门之 内置模块 -- re模块

Python 入门之 内置模块 -- re模块 1.re 模块 (1)什么是正则? 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. 元字符 匹配内容 \w 匹配字母(包含中文)或数字或下划线 \W 匹配非字母(包含中文)或数字或下划线 \s 匹配任意的空白符 \S 匹配任意非空

Python进阶(十一)----包,logging模块

Python进阶(十一)----包,logging模块 一丶包的使用 什么是包: ? 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文件夹就是包. 包的作用: ? 将文件夹/模块组织起来,来提高程序的结构性和可维护性. ? 目的不是运行,为了导入使用.包只是一种形式,包的本质就是一个模块 import: # 创建一个包,也会发生三件事: ''' 1. 将该aaa包内 __init__py文件加载到内存. 2. 创建一个以aaa命名

Python 入门之 内置模块 -- 序列化模块(json模块、pickle模块)

Python 入门之 内置模块 -- 序列化模块(json模块.pickle模块) 1.序列化 Python中这种序列化模块有三种: ? json模块 : ? 不同语言都遵循的一种数据转化格式,即不同语言都使用的特殊字符串.(比如Python的一个列表[1, 2, 3]利用json转化成特殊的字符串,然后在编码成bytes发送给php的开发者,php的开发者就可以解码成特殊的字符串,然后在反解成原数组(列表): [1, 2, 3]) ? json序列化只支持部分Python数据结构:dict,l

python入门系列:Python使用虚拟环境

虚拟环境 背景 有两个项目,A和B.都依赖一个模块m,但是他们所需要的版本不一样.默认的情况是,只能安装一个版本的模块m.所以一台电脑上,两个项目无法同时运行. 解决方案 创建一个独立的局部python环境,在这个环境中,安装相关的库,如果有多个项目,则创建多个局部环境.平行宇宙即视感. 虚拟环境准备 想要创建平行宇宙,还得依赖一个三方包:virtualenv安装命令:pip install virtualenv使用虚拟环境 创建一个虚拟环境 使用命令:virtualenv dirname,也可

python入门系列:面向对象

类和对象的创建 类 经典类 没有继承 object的类 新式类 继承了 object的类 class Money: # 2.x中默认是经典类,3.x中是新式类pass class Money(object): # 兼容的一种写法pass Money既是类的name属性名,又是一个引用该类的变量 print(Money.name) # Moneyxxx = Moneyprint(xxx.name) # Money对象 one = Money()print(one) # <main.Money ob

Python基础之包与模块

本文和大家分享的主要是python中包与模块相关内容,一起来看看吧,希望对大家学习python有所帮助. 摘要 1. 为重用以及更好的维护代码, Python 使用了模块与包:一个 Python 文件就是一个模块,包是组织模块的特殊目录(包含 __init__.py 文件). 2. 模块搜索路径, Python 解释器在特定的目录中搜索模块,运行时 sys.path 即搜索路径. 3. 使用 import 关键字导入模块,注意 import * 与 __all__ 的关系. 1. 模块与导入 A

Python学习 之 包和模块

1.rpm -ql python #查看python在计算机中安装了哪些文件 2.模块是一个可以导入的Python脚本文件 包是一堆按目录组织的模块和子包,目录下的__init__.py文件存放了包的信息 可以用import *,import * as *,from * import *等语句导入模块和包 3.Python的模块可以按目录组织为包,创建一个包的步骤是: (1)创建一个名字为包名字的文件夹 (2)在该文件夹下创建一个__init__.py文件 (3)根据需要在该文件夹下存放脚本文件

Python导入自定义包或模块

一般我们会将自己写的python模块与python自带的模块分开存放以达到便于维护的目的. Python 运行环境在查找模块时是对 sys.path 列表进行遍历,如果我们想在运行环境中添加自定义的模块,主要有以下三种方法: 1.在sys.path列表中添加新的路径(只能对执行了sys.path.append命令的当前Python运行环境起作用,对其他运行环境不起作用,也即"一次性"的). >>> import sys >>> sys.path &g

python入门系列:函数

引言 将一段代码集中到一块,起一个名字,下次可以根据这个名字再次使用这个代码块.作用:方便代码重用分解任务,简化程序逻辑使代码更加模块化函数的参数 所有的传参方式都是传引用,注意列表做参数和数值做参数容易出现的问题. 单个参数 多个参数 定义方式 def funName(arg1, arg2, arg3...):pass 调用方法 funName(arg1, arg2, arg3...) # 形参和实参一一对应funName(arg2=v2, arg3=v3, arg1=v1) # 指明形参的名