一:import
導入模塊,只會在第一次導入時執行源文件的代碼
如果模塊已經加載到內存了,下一次導入直接引用內存中導入的結果
eval:提取字符串內的表達式執行,然后返回執行結果
import 導入文件都做了哪些事?
1 以源文件為准產生一個名稱空間
2 以剛剛產生的名稱空間為准,執行源文件的代碼
3 會在當前文件中定義一個名字,這個名字就是模塊名,用來引用模塊中的名字
為模塊起別名
import spam as sm
1 engine_type='mysql' 2 if engine_type == 'mysql': 3 import mysql as engine 4 elif engine_type == 'oracle': 5 import oracle as engine 6 engine.parse()
可以把兩個不同的模塊引入時候起相同的別名 ,做到調用的時候統一化。小技巧
在一行導入多個模塊
1 import sys,os,re
二 使用模塊之from ... import...
from spam import read1,read2,moeny
直接導入了spam中的 函數 read1 和read2 的名字 也可以導入變量名字 money
這樣使用的時候就不用以spam.read1()的方式調用函數了.
from spam import *
一下把spam.py中的所有名字都引入了
如果引入的模塊中有__all__=['字符串函數名','字符串變量名']那么
from spam import * 中* 對應模塊spam內的__all__列表內的名字。
三模塊的重載
考慮到性能的原因,每個模塊只被導入一次,放入字典sys.module中,如果你改變了模塊的內容,你必須重啟程序,python不支持重新加載或卸載之前導入的模塊,
有的同學可能會想到直接從sys.module中刪除一個模塊不就可以卸載了嗎,注意了,你刪了sys.module中的模塊對象仍然可能被其他程序的組件所引用,因而不會被清楚。
特別的對於我們引用了這個模塊中的一個類,用這個類產生了很多對象,因而這些對象都有關於這個模塊的引用。
如果只是你想交互測試的一個模塊,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),這只能用於測試環境。
四py文件模塊與腳本的區別
1 編寫好的一個python文件可以有兩種用途: 2 一:腳本,一個文件就是整個程序,用來被執行 3 二:模塊,文件中存放着一堆功能,用來被導入使用 4 5 6 python為我們內置了全局變量__name__, 7 當文件被當做腳本執行時:__name__ 等於'__main__' 8 當文件被當做模塊導入時:__name__等於模塊名 9 10 作用:用來控制.py文件在不同的應用場景下執行不同的邏輯 11 if __name__ == '__main__':
__name__的判斷要在寫在模塊(腳本程序中)
文件spam.py當做腳本執行,該值等於__main__,文件spam.py當做模塊被導入時,該值等於腳本名(spam)
五 模塊的搜索路徑
模塊的查找順序是:內存中已經加載的模塊->內置模塊(系統內置那些)->sys.path路徑中包含的模塊
1 import sys 2 sys.path.append(r'文件路徑\a') a是文件夾 3 import m 4 也可以先去找到a 然后順着a找到m(a和執行文件是在同一個目錄下) 5 from a import m
把文件的路徑加入系統環境變量中,這是加入一次,而不是永久寫入。
六 包介紹
1包是一種通過使用‘.模塊名’來組織python模塊名稱空間的方式
具體的:包就是一個包含有__init__.py文件的文件夾,所以其實我們創建包的目的就是為了用文件夾將文件/模塊組織起來 #需要強調的是: 1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會報錯,而在python2中,包下一定要有該文件,否則import 包報錯 2. 創建包的目的不是為了運行,而是被導入使用,記住,包只是模塊的一種形式而已,包的本質就是一種模塊
2需要注意的是
#1.關於包相關的導入語句也分為import和from ... import ...兩種, 但是無論哪種,無論在什么位置,在導入時都必須遵循一個原則: 凡是在導入時帶點的,點的左邊都必須是一個包(也就是說文件夾下必須有__init__.py這個文件),否則非法。 可以帶有一連串的點,如item.subitem.subsubitem, 但都必須遵循這個原則。但對於導入后,在使用時就沒有這種限制了, 點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。 #2、import導入文件時,產生名稱空間中的名字來源於文件,import 包,產生的名稱空間的名字同樣來源於文件,即包下的__init__.py,導入包本質就是在導入該文件 #3、包A和包B下有同名模塊也不會沖突,如A.a與B.a來自倆個命名空間
包的標志就是包含__init__.py這個文件。
圖列:

模塊導入的時候都會做三件事
1 以源文件為准產生一個名稱空間 2 以剛剛產生的名稱空間為准,執行源文件的代碼 3 會在當前文件中定義一個名字,這個名字就是模塊名,用來引用模塊中的名字
總結
1 import包的時候 建議使用 from ...import的形式。這樣就不用sys.path.append(r'包的路徑') 2 3 from可以用來指定路徑 import決定需要獲取的名稱空間 4 5 運行文件和包在同一文件夾下的時候 可以直接import 6 7 運行文件和包不在同一文件夾下的時候c:\a\b\c\d\ 運行文件在a下 包在d下 那么就需要在運行文件中首先導入sys.path.append(r'c:\a\b\c\d')
包以及包所包含的模塊都是用來被導入的,而不是被直接執行的。而環境變量都是以執行文件為准的
執行文件調用包內名稱的方式決定了from 路徑結構
第一種
1 執行文件中 2 import a 3 a.f1() 4 a.f2() 5 a.f3()
6 a包 __init__中的代碼 7 from .am1 import f1 #等同於絕對路徑from a.am1 import f1
8 from .am2 import f2 9 from .b.bm1 import f3
第二種
執行文件中 import a.b.bm1 a.b.bm1.f3()
a包 __init__中沒有代碼
第三種
1 執行文件中 2 from a.b.bm1 import f3 3 f3()
4 a包 __init__中沒有代碼
第一種依賴包中__init__ ,第二種是不依賴__init__.
