1. 程式人生 > >python入門系列:包和模塊

python入門系列:包和模塊

源代碼 mar 簡單使用 auth ins 需求 eve 用法 python2.7

基本概念

模塊:將一組功能相關的代碼寫入一個單獨的.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: [email protected]
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各類免費最新入門學習資料!

python入門系列:包和模塊