安基網 首頁 編程 Python 查看內容

雪缘园德甲:Python實現cmd命令連續執行

英超雪缘园 www.trual.com.cn 2019-12-29 11:24| 投稿: xiaotiger |來自: 互聯網


免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

摘要: 之前是想寫一個微信控制程序,通過登錄網頁微信,可以直接執行命令行代碼。也不用ssh登錄了,想法很方便。但是現實很殘酷,微信登錄這塊基本沒有問題,已經有大佬寫好了,但是命令行執行遇到問題了。運行cmd開始時,使用os.popen()執行命令,但是該命令需要手動修改運行目錄。此方案被我直接丟棄了。單 ...

之前是想寫一個微信控制程序,通過登錄網頁微信,可以直接執行命令行代碼。也不用ssh登錄了,想法很方便。

但是現實很殘酷,微信登錄這塊基本沒有問題,已經有大佬寫好了,但是命令行執行遇到問題了。

運行cmd

開始時,使用os.popen()執行命令,但是該命令需要手動修改運行目錄。此方案被我直接丟棄了。

單開進程

那么自然想到通過啟動進程的方式來實現,Python有對進程的封裝subprocess,可以通過創建Popen對象來實現。我只要單開一個bash,與它進行交互就好啦。

簡單實現如下:

p = subprocess.Popen('/bin/bash', shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)while True:  c = input()  c += os.linesep  p.stdin.write(c.encode('utf8'))  print(out_s.decode('utf8'), end='')

然后,馬上就有遇到問題了,輸出流一直拿不到內容,被阻塞了。

刷新緩沖區

被阻塞有兩種情況,一輸入流阻塞,所以沒有輸出,二輸出流阻塞??吹酵嫌械慕淙肓鞴乇站涂梢粵耍?/p>

p.stdin.close()

但是關閉后就不能再次運行命令了,通過查看其對象方法,發現可以直接刷新緩沖區,很好

p.stdin.flush()

但是發現讀取到的文件只有一行,很明顯,沒有讀完

循環讀取

需要循環讀取輸出緩沖區的內容。

while True:  out_s = p.stdout.readline()  print(out_s.decode('utf8'), end='')

新的問題出現了,循環怎么結束???當緩沖區沒有內容時,readline方法會阻塞等待。

讀取阻塞

很好,找了半天也沒找到解決阻塞的辦法。那就只能靠自己了,既然它要阻塞,那就隨他阻塞好了,我單開一個線程去讀取,讓它一直阻塞去吧。

解決后的完整測試代碼:

import subprocessimport osimport threadingp = subprocess.Popen('/bin/bash', shell=True, stdin=subprocess.PIPE, stderr=subprocess.PIPE, stdout=subprocess.PIPE)def test():  global p  while True:    print(p.stdout.readline().decode('utf8'), end='')threading.Thread(target=test).start()while True:  c = input()  c += os.linesep  p.stdin.write(c.encode('utf8'))  p.stdin.flush()

很好,問題解決了,簡單封裝一個工具類吧。

注意:如果輸入一個不存在的命令,輸出內容不在stdout流中,要到stderr中獲取。此方案暫時還不支持sudo命令,回頭在研究研究


至此,其實還有一個小問題,我怎么能知道哪些返回是同一條命令所返回的呢?就這個微信工具來說,自然可以直接通過時間判斷,若超過1s沒有,則認為是一組,統一返回。感覺有些牽強,暫時沒有想到更好的解決辦法。

最后奉上工具鏈接:



小編推薦:欲學習電腦技術、系統維護、網絡管理、編程開發和安全攻防等高端IT技術,請 點擊這里 注冊賬號,公開課頻道價值萬元IT培訓教程免費學,讓您少走彎路、事半功倍,好工作升職加薪!

本文出自:https://www.toutiao.com/a6775441238855254532/

免責聲明:本站系公益性非盈利IT技術普及網,本文由投稿者轉載自互聯網的公開文章,文末均已注明出處,其內容和圖片版權歸原網站或作者所有,文中所述不代表本站觀點,若有無意侵權或轉載不當之處請從網站右下角聯系我們處理,謝謝合作!

相關閱讀

最新評論

 最新
返回頂部
{ganrao} 三级电影a片 西宁一条龙服务桑拿 麻将棋牌辅助器是骗局 潘金连与西门庆黄色片 武汉按摩保健服务 日本女优性交电影免费快播电影在线观看 pk10走势图 麻将游戏界面怎么退 爵士vs鹈鹕 河北十一选五遗漏数 国内券商佣金对比 黄色片金公子 河北排列7开奖结果今天 2013年日本女优排行榜 太原沐足按摩飞机网 奇才vs76人篮网