Python項目中如何優雅的import
阿新 • • 發佈:2018-12-01
逗號 展示 不同的 項目目錄 Python項目 絕對路徑 test pass 需要
Python項目中如何優雅的import
前言
- 之前有一篇關於Python編碼規範的隨筆, 但是寫的比較雜亂, 因為提到了import語句, 在篇文章中, 我專門來講Python項目中如何更好的import
標準庫與第三方庫的導入
- 導入一個模塊, 如果模塊名太長, 則使用import as; 如果是導入子模塊, 則使用from import as
- 如果需要導入類的, 則使用from import導入類, 如果要導入某一個模塊的多各類的話, 則類名使用逗號分隔
- 示例
- 導入sklearn中的svm中的SVC類
import sklearn.svm from sklearn.svm import SVC
- 導入numpy中的random模塊
import numpy.random as nprand
- 總結: 如果導入類的話, 一定是import somemod 和 from somemod import class兩個語句組成的; 如果導入一個不同的模塊的則, 則一般就是import somemod
項目模塊導入
- 項目目錄
wxoa ?? tree -Cl . ├── main.py ├── test └── wxoa ├── __init__.py ├── __pycache__ │ └── __init__.cpython-35.pyc ├── entity │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-35.pyc │ │ └── user.cpython-35.pyc │ └── user.py └── util ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-35.pyc │ └── ioutil.cpython-35.pyc └── ioutil.py 7 directories, 12 files
- 主程序為main.py, 項目名為wxoa, 存放源代碼的目錄也叫wxoa, 也是一個python package
- 導入規則
- 存在python package(所以這裏不包含main.py)中的python文件包導入的規則
- 使用from . import somemod導入當前目錄下的模塊
- 使用from ..somemod import submod導入上一級目錄的somemod目錄下的submod模塊
- 如果名稱太長則使用as縮減
- 不在python package(就是這裏的main.py和test目錄下的文件)中的python文件的導入規則
- 使用from somemod.submod.subsubmod import some導入, 註意這裏不使用.號起頭, 關於使用., ..的作用在下面會說明, 如果使用了.起頭則會報錯, 提示父模塊沒有加載
- 其中somemod就是我們的源碼的python package包名, 在這裏就是wxoa
- 如果名稱太長則使用as縮減
- 使用from somemod.submod.subsubmod import some導入, 註意這裏不使用.號起頭, 關於使用., ..的作用在下面會說明, 如果使用了.起頭則會報錯, 提示父模塊沒有加載
- 存在python package(所以這裏不包含main.py)中的python文件包導入的規則
關於.和..
在包導入中, 如果出現了.和..起頭, 則會涉及到package(不是module)的關系, ..表示上一級package, 這個上一級package需要有一個__init__.py才是合法的, .表示當前package, 當前package需要有一個__init__.py才是合法的
.和..涉及到的python程序的啟動項, 這裏會比較復雜, 簡而言之, 在涉及到..表示的上級package的時候, 如果python程序的啟動文件就是在這裏則Python解釋器不會認為..表示的上級目錄的package是一個合法的目錄, 盡管有__init__.py文件, 因此會報錯; 這樣就給代碼測試帶來的麻煩, 不能直接在使用..和.中直接測試代碼, 也就是
if __name__ == ‘__main__‘: pass
因為這樣已啟動程序就會報錯, 所以報錯, 在下面提出解決方案
關於.和..帶來的麻煩的解決方案
- 和上面展示的項目目錄一樣, 主啟動程序, 項目源代碼(主要是模塊), 測試代碼分離, main.py在項目目錄下, test(普通的文件夾, 存放python測試文件)也在項目目錄下, 項目源代碼就是wxoa
- 在main.py和test目錄下的python文件中導入自己項目中的模塊, 就不要使用.和..起頭了, 否則會報錯, 而是使用絕對路徑, 如這裏的,
from wxoa.service import user
Python項目中如何優雅的import