簡體   English   中英

使用子進程使管道無法在UNIX上運行

[英]Using subprocess to make a pipe not working on unix

我試圖創建一個簡單的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工作?

您的Python代碼看起來很合理。 我將檢查以確保您的程序真正理解了-表示“標准輸入”。 這只是許多程序遵循的約定,但任何規范都不需要。

我會在CentOS機器上的Bash會話中手動測試管道,以查看是否發生相同的問題。 CentOS(實際上是RHEL)臭名昭著的是在更新軟件包時“慢”,因此您的Mac上可能有一個較新的版本,它確實了解-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM