python模塊以及包管理

一、模塊的導入方式

1、 import方式導入(絕對導入):在后續(xù)代碼中調用此模塊中的類,函數(shù),屬性等都是通過:模塊名.函數(shù)名、模塊名.類名、模塊名.屬性名的方式調用。

import datetime
import time

print("import方式導入:")
print(datetime.datetime.now())
print(time.time())

結果:

import方式導入:
2019-07-09 09:22:58.838245
1562635378.8382452

2、 form...import 方式導入(相對導入):在后續(xù)代碼中調用此模塊中的類,函數(shù),屬性等都是通過直接寫類名,函數(shù)名,屬性名。

from datetime import datetime
from time import *

print("form...import方式導入:")
print(datetime.now())
print(time())

結果:

form...import方式導入:
2019-07-09 09:23:23.161034
1562635403.1610339

二、模塊的調用

從上例可以知道,在python中能直接調用系統(tǒng)模塊,同理,也可以調用自己創(chuàng)建的模塊,尤其在自動化測試中,調用執(zhí)行測試用例時,用得比較多,一般分為同級目錄調用和跨目錄模塊調用。

1、同級目錄模塊調用

在test_case目錄下,創(chuàng)建了test_a.py以及test_b.py文件,它兩是同一目錄下的文件。


test_a.py文件:

print('this is test_a')

test_b.py文件:

import test_a

print('this is test_b')

執(zhí)行test_b.py能正常執(zhí)行

this is test_a
this is test_b

2、跨目錄模塊調用

在test_case目錄下,創(chuàng)建了test_aaa文件夾,并在其下創(chuàng)建了test_a.py以及test_ccc文件夾,在test_ccc文件下創(chuàng)建了test_c.py文件,現(xiàn)在test_a.py和test_c.py它兩是不在同一目錄下。

test_a.py文件:

import test_c

print('this is test_a')

test_c.py文件:

print('this is test_c')

執(zhí)行test_a.py文件時,提示錯誤:不能找到模塊

import test_c
ModuleNotFoundError: No module named 'test_c'

在之前同一級目錄下,都能運行,不同目錄下就出現(xiàn)問題了。這是為什么呢?要理解它,需要知道執(zhí)行import語句時,到底發(fā)生了什么?總結如下:

  • 第一步,創(chuàng)建一個新的module對象;
  • 第二步,把這個module對象插入到sys.module中;
  • 第三步,找到module程序所在位置,轉載module的代碼。這里需要注意的是程序查找的順序方法,首先,是找當前路徑(以及當前目錄指定的sys.path),然后是PythonPATH,再然后是python的安裝路徑。如果當前路徑存在或PythonPATH中存在與標準module同樣名稱的模塊時,則會執(zhí)行當前路徑存在或PythonPATH中存在的模塊,所以在給文件名取名稱時需要注意;
  • 第四步,執(zhí)行新的module中對應的代碼。

了解原理后,就明白了,在引入在不同目錄下的模塊時,import不能找到執(zhí)行的模塊,那么需要指定相應的路徑才能找到并執(zhí)行。如下:

import sys
sys.path.append(r'E:\python\unittest_test\test_case\test_aaa\test_ccc')
import test_c

print('this is test_a')

結果:已經(jīng)能找到并執(zhí)行程序

this is test_c
this is test_a

三、包管理

包的定義:一個包(package)就是放在一個文件夾里的模塊集合。包的名字就是文件夾的名字。

現(xiàn)在考慮實際工作中的使用場景,在執(zhí)行測試用例時,眾多的測試用例可能分布在不同目錄層級下的文件中,也就是包中國。此時,需要用到python中的dicover函數(shù),它會自動查找到我們想要的測試用例腳本文件,而不用我們手動去加入每個測試用例腳本文件名稱。比如:

if __name__ == '__main__':
    #構造測試集
    suite = unittest.TestSuite()
    suite.addTest('test_a')#手動加入每個測試用例腳本文件名稱
    suite.addTest('test_b')#手動加入每個測試用例腳本文件名稱
    suite.addTest('test_c')#手動加入每個測試用例腳本文件名稱
    #執(zhí)行測試
    runner = unittest.TextTestRunner()
    runner.run(suite)

