我試著使用pexpect來實作透過Serial over LAN遠端操作電腦的功能
程式的寫法大致如下:
#建立SOL連線的IPMI指令
ipmicommand = r'ipmitool.exe -I lanplus -U ' + username + ' -P ' + password +
' -H ' + BMC_IP + ' sol activate'
#用pexpect下指令
child = pexpect.popen_spawn.PopenSpawn(ipmicommand)
#重複等待'Press <ESC> to enter setup'出現在畫面上
#一旦出現在畫面上就脫離while迴圈
index = child.expect(['Press <ESC> to enter setup', pexpect.EOF,
pexpect.TIMEOUT], timeout = 1)
while index != 0:
child.send("")
index = child.expect(['Press <ESC> to enter setup', pexpect.EOF,
pexpect.TIMEOUT], timeout = 1)
#送出ESC鍵
child.send("\x1b")
目前我用這個寫法在測試運行的時候大致上是沒有問題的
程式可以順利偵測到螢幕上的特定字串,並且送出我想要的按鍵
但是大約有一到兩成左右的機率會在任意一個child.send()出現下面這錯誤
Traceback (most recent call last):
File "C:\xxxxxx\xxx.py", line xx, in xxx
child.send(xxx)
File "C:\xxxxxx\Python\Python37\lib\site-packages\pexpect\popen_spawn.py", line 142, in send
return self.proc.stdin.write(b)
OSError: [Errno 22] Invalid argument
想請問一下,有人知道這種錯誤的成因或是偵錯法嗎?
目前有點懷疑是SOL斷線導致送出失敗,但是苦無根據
另外也想問一下,有辦法即使出了這個錯,依然讓程式繼續運轉而不要跳出來嗎?
例如能不能用某種exception接住之類的?
用錯誤訊息搜了一下文但是似乎這種案例不多見所以沒什麼收穫...
在此先感謝願意幫忙的各位