我试图创建一个简单的unix样式管道,用于将一个程序的输出链接到另一个程序的输入。我在Mac上工作但是当我在Linux服务器(CentOS)上尝试它时,它失败了,因为外部程序由于某种原因无法理解-
。我不明白它在我的Mac上是如何工作的,而不是在Linux平台上。到目前为止我的代码是:
from subprocess import Popen, PIPE
# Commands to run
p1 = "samtools view -h small.bam".split()
p2 = "samtools view -hb -".split() # The '-' seems to be the problem
p3 = "samtools view -hb -o fini.bam -".split()
process_list = [p1, p2, p3]
class Pipe_manager(object):
"""Takes a list of commands to run and pipes their in/out together."""
def __init__(self, process_list):
self.process_list = process_list
self.open_processes = []
self.output = 0
print 'Starting processes'
self.__open_procs()
def __open_procs(self):
for i in range(len(self.process_list)):
if i == 0:
self.open_processes.append(Popen(self.process_list[i], stdout=PIPE))
else:
old_pipe = self.open_processes[i-1]
self.open_processes.append(Popen(self.process_list[i], stdin=old_pipe.stdout, stdout=PIPE))
self.__close_procs()
def __close_procs(self):
for j in range(len(self.open_processes)-1):
self.open_processes[j].stdout.close()
self.__get_output()
def __get_output(self):
self.output = self.open_processes[-1].communicate()[0]
P = Pipe_manager(process_list)
if P.output:
print P.output
错误消息有点特定于程序,但可能会有所帮助:
[main_samview] fail to read the header from "-".
在这种情况下,我该怎么做才能让unix工作?
答案 0 :(得分:3)
您的Python代码看起来很合理。我会检查以确保您的程序实际上将-
理解为“标准输入”。这只是许多程序遵循的惯例,但任何规范都不要求它。
我会在CentOS机器上的Bash会话中手动测试您的管道,看看是否出现同样的问题。 CentOS(实际上是RHEL)在更新软件包方面臭名昭着“慢”,因此您的Mac上可能有一个更新版本,它可以理解-
。