[英]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.