这期内容当中小编将会给大家带来有关补充subprocess模块和粘包现象及解决办法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
远程执行命令,补充subprocess模块,粘包现象及解决办法
1.subprocess模块
shell参数:
如果把shell设置成True,指定的命令会在shell里解释执行。
subprocess.PIPE
一个可以被用于Popen的stdin 、stdout 和stderr 3个参数的特输值,表示需要创建一个新的管道。
例:
#author: wylkjj
#date:2019/4/18
import subprocess
# b=subprocess.Popen('dir',shell=True)
# print(b)
#stdout=subprocess.PIPE把子进程封装到a里面去了
a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
# print(a)#多进程,子进程,父进程同时进行,谁快谁先打印
print(str(a.stdout.read(),'gbk'))#把执行结果从子进程里面取出来
2.远程执行命令
#author: wylkjj
#date:2019/4/18
#服务端
import subprocess
import socket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.bind(address)
sk.listen(2)
print('waiting')
while 1:
conn,addr=sk.accept()
print(addr)
while 1:
data=conn.recv(4024)
print('......'+str(data, 'utf8'))
if not data:break
obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)
cmd_result = obj.stdout.read()
# 获取发送数据的大小 为int类型,int类型无法与bytes类型相互转换,所以int要先转换成str然后再转换为bytes类型
result_len=bytes(str(len(cmd_result)),'utf8')
conn.sendall(result_len)
conn.send(cmd_result)
sk.close()
#author: wylkjj
#date:2019/4/18
#客户端
import subprocess
import socket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
while True:
inp = input('>>>')
if inp=='exit':
break
sk.send(bytes(inp,'utf8'))
result_len=int(str(sk.recv(1024),'utf8'))
print(result_len)
# 接收数据,是bytes类型,数据量超过8k就不会接收,所以可以设置多次接收
data = bytes()
while len(data) != result_len: #判断data的长度是否与server端传来的长度相符
recv = sk.recv(1024)
data += recv
print(str(data,'gbk'))
sk.close()
3.粘包现象及解决办法
#author: wylkjj
#date:2019/4/18
#服务端
import subprocess
import socket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.bind(address)
sk.listen(2)
print('waiting')
while 1:
conn,addr=sk.accept()
print(addr)
while 1:
data=conn.recv(4024)
print('......'+str(data, 'utf8'))
if not data:break郑州人流价格 http://www.zzzykdfk.com/
obj = subprocess.Popen(str(data,'utf8'), shell=True, stdout=subprocess.PIPE)
cmd_result = obj.stdout.read()
# 获取发送数据的大小 为int类型,int类型无法与bytes类型相互转换,所以int要先转换成str然后再转换为bytes类型
result_len=bytes(str(len(cmd_result)),'utf8')
conn.sendall(result_len)
conn.recv(1024) #因为两个sand连一起发送会出现粘包现象,所以recv一下(利用recv的阻塞原理)
conn.send(cmd_result)
sk.close()
#author: wylkjj
#date:2019/4/18
#客户端
import subprocess
import socket
sk=socket.socket()
address=('127.0.0.1',8000)
sk.connect(address)
while True:
inp = input('>>>')
if inp=='exit':
break
sk.send(bytes(inp,'utf8'))
result_len=int(str(sk.recv(1024),'utf8'))
sk.sendall("ok")
print(result_len)
# 接收数据,是bytes类型,数据量超过8k就不会接收,所以可以设置多次接收
data = bytes()
while len(data) != result_len: #判断data的长度是否与server端传来的长度相符
recv = sk.recv(1024)
data += recv
print(str(data,'gbk'))
sk.close()
上述就是小编为大家分享的补充subprocess模块和粘包现象及解决办法是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。