使用子进程使管道无法在unix

时间:2015-07-22 11:23:44

标签: python subprocess

我试图创建一个简单的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工作?

1 个答案:

答案 0 :(得分:3)

您的Python代码看起来很合理。我会检查以确保您的程序实际上将-理解为“标准输入”。这只是许多程序遵循的惯例,但任何规范都不要求它。

我会在CentOS机器上的Bash会话中手动测试您的管道,看看是否出现同样的问题。 CentOS(实际上是RHEL)在更新软件包方面臭名昭着“慢”,因此您的Mac上可能有一个更新版本,它可以理解-