天天看点

python做脚本语言怎么用_脚本语言系列之Python | Python模块

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文件

欢迎关注作者,如果觉得写的还不错,就给点个赞同、喜欢、收藏(后续持续更新)。

【全文手打 如需转载 请标注此出处】