前言
最近發現很多同學都在問Python引入和調用的問題,比如報錯無法引入模塊、或者找不到某個模塊。
ImportError: cannot import name 'Select'
ModuleNotFoundError: No module named 'test'
今天我們就單獨聊一下這個問題,希望能給同學們一些解決思路。
1. Python標准庫與第三方庫
首先我們來看一個基礎問題,區分下Python的標准庫與第三方庫。如下圖所示:

1)Python標准庫
Python的標准庫,實際上就是一些內置模塊,只要我們安裝了Python,就自帶這些內置模塊,比如 random 、 os 等等。
使用這些庫也非常簡單,我們無需額外的安裝,就可以直接 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_setup 、 start_app 、 touch 、 swipe 等都是這個模塊下面的。
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文檔地址:
- Airtest API 文檔:https://airtest.readthedocs.io/zh_CN/latest/index.html
- Poco API 文檔:https://poco.readthedocs.io/zh_CN/latest/index.html
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個待引入腳本的 path 到 sys.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
呀,這么認真都看到這里啦,幫忙點個推薦支持一下唄,灰常感謝~
