常規匯入(regular imports)
使用from語句匯入
相對匯入(relative imports)
可選匯入(optional imports)
本地匯入(local imports)
常規匯入
常規匯入應該是最常使用的匯入方式,大概是這樣的:
import sys
你只需要使用import一詞,然後指定你希望匯入的模組或包即可。通過這種方式匯入的好處是可以一次性匯入多個包或模組:
import os, sys, time
雖然這節省了空間,但是卻違背了python風格指南。python風格指南建議將每個匯入語句單獨成行。
有時在匯入模組時,你想要重新命名這個模組。這個功能很容易實現:
import sys as system
很多時候你只想要匯入乙個模組或庫中的某個部分。我們來看看在python中如何實現這點:
from functools import lru_cache
具體來說,是使用句點來決定如何相對匯入其他包或模組。
這麼做的原因是為了避免偶然情況下匯入標準庫中的模組產生衝突。
my_package/
__init__.py
subpackage1/
__init__.py
module_x.py
module_y.py
subpackage2/
__init__.py
module_z.py
module_a.py
在本地磁碟上找個地方建立上述檔案和資料夾。在頂層的__init__.py
檔案中,輸入以下**:
from
.import subpackage1
from
.import subpackage2
from
.import module_x
from
.import module_y
from
.module_y import spam as ham
defmain()
: ham(
)
def
spam()
:print
('spam '*3
)
開啟終端,cd
至my_package
包所在的資料夾,但不要進入my_package
。
in [1]
:import my_package
in [2]
: my_package.subpackage1.module_x
out[2]
:from
'my_package/subpackage1/module_x.py'
>
in [3]
: my_package.subpackage1.module_x.main(
)spam spam spam
相對匯入適用於你最終要放入包中的**。如果你編寫了很多相關性強的**,那麼應該採用這種匯入方式。
pypi上有很多流行的包也是採用了相對匯入。
還要注意一點,如果你想要跨越多個檔案層級進行匯入,只需要使用多個句點即可。不過建議相對匯入的層級不要超過兩層。
注意事項:
如果你往module_x.py文
件中新增了if __name__ == 『__main__』
,然後試圖執行這個檔案,你會碰到乙個很難理解的錯誤。
from
. module_y import spam as ham
defmain()
: ham(
)if __name__ ==
'__main__'
:# this won't work!
main(
)
現在從終端進入subpackage1
資料夾,執行以下命令:
python module_x.py
如果python 2
,有下面的錯誤資訊:
traceback (most recent call last)
: file "module_x.py"
, line 1,in
from
. module_y import spam as ham
valueerror: attempted relative import
in non-package
如果是python 3,錯誤資訊大概是這樣的:
traceback (most recent call last)
: file "module_x.py"
, line 1,in
from
. module_y import spam as ham
systemerror: parent module ''
not loaded, cannot perform relative import
module_x.py
是某個包中的乙個模組,而你試圖以指令碼模式執行,但是這種模式不支援相對匯入。
如果你想在自己的**中使用這個模組,那麼你必須將其新增至python的匯入檢索路徑(import search path)。最簡單的做法如下:
import sys
'/path/to/folder/containing/my_package'
)import my_package
注意,你需要新增的是my_package
的上一層資料夾路徑,而不是my_package
本身。原因是my_package
就是我們想要使用的包,所以如果你新增它的路徑,那麼將無法使用這個包。
import匯入目錄問題:
import匯入其他模組時,需要匯入的模組資料夾有__init__.py
的檔案。
在import的第乙個階段,主要是完成了查詢要引入模組的功能。查詢時首先檢查sys.modules
(儲存了之前import的類庫的快取),如果module沒有被找到,則按照下面的搜尋路徑查詢模組:
(1).py 所在檔案的目錄
(2)pythonpath 中的目錄
(3)python安裝目錄,unix下,預設路徑一般為/usr/local/lib/python/
(4)3.x 中.pth 檔案內容
參考:
python匯入模組的幾種姿勢;
pep 366 – main module explicit relative imports;
匯入系統;
python筆記03:python中用import匯入包的機制原理是什麼?
Python import 匯入機制
有以下 a.py 和 b.py 兩個模組 a.py print 1 aaa 111 print 2 def a print 3 from b import b print 4 b print 5 aa a print 6 b.py from a import aaa def b print aaa ...
python import匯入現有模組
主要分三種情況 1 主程式與模組程式在同一目錄下 如下面程式結構 src mod1.py test1.py 若在程式test1.py中匯入模組mod1,則直接使用importmod1或from mod1 import 2 主程式所在目錄是模組所在目錄的父 或祖輩 目錄 如下面程式結構 src mod...
Python import 匯入功能詳解
1 import 匯入模組 包 預設從執行的檔案的資料夾下尋找 2 當檔名跟系統內建的模組重名,import還是匯入系統內建的模組 3 import xx檔案,會把xx檔案執行一遍,再把檔案引入。4 可通過 隔開檔案,以通過一行匯入多個檔案。跟通過多行匯入效果一樣 例如 import time,os...