【问题标题】:Endless problems with a very simple python subprocess.Popen task一个非常简单的 python subprocess.Popen 任务的无尽问题
【发布时间】:2010-04-23 19:19:52
【问题描述】:

我希望 python 向用 C++ 编写的可执行文件发送大约 50 万个 0-255 范围内的整数。然后这个可执行文件将响应几千个整数。每个在一条线上。这似乎对子流程来说应该非常简单,但我遇到了无穷无尽的麻烦。现在我正在使用代码进行测试:

// 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]

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

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

在我拔头发之前给我建议。 ;)

【问题讨论】:

  • 你是把数据项的数量作为第一个数字发送吗?
  • 是的 - cpp 代码显示,忘记提及了。

标签: python subprocess


【解决方案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,期待这么多争论。

【讨论】:

  • 啊。太近而看不到问题的简单案例。我相信我的 C++ 正在查看像 "4\n255\n34\n129\n0\n" 这样的输入并将其解释为 (char)'2', (char)'5', (char)'5', (char) '3',然后运行到完成并关闭。当 python 尝试发送更多数据时,它引发了异常。现在一切都很好。非常感谢您的帮助!
【解决方案2】:

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

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

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

【讨论】:

  • 是的。钱就对了!没想到 istream::operator>> 会处理 char 的特殊性,而这正是我用于 u8 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多