【问题标题】:Python exec command with pipe control带有管道控制的 Python exec 命令
【发布时间】:2011-07-06 03:59:23
【问题描述】:

我有一个由网络调用的 python 脚本。该脚本获取一些数据作为输入流并发送一些数据作为输出一 - 标准输入和标准输出。

现在我希望这个脚本调用另一个。并将他的标准输入重定向到子进程和子进程的标准输出。基本上这将是类似脚本的代理。

最重要的时刻是要传输的数据大小。它很大 - 所以我不能使用缓冲区。例如:假设子进程将发送 1GB 的数据。父脚本应该能够准备好孩子的标准输出并将这些数据转发到他自己的标准输出。

stdin 也存在同样的问题 - 父级接收到大量数据,并且在发送给子级之前无法对其进行缓冲。

问题是如何在python中实现这个?

谢谢

【问题讨论】:

  • 这是其他脚本 Python 代码,还是其他?如果是,是否可以在同一个进程中运行?
  • 不是,这是编译好的c程序

标签: python exec


【解决方案1】:

如果在发送回数据之前需要完全读取数据,那么您可以使用以下方式实现代理:

import sys
from subprocess import *
if __name__ == "__main__":

    network_content = sys.stdin.read()
    p = Popen("python other_script.py",stdin=PIPE, stdout=PIPE, stderr=PIPE, 
          close_fds=True)
    child_stdin,child_stdout = p.communicate()
    child_stdin.write(network_content)    
    child_content = child_stdout.read()
    sys.stdout.write(child_content)    

如果将所有数据保存在内存中是一个问题,则以块的形式读取它并将它们转储到 TMP 文件中,然后从该文件写入 child_stdout - 也以块为单位。

【讨论】:

  • 不幸的是,这仅在只有一个发送/接收周期时才有效-但我希望能够组织对话-因此代理不知道读取中的 std 是否已完成....
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多