【问题标题】:Using stdout and stdin in a loop in python leading to errors在python的循环中使用stdout和stdin导致错误
【发布时间】:2021-10-02 06:35:45
【问题描述】:

我正在使用 stdout 和 stdin 在两个 python 程序之间传递信息。 tester.py 应该将遥测数据传递给 helper.py 并且 helper.py 应该返回一些命令给 tester.py。

这似乎在没有循环的情况下运行,但是当我将 tester.py 中的代码放入更新遥测数据的循环中时,helper.py 似乎不再能够传回正确的命令。控制台打印出来如下:

b'\x00\x00\x00\x00\x01\x00\x00\x00'
0.0
b''
Traceback (most recent call last):
  File "/Users/Advay/Documents/PyCharm/zip_sim/tester.py", line 44, in <module>
    varr = COMMAND_STRUCT.unpack(cmd)
struct.error: unpack requires a buffer of 8 bytes

tester.py:

import sys
import subprocess
import struct

TELEMETRY_STRUCT = struct.Struct(">fB3s")
COMMAND_STRUCT = struct.Struct(">fB3s")
helper = subprocess.Popen(['python3', 'helper.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

drop = 1
padding = bytes(3)

for i in range(5):

    speed = i

    helper.stdin.write(TELEMETRY_STRUCT.pack(speed, drop, padding))
    helper.stdin.flush()

    cmd = helper.stdout.read(COMMAND_STRUCT.size)
    print(cmd)
    varr = COMMAND_STRUCT.unpack(cmd)
    print(varr[0])

还有 helper.py:

import os
import random
import sys
import struct

TELEMETRY_STRUCT = struct.Struct(">fB3s")
COMMAND_STRUCT = struct.Struct(">fB3s")

telemetry = sys.stdin.buffer.read(TELEMETRY_STRUCT.size)
a = TELEMETRY_STRUCT.unpack(telemetry)

command = COMMAND_STRUCT.pack(a[0], 1, bytes(3))

sys.stdout.buffer.write(command)
sys.stdout.buffer.flush()

任何帮助将不胜感激,我完全不知道为什么会这样。在循环中不起作用。

【问题讨论】:

    标签: python struct subprocess sys


    【解决方案1】:

    您尝试从tester.pyhelper.py 发送多个命令,但helper.py 只读取一个命令然后退出——没有循环允许它继续从@987654324 接收其他命令@。

    当您运行tester.py 时,第一次循环迭代成功,但随后的迭代失败,因为helper.stdout.read() 返回一个空值(因为助手已退出)。

    您需要构建您的helper.py 以便它可以接收多个命令。

    例如:

    import os
    import random
    import sys
    import struct
    
    TELEMETRY_STRUCT = struct.Struct(">fB3s")
    COMMAND_STRUCT = struct.Struct(">fB3s")
    
    while True:
        telemetry = sys.stdin.buffer.read(TELEMETRY_STRUCT.size)
        if not telemetry:
            break
    
        a = TELEMETRY_STRUCT.unpack(telemetry)
    
        command = COMMAND_STRUCT.pack(a[0], 1, bytes(3))
    
        sys.stdout.buffer.write(command)
        sys.stdout.buffer.flush()
    

    通过此更改,运行 tester.py 会导致:

    b'\x00\x00\x00\x00\x01\x00\x00\x00'
    0.0
    b'?\x80\x00\x00\x01\x00\x00\x00'
    1.0
    b'@\x00\x00\x00\x01\x00\x00\x00'
    2.0
    b'@@\x00\x00\x01\x00\x00\x00'
    3.0
    b'@\x80\x00\x00\x01\x00\x00\x00'
    4.0
    

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多