Python wifi子流程&;通信错误
我正在尝试通过wifi连接到龙巴机器人。我已经成功地使用以下代码打开cmd,连接到wifi并发送其密码。这将成功连接bot和计算机。我的问题是当我试图发送附加信息时。我只想一次通过一个字符 我正在使用子流程和管道功能发送数据,但当我第二次尝试使用此功能时,会出现错误“启动通信后无法发送输入”。请有人指出我做错了什么Python wifi子流程&;通信错误,python,windows,subprocess,wifi,putty,Python,Windows,Subprocess,Wifi,Putty,我正在尝试通过wifi连接到龙巴机器人。我已经成功地使用以下代码打开cmd,连接到wifi并发送其密码。这将成功连接bot和计算机。我的问题是当我试图发送附加信息时。我只想一次通过一个字符 我正在使用子流程和管道功能发送数据,但当我第二次尝试使用此功能时,会出现错误“启动通信后无法发送输入”。请有人指出我做错了什么 #Connects the the desired WiFi network. def connect_to_network(name): global
#Connects the the desired WiFi network.
def connect_to_network(name):
global Network
#global Putty
Network = Popen('netsh wlan connect ' + str(name), shell=True, stdout=PIPE, stderr=STDOUT, stdin=PIPE)
password = "password"
Network.communicate(input=password.encode('utf-8'))
Network.stdin.close()
#Putty = Application(backend="uia").start('putty.exe -raw 192.168.1.1')
#Sends out character to BOT via WiFi.
def WiFi_Send(action):
global Network
#global Putty
clear_output()
print("Sending: " + str(action))
#PACKET TO SEND
packet = ""
if(action == "SCAN"):
packet = "S"
elif(action == "MOVE FORWARD"):
packet = "F"
elif(action == "TURN LEFT"):
packet = "L"
elif(action == "TURN RIGHT"):
packet = "R"
Network.communicate(input=packet.encode('utf-8'))
Network.stdin.close()
输出:
Sending: SCAN
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-2-c2f5d752b649> in <module>()
341 # call in value. (Waits for it to start)
342 if __name__ == "__main__":
-->343 main()
<ipython-input-2-c2f5d752b649> in main()
326 buttonFlag = 0
327 actionComplete = True
--> 328 WiFi_Send(action)
329 break
330 elif(B_button):
<ipython-input-2-c2f5d752b649> in WiFi_Send(action)
172 packet = "R"
173
--> 174 Network.communicate(input=packet.encode('utf-8'))
175 Network.stdin.close()
176
~\Anaconda3\lib\subprocess.py in communicate(self, input, timeout)
811
812 if self._communication_started and input:
--> 813 raise ValueError("Cannot send input after starting
communication")
814
815 # Optimization: If we are not worried about timeouts, we haven't
ValueError: Cannot send input after starting communication
发送:扫描
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
341#收回价值。(等待它启动)
342如果uuuu name uuuuu==“uuuuu main”:
-->343主要
大体上
326按钮滞后=0
327 actionComplete=True
-->328 WiFi_发送(操作)
329休息
330 elif(B_按钮):
在WiFi中发送(操作)
172 packet=“R”
173
-->174网络通信(输入=数据包编码('utf-8'))
175 Network.stdin.close()
176
通信中的~\Anaconda3\lib\subprocess.py(自身、输入、超时)
811
812如果自通讯开始并输入:
-->813提升值错误(“启动后无法发送输入
通讯“)
814
815#优化:如果我们不担心超时,我们就没有
ValueError:启动通信后无法发送输入
两个例程中似乎都在重用相同的网络
对象
问题是,通信
只能工作一次。这是一种方便的方法,可以获得单独的输出和错误流,并在使用这些流时隐藏避免死锁的复杂性
您不能在子流程.Popen
对象上多次使用通信
。如果要向程序提供输入,应执行以下操作:
Network.stdin.write(password.encode('utf-8'))
当然,不要关闭输入流:
Network.stdin.close()
别忘了跟着换行符
Network.stdin.write(b"\n")
我还建议您不要使用
stdout=PIPE
,而是保留默认值(或者使用stdout=DEVNULL
重定向到nothing,这样输出缓冲区就不会满&块。非常感谢您的后续行动!我收到了一个新的错误,它是由。您建议的写信引起的。请查看我的帖子以了解更新的错误!再次非常感谢您的帮助!我已恢复到编辑状态,因为1)我的答案是错误的(input=应该删除),2)我对解释进行了编辑,使其更简短、更清晰。请告诉我,如果它从评论工作,除非它是绝对必要的编辑问题。它的工作!非常感谢你,简!你解决了一个问题,我已经绞尽脑汁10多个小时了!我真的很感谢你,我也很感激你在今后如何提出更好的问题上的指导!再次感谢!是的,但您必须恢复stdout=subprocess.PIPE
。现在您有2个通道:1个输入通道和1个输出通道。如果在您不使用输出时,进程在行中写入太多内容,则可能会死锁。如果遇到问题,最好在另一个线程中执行此类操作。不,使用相同的网络
变量,但在另一个线程中使用输出,并将其放入可在另一个线程中读取的python列表中。这将避免僵局。但首先尝试一下天真的方法。根据您的可执行文件,这可能会起作用。