如何判断C++程序何时等待输入?

3 投票
2 回答
806 浏览
提问于 2025-04-16 07:10

我正在尝试通过Python控制一个简单的C++程序。这个程序会提示用户输入,但这些提示不一定以换行符结束。我想知道有没有办法从Python中判断C++程序是否不再输出内容,并且已经切换到请求输入的状态。

这里有一个简单的例子:

C++代码:

#include <iostream>

using namespace std;

int main()
{
    int x;
    cout << "Enter a number ";
    cin >> x;
    cout << x << " squared = " << x * x << endl;
}

Python代码:

#! /usr/bin/python
import subprocess, sys
dproc = subprocess.Popen('./y', stdin=subprocess.PIPE,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while (True) :
    dout = dproc.stdout.read(1)
    sys.stdout.write(dout)
    dproc.stdin.write("22\n")

这种方法有点效果,但它对dproc.stdin的写入太多了。我想要的是一种方法,可以从dproc.stdout读取所有内容,直到程序准备好接收输入,然后再写入dproc.stdout。

如果可能的话,我希望在不修改C++代码的情况下做到这一点。(不过,我尝试过在C++那边调整缓冲设置,但似乎没有帮助)

感谢任何回复。

2 个回答

3

你可以看看 pexpect 这个网站。

6

我不知道有没有一种通用的方法可以用来判断远程端是否在等待输入。我能想到一些基本的方式,但也有一些情况会让它们失效。举几个例子:

  1. 用非阻塞的管道或套接字读取数据,直到没有输入为止:但这个过程中可能会被写入磁盘的操作打断,或者在等待数据库的回复等等。
  2. 等到进程变得空闲:但后台线程可能还在运行。

你需要了解你想要控制的应用程序使用的协议。从某种意义上说,你实际上是在为这个进程设计一个解释器pexpect就是一个基于这个想法的Python工具集。

撰写回答