當測試用例成百上千時,手動的效率可想而知是如何低下,于是輪到dicover函數(shù)出場:

import unittest
unittest.defaultTestLoader.discover(start_dir=,pattern='test*.py',top_level_dir=None)

discover(start_dir=,pattern='test*.py',top_level_dir=None)

  • start_dir:要測試的模塊名或者測試用例目錄;
  • pattern:表示用例文件名的匹配原則。比如:pattern='test.py',這里匹配的是test開頭的.py類型的文件,星號“”表示任意多個字符;
  • top_level_dir:測試模塊的頂層目錄。如果沒有,默認為None。

現(xiàn)在用dicover函數(shù)方法去查找不同目錄下的測試用例腳本文件,比如:執(zhí)行test_one.py文件,找到并執(zhí)行test_a.py、test_b.py和test_c.py文件。

執(zhí)行test_one.py文件:

import unittest

test_dir = r'E:\python\unittest_test\test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(discover)

結果:沒有找到,也沒有執(zhí)行任何的測試用例

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

這是為什么?因為我們在執(zhí)行程序的時候要告訴python,我們的測試用例放在哪些包中,那怎么告訴python呢?其實很簡單,也就是把一個名為__ init__.py的文件(通常是文件內容為空)放在文件夾中。比如:

現(xiàn)在我們再次執(zhí)行test_one.py文件,看能否找到并執(zhí)行test_a.py、test_b.py和test_c.py文件。

import unittest

test_dir = r'E:\python\unittest_test\test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')

if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(discover)

結果:已經(jīng)能成功找到!

this is test_a
this is test_c
this is test_b

這里需要注意,unittest框架默認根據(jù)ASCII碼的順序加載測試用例,數(shù)字與字母的順序為:09,AZ,a~z。所以你會看到以上的執(zhí)行結果,因為它查找到的文件夾名稱的順序是先test_aaa,然后是test_bbb。所以先執(zhí)行test_a.py,再test_c.py,最后test_b.py。

四、使用模塊或者引入模塊的時候需要注意哪些?

1、使用模塊的時候需要注意:

模塊名要遵循python的命名規(guī)范,也就是盡量使用小寫命名,首字母保持小寫,盡量不要用下劃線(除非多個單詞,且數(shù)量不多的情況),
不要使用中文或者特殊字符。

模塊名不要和系統(tǒng)模塊名沖突,最好先檢查系統(tǒng)是否已經(jīng)存在該模塊,檢查的方法是在python的交互環(huán)境中執(zhí)行import XXX,
若成功,則說明存在此模塊。可以通過import導入數(shù)據(jù),另外,需要注意變量的作用域。

自己創(chuàng)建模塊名稱時,要注意命名,不能和python自帶的模塊名稱沖突。

2、引入模塊的時候需要注意:

import導入幾個模塊時,要用逗號進行分開。

模塊名字太長可以取別名,比如:import XX as xx等

from import,是從模塊名引入方法名

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 模塊和包 一 模塊 1 什么是模塊? 常見的場景:一個模塊就是一個包含了python定義和聲明的文件,文件名就是...
    go以恒閱讀 2,348評論 0 4
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,343評論 0 10
  • 1.1Python中的模塊介紹和使用 有過C語言編程經(jīng)驗的朋友都知道在C語言中如果要引用sqrt函數(shù),必須用語句#...
    TENG書閱讀 477評論 0 0
  • 天地 第十二 【原文1·16】 百年之木,破為犧尊,青黃而文之,其斷在溝中。比犧尊于溝中之斷,則美惡有間矣,其于失...
    海上明月共閱讀 256評論 0 0
  • 今天是一個特殊的日子,四月一日,愚人節(jié)。 特殊的日子總有些特殊的回憶,記得以前剛剛開始興起過這個節(jié)的時候,總是會對...
    小滿心歡喜閱讀 426評論 0 1

友情鏈接更多精彩內容