• 终于把这份 Python import 指南整理好了,速看!


    前言

    最近发现很多同学都在问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 "airtestcli
    unner.py", line 73, in runTest
      File "site-packagessix.py", line 703, in reraise
      File "airtestcli
    unner.py", line 70, in runTest
      File "D:	est	aikang_test.air	aikang_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

    呀,这么认真都看到这里啦,帮忙点个推荐支持一下呗,灰常感谢~

  • 相关阅读:
    Oracle->oracle单实例Shell脚本[20180122]
    oracle 11g grid软件安装[20180121]
    MySQL-5.7.20主从复制测试[20180110]
    Sonarqube中文插件-Linux[20180105]
    Sonar安装-Linux[20171227]
    (Linux 日常命令)[20171225]
    ThreadLocal的实现机制
    LruCache源码分析
    命令提示符怎么以管理员方式打开
    Eslint 从入门到放弃 http://blog.csdn.net/fay462298322/article/details/74931092
  • 原文地址:https://www.cnblogs.com/AirtestProject/p/15165388.html
Copyright © 2020-2023  润新知