一个非常简单的python subprocess.Popen任务的无尽问题

时间:2010-04-23 19:19:52

标签: python subprocess

我希望python发送大约50万个整数,范围是0-255,用C ++编写的可执行文件。然后,此可执行文件将以几千个整数进行响应。每一条都在一条线上。这似乎应该是非常简单的子进程,但我有无尽的麻烦。现在我用代码进行测试:

// main()
u32 num;
std::cin >> num;

u8* data = new u8[num];
for (u32 i = 0; i < num; ++i)
    std::cin >> data[i];

// test output / spit it back out
for (u32 i = 0; i < num; ++i)
    std::cout << data[i] << std::endl;

return 0;

在python中构建一个字符串数组(“data”),每个字符串都像“255 \ n”,然后使用:

output = proc.communicate("".join(data))[0]

...不起作用(说stdin已关闭,可能一次太多)。没有使用proc.stdin和proc.stdout工作。这应该非常简单,但是我得到了常量异常,和/或没有输出数据返回给我。我的Popen目前是:

proc = Popen('aux/test_cpp_program', stdin=PIPE, stdout=PIPE, bufsize=1)

在我拔头发之前先告诉我。 ;)

2 个答案:

答案 0 :(得分:1)

这对我很有用:

#include <iostream>

int main()
{
    int num;
    std::cin >> num;

    char* data = new char[num];
    for (int i = 0; i < num; ++i)
        std::cin >> data[i];

    // test output / spit it back out
    for (int i = 0; i < num; ++i)
        std::cout << data[i] << std::endl;

    return 0;
}

蟒:

In [9]: from subprocess import Popen, PIPE
In [10]: a = Popen('./a.out', stdin=PIPE, stdout=PIPE)
In [11]: a.stdin.write("2\nab")
In [12]: a.stdout.read()
Out[12]: 'a\nb\n'

请注意,我在要写入的字节数之间添加了分隔符(\ n),如果您不希望c ++ cin在发送类似3,1,2,3的内容时会失败,这是最安全的3123,期待这么多论点。

答案 1 :(得分:0)

在C ++中,当您从char读取unsigned charcin时,它会从stdin读取单个字节。但是,您希望它读取0到255之间的数字的十进制表示。如果您读取int而不是它应该正确读取它:

unsigned int n;
std::cin >> n;
data[i] = static_cast<u8>(n);

或者,您可以使用chr函数让Python代码将值写为字节序列而不是数字。

相关问题