Python:使用<cstdio>

2024-06-08 12:25:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下Python代码,它应该为C++程序提供初始输入,然后将其输出并反馈给它,直到程序完成执行:

你知道吗商业伙伴你知道吗

p = subprocess.Popen('test__1.exe', bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False)
p.stdin.flush()
p.stdout.flush()
x = b'1\n'
while True:
    p.stdin.write(x)
    p.stdin.flush()
    p.stdout.flush()
    x = p.stdout.readline()
    print(x)
    if p.poll() != None:
        break
我现在用两个简单的C++程序测试:

测试1.cpp:

#include <iostream>
using namespace std; 
int main()
{
    for( int i = 0; i < 3; ++i )
    {
        int n;
        cin >> n;
        cout << n+1 << endl; 
    }
    return 0;
}

测试2.cpp

#include <cstdio>
int main()
{
    for( int i = 0; i < 3; ++i )
    {
        int n;
        scanf("%d", &n);
        printf("%d\n", n+1);
    }
    return 0;
}

商业伙伴打开test\u 1.exe一切正常,但当它打开test\u 2.exe时,它会挂起对readline()的第一次调用。 请注意,在执行前输入整个输入时(即初始设置x='1\n2\n3\n'),不会出现此问题

是什么导致了这个问题?你知道吗

(还有,商业伙伴应该能够处理任何有效的C++程序,所以只使用IoSoW将不是一个可接受的解决方案。

编辑:我还需要解决方案,以在Windows上工作。你知道吗


Tags: test程序forreadlineincludemainstdinstdout
1条回答
网友
1楼 · 发布于 2024-06-08 12:25:32

它是由std::endl刷新ostreamprintf不刷新stdout这一事实引起的, 如您所见,将test__2.cpp修改如下:

#include <cstdio>
int main()
{
    for( int i = 0; i < 3; ++i )
    {
        int n;
        scanf("%d", &n);
        printf("%d\n", n+1);
        fflush(stdout);  //<  add this
    }
    return 0;
}
<>你说你想用任何C++程序正确地工作模块,所以 您不能依赖它刷新标准输出(或标准错误) 每次写信之后。你知道吗

这意味着您必须使程序的标准流无缓冲 对程序本身进行外部操作。你需要这么做 在comm.py中。你知道吗

在Linux(或其他提供GNU核心Utils的主机)中,您可以通过 通过stdbuf执行程序,例如

import subprocess

cmd = ['/usr/bin/stdbuf', '-i0','-o0', '-e0', './test__2']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False)
p.stdin.flush()
p.stdout.flush()
x = b'1\n'
while True:
    p.stdin.write(x)
    x = p.stdout.readline()
    print(x)
    if p.poll() != None:
        break

将所有的标准流解除缓冲。对于Windows,您需要 研究如何做同样的事情。暂时我不知道。你知道吗

相关问题 更多 >