繁体   English   中英

Python sys.stdin.buffer 大小检测

[英]Python sys.stdin.buffer size detection

我正在尝试从 Qt 应用程序执行 Python 脚本,并通过标准输入和 output 与脚本通信(就像通过常见的 Unix 管道一样)。 我的调用代码存根如下所示:

int main(int argc, char *argv[]) {
  QCoreApplication a(argc, argv);
  QProcess process;
  QTimer timer;
  QObject::connect(&process, &QProcess::readyReadStandardOutput, [&process]() {
    qDebug() << "<<o" << process.readAllStandardOutput();
  });
  QObject::connect(&process, &QProcess::readyReadStandardError, [&process]() {
    qDebug() << "<<e" << process.readAllStandardError();
  });
  QObject::connect(&process, &QProcess::started, [&process] {
    qDebug() << "Process name" << process.program() << process.processId();
  });
  QObject::connect(&timer, &QTimer::timeout, [&process]() {
    qDebug() << process.state();
    QByteArray ba("12345");
    qDebug() << ">>" << ba;
    process.write(ba);
    if (!process.waitForBytesWritten())
      qDebug() << process.errorString();
  });
  QObject::connect(&a, &QCoreApplication::aboutToQuit, [&]() {
    process.terminate();
    process.kill();
  });
  process.start("python3", {"main.py"});
  //  process.start("cat", QStringList{});
  timer.start(2000);
  a.exec();
  process.terminate();
  process.kill();
  return 0;
}

而我的 Python 脚本如下所示:

import sys, time

def process_data(data):
    size=len(data)
    if size %2:
        print(f'Odd, {size}',data) 
    else:
        print(f'Even, {size}',data)
    sys.stdout.flush()


if __name__ == '__main__':
    while True:
        data=sys.stdin.buffer.read(5)
        if len(data):
            process_data(data)
        else:
            print('.')
        time.sleep(0.02)

问题是我想让我的脚本对任何传入的缓冲区做出反应,就像 cat 命令一样。 当我注释掉调用我的脚本的行并取消注释调用 cat 命令的行时,每次发送缓冲区时,我都会收到回复,这正是我想要的。 但是当我调用 Python 脚本时,我无法检测我所知道的传入缓冲区大小。 在 sys.stdin.buffer.read 命令中显式设置一个值使我无需等待 EOF,但我想在事先不知道其大小的情况下接收缓冲区。 在 Qt 中,我将通过调用 QIODevice 的 readAll() 方法来实现这种行为。 有没有办法在 Python 中做同样的事情?

我试过在没有任何 arguments 的情况下调用 sys.stdin.buffer.read(),期望它的行为类似于 QIODevice::readAll() - 生成一个包含到目前为止读取的所有数据的缓冲区。 但很明显,在收到 EOF 之前它不会产生任何结果。 我希望有一种方法可以产生接收到的缓冲区大小,这样我就可以写:

size=stdin.buffer.bytesReceived()
data=stdin.buffer.read(size)

但似乎缺少这种方法。

有谁知道这个问题的任何解决方案?

通过将sys.stdin.buffer.read行更改为:

data = sys.stdin.buffer.raw.read(20000)

这也有效:

data = sys.stdin.buffer.read1(20000) 

这个答案作为编辑 1编辑 2发布到问题Python sys.stdin.buffer size detection [已解决]由 OP Kirill Didkovsky在 CC BY-SA 4.0 下进行。

暂无
暂无

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

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