Python的wifisubprocess和通信错误

我想通过wifi连接到一个romba机器人。 我已经成功地使用下面的代码来打开cmd并连接到wifi并发送它的密码。 这成功地连接了机器人和电脑。 我的问题是当我尝试发送更多的信息。 我只是试图一次传递一个字符。

我正在使用subprocess和pipe道function来发送数据,但是当我第二次尝试使用它时,它给了我错误“无法发送input后开始通信”有人可以指出我做错了什么?

#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 

看来你在这两个例程中重复使用同一个Network对象。

问题是communicate只能工作一次。 获取单独的输出和错误流以及隐藏消耗这些流时避免死锁的复杂性是一种方便的方法。

不能在subprocess.Popen对象上多次使用communicate 。 如果你想给你的程序提供输入,你应该这样做:

 Network.stdin.write(password.encode('utf-8')) 

当然,不要关闭输入流:

Network.stdin.close()

不要忘记跟随一个换行

 Network.stdin.write(b"\n") 

我也建议你不要使用stdout=PIPE而是保留默认值(或者用stdout=DEVNULL重定向到什么都不做,所以输出缓冲区没有被填满。