【问题标题】:Python Communicating with SubprocessPython与子进程通信
【发布时间】:2013-04-09 15:20:16
【问题描述】:

我有这个代码

p.stdin.write('alloc ' + str(size) + '\n' + chr(0x1a))
p.stdin.flush()
stdout = p.stdout.readline()

问题是脚本一直挂在 readline()

如果我替换

p.stdin.flush()

p.stdin.close()

它可以工作,但不允许我在之后继续与进程通信

我应该怎么做才能将数据发送到标准输入并从标准输出读取回复并且仍然能够在脚本期间重复该操作?

【问题讨论】:

  • 子进程可能正在使用缓冲输出,除非你告诉我们它是什么,否则我们不能说是否有办法让它不缓冲。
  • Python 2 还是 Python 3?
  • 这是一个简单的c程序读取fgets(line, MAX_LINE_LENGTH, stdin);
  • chr(0x1a) 在这里的作用是什么?
  • 子进程正在使用 fprintf(stdout, "%d\n", my_alloc(data));

标签: python subprocess stdin


【解决方案1】:

并且子进程正在使用 fprintf(stdout, "%d\n", my_alloc(data));

就像您在父进程中所做的那样,您必须在子进程中的 fprintf() 之后添加 fflush(stdout),因为 stdio 库将缓冲输出(通常直到有 BUFSIZ 字节等待写入)。

您可能会看到,当您从 shell 运行子程序时,它看起来好像在每个换行符上都发出输出。这是因为 stdio 库在连接到终端时设置了行缓冲。连接到管道时不会这样做。有关详细信息,请参阅 isatty(3)setbuf(3)

您在 Python 端做的事情是正确的,现在您必须在管道的 C 端做同样的事情。 Python readline 正在阻塞,因为孩子尚未通过管道发送任何内容。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 2014-04-26
    • 2017-07-08
    • 1970-01-01
    • 2017-02-15
    • 2012-05-20
    • 2011-01-09
    • 2013-08-23
    相关资源
    最近更新 更多