【问题标题】:Subprocess pipes stdin without using files子进程在不使用文件的情况下管道标准输入
【发布时间】:2013-08-05 11:19:13
【问题描述】:

我有一个主进程,我在其中运行一个子进程,stdin 是我想要管道的。我知道我可以使用文件来做到这一点:

import subprocess
subprocess.call('shell command', stdin=open('somefile','mode'))

是否有任何选项可以在没有实际硬盘驱动器文件的情况下使用自定义标准输入管道?是否有任何选项,例如,使用字符串列表(每个列表元素都是换行符)?

我知道python子进程在管道对象上调用.readline()

【问题讨论】:

  • 虽然不一定是您问题的答案,但值得一提的是,任何符合 POSIX 标准的操作系统都支持将 /dev/stdin 用作“文件”,这可以通过 shell 命令使用EOF 用于终止流。刚刚在 OSX、Linux 和 OpenBSD 上使用 tcsh 和 bash 验证了这一点。
  • @synthesizerpatel 不是答案,但感谢您的宝贵意见!
  • 好吧.. 公平地说,这是一个的答案。只是不是的答案。 :D

标签: python process pipe


【解决方案1】:

首先,使用subprocess.Popen - .call 只是它的一个快捷方式,您需要访问Popen 实例,以便您可以写入管道。然后将subprocess.PIPE 标志作为stdin kwarg 传递。比如:

import subprocess
proc = subprocess.Popen('shell command', stdin=subprocess.PIPE)
proc.stdin.write("my data")

http://docs.python.org/2/library/subprocess.html#subprocess.PIPE

【讨论】:

  • 您也可以指定'stdin=0',也可以通过数值引用标准输入文件句柄。
  • @synthesizerpatel er,这是一个细微的区别,但这是告诉子进程使用 parent 进程的标准输入 - 而不是所要求的,正在通过管道输入的数据在哪里(在他的示例中)从字符串列表生成。除此之外,我一般不鼓励传递 fd-number-handles(以及/dev/stdin),除非“代理”进程中的数据在基准测试中太慢。原因是共享标准输入迟早会在错误的进程进行读取时导致错误,并弄乱预期的标准输入处理进程的数据流。
  • 还行吧,就是觉得使用数字文件句柄值得一提。
  • 此答案警告您的方法出现死锁stackoverflow.com/a/165662/1317713
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
相关资源
最近更新 更多