Труба получается из подпроцесса в unix sort

Я вызываю perl script на внешние txt файлы из python и печатаю вывод в outfile. Но вместо этого я хочу передать вывод в unix sort. Прямо сейчас я не пишу трубку, но сначала пишу вывод из программы perl, а затем, объединив свой код и qaru.site/info/5712/....

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()

Ответ 1

Поскольку вы задали вопрос в 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()

Ответ 2

Чтобы эмулировать конвейер оболочки:

#!/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:

#!/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

Ответ 3

Просто используйте bash. Использование python просто добавляет уровень сложности, который вам не нужен.

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

Ниже приведен быстрый и грязный пример, лучшей альтернативой синтаксическому анализу является следующее:

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