1. 程式人生 > >python自動化運維學習第十一天--模組的使用

python自動化運維學習第十一天--模組的使用

模組

模組是python組織程式碼的基本方式。
一個python指令碼可以單獨執行,也可以匯入到另一個指令碼中執行,當指令碼被匯入執行時,稱其為模組(module)。
所有的.py檔案都可以作為一個模組匯入。
模組名與指令碼的檔名相同。
例如編寫一個名為hello.py的指令碼,可以在另一個指令碼中用import hello語句匯入這個指令碼。

python的模組可以按照目錄組織為包。
建立一個包的步驟:

  • 建立一個目錄,目錄名即為包名
  • 在該目錄下建立一個__init__.py檔案
  • 根據需要,在該目錄下存放指令碼檔案或已編譯的擴充套件及子包
  • 使用時,import pack.m1,pack.m2,pack.m3

模組的存放位置可以通過sys.path檢視

import sys
print sys.path   #會返回一個列表,存放包的路徑,每個路徑都是目錄

當匯入包時,程式會依次從sys.path返回列表的目錄中查詢,當該包不在目錄中時會報錯。
Linux中大部分包是安裝在/usr/lib64/python2.6(不同python版本會不同)目錄下
新增自定義python包路徑

  1. 通過sys.path.append(path),把path新增到python的包路徑中,只能臨時生效,退出後失效
  2. 通過編輯使用者家目錄下的.bashrc檔案,具體操作如下:
vim /root/.bashrc    #以root使用者為例
export PYTHONPATH = /tmp/path #新增這一行 ##儲存退出 #執行 . .bashrc

這樣就可以把/tmp/path新增到python的包路徑中

例子:

編寫一個統計檔案行數、單詞數和字元數的指令碼,並用另一個指令碼匯入該指令碼。

  1. 首先編寫一個名字為wc.py的檔案
#!/usr/bin/python
# -*- coding: utf-8 -*-
def wordCount(s):
    chars = len(s)
    words = len(s.split())
    lines = s.count('\n')    #統計\n的個數,即行數
print "lines:%s words:%s chars:%s" % (lines, words, chars) if __name__ == '__main__': #添加了該行程式碼後,本指令碼執行下面程式碼,其他指令碼呼叫該指令碼不執行下面程式碼 f = open('/etc/passwd').read() wordCount(f)

說明:本指令碼的__name__返回的是__main__這個值,其他指令碼呼叫該指令碼的__name__時返回的是該指令碼的名字wc,所以本指令碼會執行if下的程式碼,而其他指令碼呼叫該指令碼時不執行if下的程式碼。這是為了在不改變本指令碼執行結果的情況下,其他指令碼可以使用該指令碼的函式,避免程式碼重寫,提高程式碼複用率。

  1. 編寫另一個指令碼,名字為import_wc.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
import wc    #直接寫指令碼名字,不用加.py
s = '''hello world!
this is python!
'''
wc.wordCount(s)     #呼叫wc指令碼的wordCount函式,不能直接使用函式名呼叫,函式名前還要新增模組名

注意:兩個指令碼要放在同一個目錄下,或者wc.py指令碼要在sys.path列表的目錄下。
使用包的例子
首先在建立一個目錄,比如我們建立一個ex_pack目錄,在該目錄下建立一個__init__.py的空檔案,把上邊的兩個指令碼移動到ex_pack目錄下。

from ex_pack import wc                #載入ex_pack包下的wc模組
wc.wordCount('hello world!\n')        #呼叫wordCount函式
import ex_pack.wc                     #匯入ex_pack下的wc模組
ex_pack.wc.wordCount('hello world!\n')   #呼叫wordCount函式時需要加包名和模組名
from ex_pack.wc import wordCount      #把ex_pack包中wc模組下的wordCount函式直接匯入
wordCount('hello world!\n')           #可以直接使用該函式
from ex_pack.wc import wordCount as wdct    #使用as來定義一個別名,方便呼叫時使用
wdct('hello world!\n')                #使用別名