专栏文章 终于把这份 Python import 指南整理好了,速看!

fishfish-yu · 2021年08月20日 · 最后由 fishfish-yu 回复于 2021年08月26日 · 3928 次阅读

此文章来源于项目官方公众号:“AirtestProject”
版权声明:允许转载,但转载必须保留原链接;请勿用作商业或者非法用途

前言

最近发现很多同学都在问 Python 引入和调用的问题,比如报错无法引入模块、或者找不到某个模块。

ImportError: cannot import name 'Select'

ModuleNotFoundError: No module named 'test'

今天我们就单独聊一下这个问题,希望能给同学们一些解决思路。

1. Python 标准库与第三方库

首先我们来看一个基础问题,区分下 Python 的标准库与第三方库。如下图所示:

1)Python 标准库

Python 的标准库,实际上就是一些内置模块,只要我们安装了 Python,就自带这些内置模块,比如 randomos 等等。

使用这些库也非常简单,我们无需额外的安装,就可以直接 import 进来使用:

import random

print(random.random())
2)Python 第三方库

那 Python 的第三方库呢,就是一些非官方组织或者个人,写出来的具有某些特定功能的框架,比如我们的 Airtest,就是用来做 UI 自动化测试的一个 Python 第三方库;还有图中示例的 Django,是用来进行 web 开发的一个 Python 第三方库。

使用这些第三方库呢,除了要有一个 Python 环境之外,还要在这个 Python 环境里面,安装上我们要用到的第三方库,比如使用 Airtest 和 Poco:

pip install airtest
pip install pocoui

成功把这些第三方库安装到我们的 Python 环境之后,我们才能够从这些库里面 import 我们想要的功能:

from airtest.core.api import *

auto_setup(__file__)
snapshot(msg="请填写测试点.")

3)出现 no module named 'airtest' 的解决办法

如果同学们理解了 Python 标准库和第三方库的区别后,再遇到类似 no module named 'airtest' 或者no moudle named 'airtest-selenium' 等问题时,就会知道是因为当前 Python 环境里没有安装好这些第三方库的原因了。

解决办法也非常简单,找到当前使用的 Python 环境,然后在该环境下安装好我们所需的第三方库即可。(特别注意如本地有多个 Python 环境时,需要在同学们使用的那个 Python 环境里安装所需的第三方库)

2. Python 导入模块的几种方式

1)import os

这种导入方式常用于导入 Python 的标准库:

# 打印当前的工作目录
import os
print(os.getcwd())
2)from os import chmod

这种导入方式常用于包文件的导入,当然也有同学习惯这样使用:

from airtest.report.report import *

这样导入尽管不会报错,但是可读性相对较差。

3)import logging as log

这种方式给导入的模块起了别名,后续我们再用到该模块的方法时,可以用别名来调用:

import logging as log
log.info('this is a info message')

3. 如何知道该从哪个模块里面引入你所需的方法

我们就以 Airtest 框架的使用来说,我们在 IDE 上新建了 1 个 .air 脚本,默认就会带上这句引入的脚本:

from airtest.core.api import *

这句话的意思是引入了 airtest.core.api 这个模块里面的所有内容,也就是 Airtest 的核心 API。

像我们常用到的 auto_setupstart_apptouchswipe 等都是这个模块下面的。

1)出现 name 'xxx' is not defined 的解决办法

但是 airtest 还有很多其它模块,比如报告模块。在教程文档中,我们知道了可以用 simple_report 来生成 Airtest 报告,但实际编写脚本时,就可能出现如下问题:

from airtest.core.api import *

auto_setup(__file__,logdir=True)
snapshot(msg="请填写测试点.")
simple_report(__file__,logpath=True)

-----
Traceback (most recent call last):
  File "airtest\cli\runner.py", line 73, in runTest
  File "site-packages\six.py", line 703, in reraise
  File "airtest\cli\runner.py", line 70, in runTest
  File "D:\test\taikang_test.air\taikang_test.py", line 11, in <module>
    simple_report(__file__,logpath=True)
