Python/模塊

維基教科書,自由的教學讀本
跳至導覽 跳至搜尋

模塊(module)[編輯]

Python模塊,可由import命令加載:

import module1[ as aliasname, module2[,... moduleN]

一個模塊只會被導入一次,不管執行了多少次import。Python的搜索路徑sys.path,這是一個列表。模塊的名字追加到了當前符號表,但沒有把該模塊中的函數名稱寫入到當前符號表里。

從模塊中導入一個指定的部分到當前命名空間中,語法如下:

from modname import name1[ as alisasname, name2[, ... nameN]]
from module2 import *

每個模塊有自己獨立的符號表,在模塊內部的函數當作全局符號表來使用。

__name__屬性,當其值是'__main__'時,表明該模塊自身在運行,否則是被引入。

內置函數 dir() 以字符串列表的形式返回指定模塊內定義的所有名稱。

可以應對包不存在的異常:

try:
 import custommodule
except ImportError:
 pass

sys.modules 是一個字典,它包含了從 Python 開始運行起,被導入的所有模塊。鍵字就是模塊名,鍵值就是模塊對象。列出已經導入的模塊:

print('\n'.join(sys.modules.keys()))

每個 Python 類都擁有一個內置的類屬性 __module__,它定義了這個類的模塊的名字。

from math import cos
cos.__module__

模塊(module)可以是下述實體:

  • Python文件(.py)
  • Unix與Linux的共享對象,其後綴為.so
  • Windows的DLL,後綴為.pyd
  • 目錄,其應包含一個__init__.py文件。

包(package)[編輯]

包,是多個模塊的組織體系。目錄只有包含一個叫做 __init__.py 的文件才會被認作是一個包。

如果包定義文件 __init__.py 存在一個叫做 __all__ 的列表變量,那麼在使用 from package import * 的時候就把這個列表中的所有名字作為包內容導入。如果 __all__ 沒有定義,使用from 包.子包 import * 這種語法的時候,不會導入包 里的任何子模塊,只是把包和它裡面定義的所有內容導入進來。

包內部的一個模塊,可以如下引用這個包的其它模塊:

from . import another_module