您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)補(bǔ)充subprocess模塊和粘包現(xiàn)象及解決辦法是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
遠(yuǎn)程執(zhí)行命令,補(bǔ)充subprocess模塊,粘包現(xiàn)象及解決辦法
1.subprocess模塊
shell參數(shù):
如果把shell設(shè)置成True,指定的命令會在shell里解釋執(zhí)行。
subprocess.PIPE
一個可以被用于Popen的stdin 、stdout 和stderr 3個參數(shù)的特輸值,表示需要創(chuàng)建一個新的管道。
例:
#author: wylkjj
#date:2019/4/18
import subprocess
# b=subprocess.Popen('dir',shell=True)
# print(b)
#stdout=subprocess.PIPE把子進(jìn)程封裝到a里面去了
a=subprocess.Popen('dir',shell=True,stdout=subprocess.PIPE)
# print(a)#多進(jìn)程,子進(jìn)程,父進(jìn)程同時進(jìn)行,誰快誰先打印
print(str(a.stdout.read(),'gbk'))#把執(zhí)行結(jié)果從子進(jìn)程里面取出來
2.遠(yuǎn)程執(zhí)行命令
#author: wylkjj
#date:2019/4/18
#服務(wù)端
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()
# 獲取發(fā)送數(shù)據(jù)的大小 為int類型,int類型無法與bytes類型相互轉(zhuǎn)換,所以int要先轉(zhuǎn)換成str然后再轉(zhuǎn)換為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)
# 接收數(shù)據(jù),是bytes類型,數(shù)據(jù)量超過8k就不會接收,所以可以設(shè)置多次接收
data = bytes()
while len(data) != result_len: #判斷data的長度是否與server端傳來的長度相符
recv = sk.recv(1024)
data += recv
print(str(data,'gbk'))
sk.close()
3.粘包現(xiàn)象及解決辦法
#author: wylkjj
#date:2019/4/18
#服務(wù)端
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()
# 獲取發(fā)送數(shù)據(jù)的大小 為int類型,int類型無法與bytes類型相互轉(zhuǎn)換,所以int要先轉(zhuǎn)換成str然后再轉(zhuǎn)換為bytes類型
result_len=bytes(str(len(cmd_result)),'utf8')
conn.sendall(result_len)
conn.recv(1024) #因為兩個sand連一起發(fā)送會出現(xiàn)粘包現(xiàn)象,所以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)
# 接收數(shù)據(jù),是bytes類型,數(shù)據(jù)量超過8k就不會接收,所以可以設(shè)置多次接收
data = bytes()
while len(data) != result_len: #判斷data的長度是否與server端傳來的長度相符
recv = sk.recv(1024)
data += recv
print(str(data,'gbk'))
sk.close()
上述就是小編為大家分享的補(bǔ)充subprocess模塊和粘包現(xiàn)象及解決辦法是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。