python模块以及包管理

一、模块的导入方式

1、 import方式导入(绝对导入):在后续代码中调用此模块中的类,函数,属性等都是通过:模块名.函数名、模块名.类名、模块名.属性名的方式调用。

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 方式导入(相对导入):在后续代码中调用此模块中的类,函数,属性等都是通过直接写类名,函数名,属性名。

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中能直接调用系统模块,同理,也可以调用自己创建的模块,尤其在自动化测试中,调用执行测试用例时,用得比较多,一般分为同级目录调用和跨目录模块调用。

1、同级目录模块调用

在test_case目录下,创建了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')

执行test_b.py能正常执行

this is test_a
this is test_b

2、跨目录模块调用

在test_case目录下,创建了test_aaa文件夹,并在其下创建了test_a.py以及test_ccc文件夹,在test_ccc文件下创建了test_c.py文件,现在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')

执行test_a.py文件时,提示错误:不能找到模块

import test_c
ModuleNotFoundError: No module named 'test_c'

在之前同一级目录下,都能运行,不同目录下就出现问题了。这是为什么呢?要理解它,需要知道执行import语句时,到底发生了什么?总结如下:

  • 第一步,创建一个新的module对象;
  • 第二步,把这个module对象插入到sys.module中;
  • 第三步,找到module程序所在位置,转载module的代码。这里需要注意的是程序查找的顺序方法,首先,是找当前路径(以及当前目录指定的sys.path),然后是PythonPATH,再然后是python的安装路径。如果当前路径存在或PythonPATH中存在与标准module同样名称的模块时,则会执行当前路径存在或PythonPATH中存在的模块,所以在给文件名取名称时需要注意;
  • 第四步,执行新的module中对应的代码。

了解原理后,就明白了,在引入在不同目录下的模块时,import不能找到执行的模块,那么需要指定相应的路径才能找到并执行。如下:

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

print('this is test_a')

结果:已经能找到并执行程序

this is test_c
this is test_a

三、包管理

包的定义:一个包(package)就是放在一个文件夹里的模块集合。包的名字就是文件夹的名字。

现在考虑实际工作中的使用场景,在执行测试用例时,众多的测试用例可能分布在不同目录层级下的文件中,也就是包中国。此时,需要用到python中的dicover函数,它会自动查找到我们想要的测试用例脚本文件,而不用我们手动去加入每个测试用例脚本文件名称。比如:

if __name__ == '__main__':
    #构造测试集
    suite = unittest.TestSuite()
    suite.addTest('test_a')#手动加入每个测试用例脚本文件名称
    suite.addTest('test_b')#手动加入每个测试用例脚本文件名称
    suite.addTest('test_c')#手动加入每个测试用例脚本文件名称
    #执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)

当测试用例成百上千时,手动的效率可想而知是如何低下,于是轮到dicover函数出场:

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。

现在用dicover函数方法去查找不同目录下的测试用例脚本文件,比如:执行test_one.py文件,找到并执行test_a.py、test_b.py和test_c.py文件。

执行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)

结果:没有找到,也没有执行任何的测试用例

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

OK

这是为什么?因为我们在执行程序的时候要告诉python,我们的测试用例放在哪些包中,那怎么告诉python呢?其实很简单,也就是把一个名为__ init__.py的文件(通常是文件内容为空)放在文件夹中。比如:

现在我们再次执行test_one.py文件,看能否找到并执行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)

结果:已经能成功找到!

this is test_a
this is test_c
this is test_b

这里需要注意,unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:09,AZ,a~z。所以你会看到以上的执行结果,因为它查找到的文件夹名称的顺序是先test_aaa,然后是test_bbb。所以先执行test_a.py,再test_c.py,最后test_b.py。

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

1、使用模块的时候需要注意:

模块名要遵循python的命名规范,也就是尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况),
不要使用中文或者特殊字符。

模块名不要和系统模块名冲突,最好先检查系统是否已经存在该模块,检查的方法是在python的交互环境中执行import XXX,
若成功,则说明存在此模块。可以通过import导入数据,另外,需要注意变量的作用域。

自己创建模块名称时,要注意命名,不能和python自带的模块名称冲突。

2、引入模块的时候需要注意:

import导入几个模块时,要用逗号进行分开。

模块名字太长可以取别名,比如:import XX as xx等

from import,是从模块名引入方法名

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • 模块和包 一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是...
    go以恒阅读 2,278评论 0 4
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,746评论 0 10
  • 1.1Python中的模块介绍和使用 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#...
    TENG书阅读 417评论 0 0
  • 天地 第十二 【原文1·16】 百年之木,破为牺尊,青黄而文之,其断在沟中。比牺尊于沟中之断,则美恶有间矣,其于失...
    海上明月共阅读 215评论 0 0
  • 今天是一个特殊的日子,四月一日,愚人节。 特殊的日子总有些特殊的回忆,记得以前刚刚开始兴起过这个节的时候,总是会对...
    小满心欢喜阅读 391评论 0 1