我在python的外部txt文件上调用perl脚本,并将输出打印到outfile。但相反,我想将输出管道输出到unix的排序。现在我不是管道,但是首先从perl程序编写输出,然后通过组合我的代码和this stackoverflow 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()
答案 0 :(得分:2)
模拟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
答案 1 :(得分:1)
只需使用bash。使用python只会增加你不需要的复杂程度。
for file in $( ls);
do
perl pydyn.pl $file | sort
done
上面是一个快速而肮脏的例子,在解析方面更好的选择如下:
ls | while read file; do perl pydyn.pl "$file" | sort; done
答案 2 :(得分:0)
既然你在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()