引入
當python導入模塊,執行import語句時,到底進行了什么操作?按照python的文檔,她執行了如下的操作:
第一步,創建一個新的module對象(它可能包含多個module)
第二步,把這個module對象插到sys.module中
第三步,裝載module的代碼(如果需要,則必須先編譯)
第四步,執行新的module中對應的代碼。
在執行第三步時,首先需要找到module程序所在的位置,搜索的順序是:
當前路徑(以及從當前目錄指定的sys.path),pythonpath,然后是python安裝時設置的相關默認路徑。正因為存在這樣的順序,所以如果當前路徑或pythonpath中存在與標准module相同的module,則會覆蓋標准module。也就是如果當前目錄下存在xml.py,那么執行import xml時,導入的是當前目錄下的module,而不是系統標准的xml。所以我們平常起名字時不能亂起。
了解這些之后,我們就可以先構建一個package,以普通module的方式導入,這樣就可以直接訪問此package中的各個module。python2中package必須包含一個__init__.py的文件。擁有這個文件使得python解釋器將子目錄整個也當成一個模塊,然后直接通過“import 子目錄.模塊”導入即可。如果沒有這個文件就會被當成一個普通文件夾,而不是模塊。
一、模塊
什么是模塊?
模塊實質上就是一個python文件,它是用來組織代碼的,意思就是說把python代碼寫到里面,文件名就是模塊的名稱,test.py test就是模塊名稱。
模塊分為三種:
- 自定義模塊
- 內置標准模塊:python自帶的
- 開源模塊(第三方)
導入模塊的本質,就是把python文件拿過來執行一次。
1、import導入
我有倆文件a.py和b.py,運行b.py,獲得a里面得內容:
name='a.py' def func(): print('這個是a.py里面的函數') for i in range(5): print(i) func()
import a #import一個模塊,就是把這個模塊里的代碼執行一遍
運行結果:
0 1 2 3 4 這個是a.py里面的函數
也可起別名:
name='a.py' def func(): print('這個是a.py里面的函數')
import a as apy # 起別名 print(apy.name) apy.func()
運行結果:
a.py 這個是a.py里面的函數
2、 if __name__=='__main__' 的運用
# if __name__=='__main__':#在自己里執行是__name__;在別家執行是a(文件名)
name = 'a.py' def func(): print('這個是a.py里面的函數') print(__name__) if __name__ == '__main__': # 在自己里執行是__name__; # 在別家執行是a(文件名) for i in range(5): func()
import a
print(a.name) a.func()
運行結果:
__main__ 這個是a.py里面的函數 這個是a.py里面的函數 這個是a.py里面的函數 這個是a.py里面的函數 這個是a.py里面的函數
a
a.py 這個是a.py里面的函數
3、from導入,跟上面一樣一樣的
(1)用from導入func
name = 'a.py' def func(): print('這個是a.py里面的函數') print(__name__) if __name__ == '__main__': # 在自己里執行是__name__; # 在別家執行是a(文件名) for i in range(5): func()
from a import func # 用from導入func func()
運行結果:
a
這個是a.py里面的函數
(2)用from導入func和name
name = 'a.py' def func(): print('這個是a.py里面的函數') print(__name__) if __name__ == '__main__': # 在自己里執行是__name__; # 在別家執行是a(文件名) for i in range(5): func()
from a import func, name # 用from導入func和name func() print(name)
運行結果:
a
這個是a.py里面的函數 a.py
二、導入模塊的順序:
1、從當前目錄下找
2、從python的環境變量里面找
import一個文件夾的時候,就是執行這個文件夾下面的__init__.py
import sys
print(sys.path) # 環境變量 sys.path.append(r'C:\Users\79954\PycharmProjects\ssz\day5') # r 源字符 加環境變量,加的時目錄 sys.path.insert(0, r'C:\Users\79954\PycharmProjects\ssz\day5') # insert指定位置
運行結果:
['C:\\Users\\79954\\PycharmProjects\\ssz\\day5', 'C:\\Users\\79954\\PycharmProjects\\ssz', 'C:\\Program Files\\JetBrains\\PyCharm 2020.1.4\\plugins\\python\\helpers\\pycharm_display', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\python37.zip', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\DLLs', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\lib', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32', 'C:\\Users\\79954\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages', 'C:\\Program Files\\JetBrains\\PyCharm 2020.1.4\\plugins\\python\\helpers\\pycharm_matplotlib_backend', 'C:\\Users\\79954\\PycharmProjects\\ssz\\day5']
如以上運行結果所示:Pycharm也會自動幫咱加了環境,所以我們就可以導入ssz這個目錄下的任何目錄及文件了:
一個例子:
from day5 import tools #我們就可以導入ssz下的任何一個目錄,pycharm會有提示 print(tools.test('s'))
def test(s): return s + 'hhhhhhh'
運行結果:
shhhhhhh
再來一個例子:
from day2 import HelloWold
運行結果:
hello word! 蔡蔡長得非常 "帥氣、高大威猛" let'go,昌姐美麗又漂亮,因為是個“人妖”!!!
導入目錄其他方式:
import sys
# import day5 # result = day5.tools.test('ggg') # 報錯(AttributeError: module 'day5' has no attribute 'tools') from day5 import tools # 這種方式沒問題 print(tools.test('ggg')) from day5.tools import test # 這種方式沒問題 result = test('ggg') print(result)
def test(s): return s + 'hhhhhhh'
運行結果:
ggghhhhhhh
ggghhhhhhh
例子:
1,在day6目錄下建一個__init__.py,寫點內容(一般創建文件夾自帶了)
2,在day5目錄下的a.py里面import day5
__init__
結果: import 一個文件夾時,就是執行這個文件夾下的__init__.py
1)、我們首先在day6下建一個tools.py
def test(s): return s + 'hhhhhhh' def test2(): print('ooooo')
2)然后在day5文件下建目錄文件.py
import day6
result = day6.tools.test('xxx') day6.tools.test2() #可多個導入 print(result)
運行結果:
__init__
ooooo
xxxhhhhhhh
三、第三方模塊安裝:
- python的安裝目錄
- python安裝目錄下面的scripts目錄
首先,得確定環境是否正常(pip --help):
1、手動安裝
2、帶 .whl 結尾的需找到安裝路徑:pip install /Users/........
3、zip文件
- 先解壓
- 進入解壓目錄
- python setup.py install