Python wifi子流程&;通信错误

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

我正在尝试通过wifi连接到龙巴机器人。我已经成功地使用以下代码打开cmd,连接到wifi并发送其密码。这将成功连接bot和计算机。我的问题是当我试图发送附加信息时。我只想一次通过一个字符

我正在使用子流程和管道功能发送数据,但当我第二次尝试使用此功能时,会出现错误“启动通信后无法发送输入”。请有人指出我做错了什么

#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列表中。这将避免僵局。但首先尝试一下天真的方法。根据您的可执行文件,这可能会起作用。