您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關補充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模塊和粘包現象及解決辦法是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。