一遵班、模塊的實(shí)現(xiàn)方式
實(shí)際上有兩種不同的方法可以在Python中定義模塊:
- 模塊可以用Python本身編寫(xiě)勃痴。
- 模塊可以用C編寫(xiě)并在運(yùn)行時(shí)動(dòng)態(tài)加載盔憨,就像
re
(正則表達(dá)式)模塊一樣馒胆。 - 一個(gè)內(nèi)置的模塊,本質(zhì)上已經(jīng)包含在了 Python 解釋器中缨称,像
itertools
模塊。
以上情況下祝迂,模塊的內(nèi)容都以相同的方式訪問(wèn):使用import
語(yǔ)句
模塊還可以分為
1.內(nèi)置模塊 睦尽,就是 python 解釋器中自帶的. 如: os re itertools
2.第三方模塊, 這些模塊需要自己安裝型雳,就像是在 Linux 系統(tǒng)中安裝軟件一樣当凡。
3.自定義模塊, 這個(gè)就是自己編寫(xiě)的模塊纠俭。
第三方模塊
即安裝外部模塊
1.pip3工具安裝
例如下面的示例是安裝用于執(zhí)行遠(yuǎn)程主機(jī)命令的模塊 paramiko
注意: pip3 是 bash 環(huán)境下的命令
$ pip3 install paramiko
2.源碼安裝
源碼安裝就是沿量,從網(wǎng)絡(luò)上下載沒(méi)有封裝的 python 文件的源碼,之后在本地執(zhí)行其源碼中的 setup.py 文件進(jìn)行安裝冤荆。
模塊的源碼一般都有一個(gè)主目錄朴则,主目錄中包含了一個(gè)到多個(gè)子目錄和文件。
但是主目錄下一定有一個(gè) setup.py 的文件钓简,這個(gè)是源碼安裝的入口文件乌妒,就是需要執(zhí)行這個(gè)文件并且傳入一個(gè) install 參數(shù)進(jìn)行源碼安裝汹想。
1)下載源碼包
wget https://files.pythonhosted.org/packages/4a/1b/9b40393630954b54a4182ca65a9cf80b41803108fcae435ffd6af57af5ae/redis-3.0.1.tar.gz
2)解壓源碼包
tar -xf redis-3.0.1.tar.gz
3)安裝
cd redis-3.0.1
python3 setup.py
自定義模塊
#這個(gè)模塊里面有下面幾個(gè)對(duì)象
x = 10
li = ['shark',18]
def foo():
return 20
class person():
def __init__(self,name,age):
self.name= name
self.age=age
模塊調(diào)用的時(shí)候最好導(dǎo)入的模塊與被導(dǎo)入的處在同級(jí)目錄中
#同級(jí)目錄下,另一個(gè)py文件調(diào)用之前模塊內(nèi)的函數(shù)
import some_mod
print(some_mod.x)
print(some_mod.foo())
如果不在同級(jí)目錄
#如果不在同級(jí)目錄撤蚊,執(zhí)行文件中的寫(xiě)法
from page import some_mod #如果處于執(zhí)行文件所在目錄的下一級(jí)目錄古掏,可用
print(some_mod.x)
print(some_mod.foo())
如果你的文檔的所在目錄每次的不一樣的時(shí)候就要學(xué)會(huì)找路徑
import sys
print(sys.path) #查找路徑
當(dāng)你知道模塊和執(zhí)行文件的共同的目錄的路徑的時(shí)候,可以直接寫(xiě)死查詢的路徑
添加路:sys.path.insert(0,'/root/python_learning')
當(dāng)你要拿別人的文件來(lái)運(yùn)行的時(shí)候侦啸,但是你不知道他們執(zhí)行的文件放在那里槽唾,那么就要去找這個(gè)文件的路徑
import sys,os
#如果你無(wú)法再找到你的當(dāng)前文件的執(zhí)行的地點(diǎn)
#獲取到程序的基礎(chǔ)目錄
absp = os.path.abspath(__file__)
print(absp)
#print(sys.path)
輸出>>/root/python_learning/bin/some.py
=====================
import sys,os
#如果你無(wú)法再找到你的當(dāng)前文件的執(zhí)行的地點(diǎn)
#獲取到程序的基礎(chǔ)目錄
absp = os.path.abspath(__file__) #絕對(duì)路徑
print(absp)
#獲取到程序的基礎(chǔ)目錄
BASE_DIR = os.path.dirname(os.path.dirname(absp))
#dirname就是取得路徑的目錄,不要文件名
print(BASE_DIR)
#print(sys.path)
====================
取得路徑之后匹中;修改路徑
sys.path.insert(0,BASE_DIR)
#先找到上一級(jí)目錄
from page import some_mod
#再通過(guò)這個(gè)方法找到就可以了
模塊的內(nèi)置函數(shù)__file__
二夏漱、包
python2里面一定要有__init__.py才可以,__init__是名稱的存放空間
記住一點(diǎn):不論是導(dǎo)入包還是模塊顶捷,從左向右的順序來(lái)說(shuō)挂绰,最后一個(gè)點(diǎn)兒的左邊一定是一個(gè)包名,而不能是一個(gè)模塊名
如何寫(xiě)init這個(gè)文件
1.單獨(dú)導(dǎo)入包
__init__文件:
n = 10000
import package <---注意
------------------------------
執(zhí)行文件show.py:
import show_mod
show_mod.x
show_mod.foo()
2.從包中導(dǎo)入下面的模塊
__init__
from package import some_mod
------------------------------
執(zhí)行文件
import x
3.從包或子的模塊中導(dǎo)入具體的對(duì)象
__init__
import package
---------------------
執(zhí)行文件
from package.some_mod import foo
#最后一個(gè).的前面一定不能是模塊
from package.some_mod import x as y # 把 x 導(dǎo)入后起個(gè)別名 y
內(nèi)置變量__name__
每個(gè) .py 文件都有一個(gè)變量名__name__服赎, 這個(gè)變量名的值會(huì)根據(jù)這個(gè)文件的用途不同而隨之變化葵蒂。
當(dāng)文件作為模塊被其他文件使用時(shí),__name__ 的值是這個(gè)文件的模塊名
當(dāng)文件作為腳本(就是作為可執(zhí)行文件)使用時(shí)重虑,__name__ 的值是字符串類型的 '__main__'
def foo():
pass
def func():
pass
def main():
foo()
func()
if __name__ == '__main__':
#只有做執(zhí)行文件的時(shí)候執(zhí)行下列的東西践付;做模塊的時(shí)候不會(huì)執(zhí)行
main()
__name__當(dāng)單獨(dú)執(zhí)行的時(shí)候會(huì)為_(kāi)_main__