Python实现Appium端口检测与释放的实现
本文详解如何利用Python实现Appium相关端口的检测与释放。通过Socket模块判断端口占用状态,并结合CMD命令(netstat、taskkill)或os.popen接口强制释放被占用端口,解决自动化测试中常见的端口冲突问题。
1. 监测端口
我们需要引入Python标准库中的socket模块,用于校验指定端口当前是否处于被占用状态。
1.1 socket是什么?
简单来说,Socket是网络通信中实现数据交换的双向连接通道,其两端分别对应一个端口号。建立任何网络通信连接,至少需要一对Socket端口。
1.2 socket本质是什么?
Socket本质上是编程接口(API),它对底层的TCP/IP协议栈进行了封装。TCP/IP协议族提供了供程序员进行网络开发的标准接口,即Socket编程接口。
关于Socket的底层通讯原理,可参考相关Socket通讯原理文章;关于Python中Socket模块的具体用法,建议查阅Python官方socket模块文档。
接下来通过代码示例,展示如何检测端口是否被使用。
# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-7-7
"""
import socket
def check_port(host,port):
"检查端口是否被占用"
#创建socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
s.connect((host,port))
s.shutdown(2) #表示将来禁止读和写
except OSError as msg:
print("port %s is available !" %port)
print(msg)
return True
else:
print("port %s already in use! " %port)
return False
if __name__ == '__main__':
host = '127.0.0.1'
prot = 4723
check_port(host,prot)
这里需要注意shutdown(self, flag)方法的作用:它用于禁止在指定Socket上进行数据的接收和发送。利用shutdown()函数,可以将原本的双向数据传输模式转换为单向数据传输模式。
shutdown方法的参数说明如下: > 0:表示禁止将来进行读操作; > 1:表示禁止将来进行写操作; > 2:表示同时禁止将来的读和写操作。
以下是代码执行后的结果展示:
从下图的运行状态可以看出,服务器未开启该端口的服务,这表明该端口当前是可以使用的。

2. 释放端口
如果检测到端口已被占用,则需要执行释放操作。释放端口主要有两种途径: 1. 通过CMD命令行窗口释放端口; 2. 通过Python代码自动释放端口。
2.1 cmd 释放端口
第一步,先查找我们需要关注的目标端口号。
netstat -aon | findstr "5037"

第二步,通过该端口号查找对应的进程ID(PID),然后终止该进程以释放端口。
taskkill -f -pid 18028
2.2 Python代码释放端口
那么,如何在Python脚本中实现这一过程呢?请参考以下代码:
# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-7-7
"""
import os
def release_port(port):
"释放指定端口"
#查找端口对应的pid
cmd_find = 'netstat -ano | findstr %s' %port
print(cmd_find)
#返回命令执行结果
result = os.popen(cmd_find).read()
print(result)
if str(port) and 'LISTENING' in result:
#获取端口对应的pid进程
i = result.index('LISTENING')
# 'LISTENING'与端口号之间相隔7个空格
start = i + len('LISTENING') +7
end = result.index('\n')
pid = result[start:end]
#关闭被占用端口的pid
cmd_kill = 'taskkill -f -pid %s' %pid
print(cmd_kill)
os.popen(cmd_kill)
else:
print('port %s is available !' %port)
if __name__ == '__main__':
host = '127.0.0.1'
port = 4723
release_port(port)
我们来观察一下代码的运行结果:

结果显示端口4723是可用的。这里补充说明一下: os.popen():用于打开一个管道,从而获取输入到CMD控制台的信息。 更详细的内容,可参考Python官方os.popen()文档。 此外,若想快速了解os.popen()与os.system()的区别,可参考《调用系统命令 os.system()和os.popen()》一文。
至此,关于Python实现Appium端口检测与释放的介绍已完成。更多Python Appium端口检测相关内容,欢迎搜索本站历史文章或继续浏览后续文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









