模塊:導入的兩種方式
不加__all__的情況:
加__all__的情況:
·總結:如果一個文件中有__all__變量,from?xxx?import?*時導入時,__all__['a','b']中括號里面的可以使用,其他的不能使用。
1.1python中的包
所以將其放到同一個文件夾下
使用import文件.模塊?的方式導入
使用from文件夾import模塊?的方式導入
在msg文件夾下創建__init__.py文件
在__init__.py文件中寫入
重新使用from文件夾import模塊?的方式導入
總結:
·包將有聯系的模塊組織在一起,即放到同一個文件夾下,并且在這個文件夾創建一個名字為__init__.py文件,那么這個文件夾就稱之為包。
有效避免模塊名稱沖突問題,讓應用組織結構更加清晰
1.1.1__init__.py文件有什么用
__init__.py控制著包的導入行為
1.1.1.1__init__.py為空
僅僅是把這個包導入,不會導入包中的模塊
1.1.1.2__all__
在__init__.py文件中,定義一個__all__變量,它控制著from包名import?*時導入的模塊。
__all__里面的可以導入,其他的導入不進去,相當于一種導入的過濾。
1.1.1.1以在__init__.py文件中編寫內容(導入會被自動調用)
可以在這個文件中編寫語句,當導入時,這些語句就會被執行
__init__.py文件
1.1.1擴展:嵌套的包
假定我們的包的例子有如下的目錄結構:
Phone/
__init__.py
common_util.py
Voicedta/
__init__.py
Pots.py
Isdn.py
Fax/
__init__.py
G3.py
Mobile/
__init__.py
Analog.py
igital.py
Pager/
__init__.py
Numeric.py
Phone是最頂層的包,Voicedta等是它的子包。?我們可以這樣導入子包:
import?Phone.Mobile.Analog
Phone.Mobile.Analog.dial()
你也可使用from-import實現不同需求的導入
第一種方法是只導入頂層的子包,然后使用屬性/點操作符向下引用子包樹:
from?Phone?import?Mobile
Mobile.Analog.dial('555-1212')
此外,我們可以還引用更多的子包:
from?Phone.Mobile?import?Analog
Analog.dial('555-1212')
事實上,你可以一直沿子包的樹狀結構導入:
from?Phone.Mobile.Analog?import?dial
dial('555-1212')
在我們上邊的目錄結構中,我們可以發現很多的__init__.py文件。這些是初始化模塊,from-import語句導入子包時需要用到它。?如果沒有用到,他們可以是空文件。
包同樣支持from-import?all語句:
from?package.module?import?*
然而,這樣的語句會導入哪些文件取決于操作系統的文件系統。所以我們在__init__.py中加入__all__變量。該變量包含執行這樣的語句時應該導入的模塊的名字。它由一個模塊名字符串列表組成.。
1.1模塊發布
1.mymodule目錄結構體如下:
.
├──?setup.py
├──?suba
│???├──?aa.py
│???├──?bb.py
│???└──?__init__.py
└──?subb
├──?cc.py
├──?dd.py
└──?__init__.py
2.編輯setup.py文件
py_modules需指明所需包含的py文件
fromdistutils.coreimportsetup
setup(name="yongGe",?version="1.0",?description="yongGe's?module",?author="yongGe",?py_modules=['suba.aa','suba.bb','subb.cc','subb.dd'])
3.構建模塊
python?setup.py?build
構建后目錄結構
├──?build
│???└──?lib.linux-i686-2.7
│???????├──?suba
│???????│???├──?aa.py
│???????│???├──?bb.py
│???????│???└──?__init__.py
│???????└──?subb
│???????????├──?cc.py
│???????????├──?dd.py
│???????????└──?__init__.py
├──?setup.py
├──?suba
│???├──?aa.py
│???├──?bb.py
│???└──?__init__.py
└──?subb
├──?cc.py
├──?dd.py
└──?__init__.py
4.生成發布壓縮包
python?setup.py?sdist
打包后,生成最終發布壓縮包yongGe-1.0.tar.gz?,目錄結構
├──?build
│???└──?lib.linux-i686-2.7
│???????├──?suba
│???????│???├──?aa.py
│???????│???├──?bb.py
│???????│???└──?__init__.py
│???????└──?subb
│???????????├──?cc.py
│???????????├──?dd.py
│???????????└──?__init__.py
├──?dist
│???└──?yongGe-1.0.tar.gz
├──?MANIFEST
├──?setup.py
├──?suba
│???├──?aa.py
│???├──?bb.py
│???└──?__init__.py
└──?subb
├──?cc.py
├──?dd.py
└──?__init__.py
1.2模塊安裝、使用
1.2.0.1安裝的方式
1.找到模塊的壓縮包
2.解壓
3.進入文件夾
4.執行命令python?setup.py?install
注意:如果在install的時候,執行目錄安裝,可以使用python?setup.py?install?--prefix=安裝路徑
·如果在install的時候,要安裝細節都寫到log里了,可以使用python?setup.py?install?--record=日志文件的名字。如果刪除cat?log|xagrs?rm-rf。也可以通過rm命令刪除。
1.2.0.2模塊的引入
在程序中,使用from?import即可完成對安裝的模塊使用