NameError: name 'simple_report' is not defined
-----

这是因为 simple_report 不在 airtest.core.api 这个模块里面,我们需要额外引入 simple_report 所在的模块。

那么问题来了,怎么知道 simple_report 在哪个模块下面呢?最简单的办法,打开 Airtest 的 API 文档,然后搜一下 simple_report 即可:

可以看到 simple_report 所在的模块是 airtest.report.report ,我们只需要在脚本里添加该模块的引入即可:

from airtest.report.report import simple_report
simple_report(__file__,logpath=True)

再举个例子,在模拟滑动的案例中,我们看到可以使用如下的方法来模拟长按并拖动的操作:

# 长按删除应用
longtouch_event = [
    DownEvent([908, 892]),# 待删除应用的坐标
    SleepEvent(2),
    MoveEvent([165,285]),# 删除应用的垃圾桶坐标
    UpEvent(0)]

device().touch_proxy.perform(longtouch_event)

我们依然可以通过上述的查 API 文档的方式,来知道需要引入的模块:

这里我们附上 Airtest 和 Poco 的 API 文档地址:

4. 引入其它的 .air 脚本的 using() 接口

那么聊完库的使用和模块引入的方法之后,我们再来看下关于引入的另一个问题,如何引入其它的 .air 脚本。

Airtest 提供了 using 接口,能够将需要引用的脚本加入 sys.path 里,其中包含的图片文件也会被加入 Template 的搜索路径中。

举个例子,我们有俩个同级的 .air 脚本,要在 1 个 .air 脚本引入另外一个 .air 脚本,可以这么实现:

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *
auto_setup(__file__)

using("common.air")

from common import common_function
common_function()

但如果我们脱离 AirtestIDE 来运行这个脚本,比如在 pycharm 中打开这个脚本来运行,有可能会出现如下报错:

Traceback (most recent call last):
  File "D:/test/taikang_test.air/taikang_test.py", line 13, in <module>
    from common import common_function
ModuleNotFoundError: No module named 'common'

此时,最简单粗暴的方式是将 using 里面的相对路径改成绝对路径:

using(r"D:/test/common.air")

from common import common_function
common_function()

如果不想改动 using 的脚本,我们还可以额外添加 1 个待引入脚本的 pathsys.path 里:

import sys
sys.path.append("D:/test/common.air")

using(r"common.air")

from common import common_function
common_function()

小结

那么今天的教程我们主要讲了以下内容:

  • Python 标准库与第三方库的区别以及引入办法
  • Python 的几种 import 方式
  • 在 API 文档查询使用方法所在的模块
  • 引入其它 .air 脚本的 using 接口

如还有其他引入相关的问题,欢迎到我们的官方交流 Q 群(654700783)进行反馈。


Airtest 官网https://airtest.netease.com/
Airtest 教程官网https://airtest.doc.io.netease.com/
搭建企业私有云服务https://airlab.163.com/b2b

官方答疑 Q 群:654700783

呀~这么认真都看到这里啦,帮忙点击左下角的爱心,给我点个赞支持一下把,灰常感谢~

共收到 4 条回复 时间 点赞

大佬整理的东西,学起来!

可否再介绍下那种用相对路径进行私有库引用的情形,通过 IDE 都可以定位过去引用,但是代码运行总是报错
例如
当前在 third_part2 文件夹
from test. first. second. third_part1 import third_part1_method
改成
from ..third_part1 import third_part1_method
就不可以
这种怎么解决呢
用的 pycharm

杨漫步 回复

引用取决于你运行脚本时的路径,可以在 sys.path 里加入你资源包的路径,应该可以解决引用相对路径包的问题

杨漫步 回复

楼下那个是正解,你还可以自己打印出当前的 sys.path 来看看为什么你的相对路径这么写是不对的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册