Python是做自动化工作首选的一门语言,与更复杂的语言相比,Python 非常便于快速学习、语法很少,具有良好的 可读性,即使测试工程师们没有丰富的编码经验,也能快速学会;Python 的极简风格对于测试自动化具有诸多优势,测试步骤在本质上是呈线性的、一 次执行一个,按顺序执行,配合丰富的插件,非常适合测试脚本的开发。
本文主要介绍python中模块和包的概念,以及相同目录下、不同目录下的导模块的用法。
一、模块与包的概念
1、python模块
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
2、python中的包包是一个分层次的文件目录结构,它定义了一个由模块及子包和子包下的子包等组成的 Python 的应用环境。
简单来说,包就是文件夹,但该文件夹下必须存在 _init_.py 文件,该文件的内容可以为空。 后续的内容不专门写导包,使用方式和导模块相似
3、导模块、导包的基础用法
#直接导入模块
import time
#直接导入包
# import selenium.webdriver.common
#通过包的定位,导入common中的模块action_chains
# from selenium.webdriver.common import action_chains
#通过包的定位,找到模块action_chains,导入模块中的类
from selenium.webdriver.common.action_chains import ActionChains
二、导模块(同目录下)
为了演示模块导入的用法,我们先在同一个目录下创建两个模块,分别命名为test01.py和diaoyong.py。
test01.py模块的内容如下:
def aaa():
print("我是一个方法")
class Animal():
def bbb(self):
print("我是类中的一个方法")
print("我是一条可执行语句")
1、import语句
import导入模块的法如下:
import 模块名
import 包名
在模块diaoyong.py中导入上文写的模块test01.py,实现如下:
# 直接导入模块时候是不能直接使用方法或者类名的
# 需要使用模块名.方法名或者模块名.类名
# 导入模块
import test01
test01.aaa()
a = test01.Animal()
a.bbb()
====输出结果====
我是一条可执行语句
我是一个方法
我是类中的一个方法一个模块只会被导入一次,不管你执行了多少次import, 这样可以防止导入模块被一遍又一遍地执行。
2、from…import 语句
Python 的 from 语句让你从模块中导入一个或者多个指定的部分当前代码,语法如下:
from modname import name1[, name2[, ... nameN]]
在模块diaoyong.py中导入上文写的模块test01.py,实现如下:
from test01 import aaa,Animal
aaa()
a = Animal()
a.bbb()这个声明不会把整个test01模块导入到当前的命名空间中,它只会将 test01里的aa、Animal导入到执行这个声明的模块的全局符号表中。
3、from…import* 语句
把一个模块的所有内容全都导入到当前的命名空间,但是不建议经常使用这种写法,还是用哪个导入哪个
from test01 import *
三、不同目录下的导模块
1、导模块的原理
import导入模块都做了啥:找到模块文件
编译成字节码(需要时).pyc
执行导入模块的代码注意:在之后导入相同的模块时候,会跳过这三个步骤,而只提取内存中已加载模块对象
如何找到模块(下面的几项内容组成了sys.path的列表):程序的主目录(导模块所在文件夹目录)
PTYHONPATH目录(python的安装目录)
标准连接库目录(Lib)
任何的.pth文件的内容
在导模块的时候,python会依次检测上面的各个目录中是否有要导入的模块,如果有就导入,没有就报错。
import sys
path = sys.path
print(path)
2、需要导入的模块在当前模块的上一级目录
为了演示模块导入的用法,我们先在当前目录下创建diaoyong.py模块,在当前目录的上一级目创建test01.py模块。
test01.py模块的内容如下:
def aaa():
print("我是一个方法")
class Animal():
def bbb(self):
print("我是类中的一个方法")
print("我是一条可执行语句")
在diaoyong.py模块如果想正常调用上一级目录的模块,代码实现为:
import sys
import os
path = sys.path
#绝对路径的使用,缺点就是不灵活,代码文件的位置一发生变化,代码就需要重新改
#就是使用相对的路径(要有一个参考的标准),选择当前文件所在的位置作为标准行不?
#os提供了一个方法,帮我们动态地获取当前文件所在的路径
#下面的代码实现获取当前文件所在目录的上一级目录
pathCurrent = os.path.dirname(os.path.dirname(__file__))
path.append(pathCurrent)
import test01
====输出结果====
我是一条可执行语句
3、需要导入的模块在当前模块所在目录的同级别目录
为了演示模块导入的用法,我们先在当前目录下创建diaoyong.py模块,在当前目录的同级别目录AAA中创建test01.py模块。
test01.py模块的内容如下:
def aaa():
print("我是一个方法")
class Animal():
def bbb(self):
print("我是类中的一个方法")
print("我是一条可执行语句")
在diaoyong.py模块,如果想正常调用当前目录的同级别目录AAA中的模块,代码实现为:
import sys
import os
path = sys.path
#绝对路径的使用,缺点就是不灵活,代码文件的位置一发生变化,代码就需要重新改
#就是使用相对的路径(要有一个参考的标准),选择当前文件所在的位置作为标准行不?
#os提供了一个方法,帮我们动态地获取当前文件所在的路径
#下面的代码实现获取当前文件所在目录的上一级目录,然后拼接同一级别目录名AAA
pathCurrent = os.path.dirname(os.path.dirname(__file__))+r"AAA"
path.append(pathCurrent)
import test01
====输出结果====
我是一条可执行语句
还有一种方式就是在AAA中创建_init_.py模块,将AAA定义为包,则diaoyong.py模块代码可以改为,效果和上面是一样的:
import sys
import os
path = sys.path
pathCurrent = os.path.dirname(os.path.dirname(__file__))
path.append(pathCurrent)
import AAA.test01
====输出结果====
我是一条可执行语句
4、_name_的用法
作用:“Make a script both importable and executable”如果我们是直接执行某个.py文件的时候,该文件中: ”_name== '_main_'“ 是True
但是我们如果从另外一个.py文件通过import导入该文件的时候,这时_name_的值就是我们这个py文件的名字而不是_main_。
调试代码的时候,在”if _name== '_main_'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
def aaa():
print("我是一个方法")
class Animal():
def bbb(self):
print("我是类中的一个方法")
print("我是一条可执行语句")
if __name__=="__main__":
print(__name__)
print("当前文件中运行代码")
else:
print(__name__)
print("其他模块调用当前模块")上面的name和main的前后都是两个下划线,在markdown文件中输出不出来,包括前文中的init.py文件
欢迎关注作者,如果觉得写的还不错,就给点个赞同、喜欢、收藏(后续持续更新)。
【全文手打 如需转载 请标注此出处】