cookbook_模塊和包

1把模塊按層次結構組織成包

只需確保每一個目錄中都定義了__init__.py便可。python

2對全部符號的導入進行精確控制

當用戶使用from module import * 語句時,咱們但願對從模塊或包中導入的符號進行精確控制。app

在模塊中定義一個變量__all__,用來顯示列出可導出的符號名。編碼

__all__ = ["spam","grok"]spa

 

3使用相對名稱來導入包中的子模塊

mypackage/
  __init__.py
  A/
    __init__.py
    spam.py
    grok.py
  B/
    __init__.py
    bar.py
    
 #spam.py
 from . import grok
 from ..B import bar

使用該方法來導入包內模塊,能夠很好的減小硬編碼導入模塊,若是使用絕對名稱導入,若是最頂端的文件名變化全部的導入都將出現問題。code

ps.blog

執行腳本出現導入錯誤時  python3 -m mypackageip

 

4將模塊分解成多個文件

在不破壞使用結構的狀況下,將一個模塊分解成多個模塊開發

首先將模塊變成包,在包內__init__.py文件內將子模塊導入。字符串

 

5讓各個目錄下的代碼在統一的命名空間下導入

foo_package/
  spam/
    blah.py
bar_package/
  spam/
    grok.py
    
import sys
sys.path.extend(["foo_package","bar_package"])
import spam.blah
import spam.grok

在這兩個目錄中 spam做爲公共的命名空間,注意這兩個目錄中都沒有__init__.py文件。get

 

6從新加載模塊

開發環境中使用,儘可能不在生產環境使用

import imp
import math
imp.reload(math)

 

7讓目錄或zip文件成爲可運行的腳本

myapplication/
  spam.py
  bar.py
  grok.py
  __main__.py
  
  python myapplication
  
  若是包含__main__.py文件,就能夠看成腳原本運行,會運行__main__.py裏的方法

 

8讀取包中的數據文件

mypackage/
  __init__.py
  somedata.dat
  spam.py
  
import pkgutil
data = pkgutil.get_data(__package__,"somedata.dat")

# data會獲得一個字節串
 

9添加目錄到sys.path中

三種解決方案,第一種是使用PYTHONPATH環境變量來添加。

env PYTHONPATH = /some/dir:/other/dir python3

 

第二種是經過建立.pth文件,將.pth文件放在python的site_packages

#mtapplication
/some/dir
/other/dir

第三種是硬編碼到代碼中

import sys
sys.path.insert(0,"/some/dir")
sys.path.insert(0,"/other/dir")

 

10使用字符串中給定的名稱來導入模塊

import importlib
math = importlib.import_module("math")
相關文章
相關標籤/搜索