简体   繁体   English

在 python 的循环中使用 stdout 和 stdin 导致错误

[英]Using stdout and stdin in a loop in python leading to errors

I am using stdout and stdin to communicate information between two python programs.我正在使用 stdout 和 stdin 在两个 python 程序之间传递信息。 tester.py should pass telemetry data into helper.py and helper.py should return some command to tester.py. tester.py 应该将遥测数据传递给 helper.py,helper.py 应该向 tester.py 返回一些命令。

This seems to work when run without a loop, but when I put the code in tester.py inside a loop that updates the telemetry data, helper.py no longer seems able to pass back the correct command.这在没有循环的情况下运行时似乎有效,但是当我将 tester.py 中的代码放入更新遥测数据的循环中时,helper.py 似乎不再能够传回正确的命令。 The console print out is as follows:控制台打印输出如下:

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

The tester.py:测试者.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])

and the helper.py:和 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()

Any help would be appreciated a lot, I am at a complete loss as to why it.任何帮助将不胜感激,我完全不知道为什么。 does not work in the loop.在循环中不起作用。

You're trying to send multiple commands from tester.py to helper.py , but helper.py only reads a single command and then exits -- there is no loop that would allow it to continue receiving additional commands from tester.py .您正在尝试从tester.pyhelper.py发送多个命令,但helper.py只读取一个命令然后退出——没有循环允许它继续从tester.py接收其他命令。

When you run tester.py , the first loop iteration succeeds, but the subsequent iteration fails because the helper.stdout.read() returns an empty value (because the helper has exited).运行tester.py ,第一次循环迭代成功,但后续迭代失败,因为helper.stdout.read()返回空值(因为助手已退出)。

You need to structure your helper.py so that it can receive multiple commands.您需要构建您的helper.py以便它可以接收多个命令。

For example:例如:

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()

With this change, running tester.py results in:通过此更改,运行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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM