管道结果从子进程到 unix 排序

Pipe result from subprocess to unix sort

我在 python 的外部 txt 文件上调用 perl 脚本,并将输出打印到输出文件。但是相反,我想将输出通过管道传递给 unix 的排序。现在我不是管道,而是先写 perl 程序的输出,然后结合我的代码,和 this Whosebug answer

import subprocess
import sys
import os

for file in os.listdir("."):

    with open(file + ".out", 'w') as outfile:
        p = subprocess.Popen(["perl", "pydyn.pl", file], stdout=outfile)
        p.wait()

只需使用bash。使用 python 只会增加您不需要的复杂程度。

for file in $( ls); 
do 
    perl pydyn.pl $file | sort
done

以上是一个简单粗暴的例子,在解析方面更好的替代方法如下:

ls | while read file; do perl pydyn.pl "$file" | sort; done

既然你在 python 中提出了问题,你也可以通过管道传递结果

p = subprocess.Popen("perl pydyn.pl %s | sort" % file, stdout=outfile,shell=True) 

但是为此你必须做到这一点 shell=True 这不是一个好的做法

这是一种没有成功的方法shell=True

  p = subprocess.Popen(["perl", "pydyn.pl", file], stdout=subprocess.PIPE)
  output = subprocess.check_output(['sort'], stdin=p.stdout,stdout=outfile)
  p.wait()

要模拟 shell 管道:

#!/usr/bin/env python
import pipes
import subprocess

pipeline = "perl pydyn.pl {f} | sort >{f}.out".format(f=pipes.quote(filename))
subprocess.check_call(pipeline, shell=True)

不调用 Python 中的 shell:

#!/usr/bin/env python
from subprocess import Popen, PIPE

perl = Popen(['perl', 'pydyn.pl', filename], stdout=PIPE)
with perl.stdout, open(filename+'.out', 'wb', 0) as outfile:
    sort = Popen(['sort'], stdin=perl.stdout, stdout=outfile)
perl.wait() # wait for perl to finish
rc = sort.wait() # wait for `sort`, get exit status