[英]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.