Перенаправление ввода с помощью подпроцесса python

#python #subprocess

#питон #подпроцесс

Вопрос:

Как я могу использовать перенаправление ввода lt;() с помощью python subprocess.Popen ?

Например, скажем, у меня есть:

 import subprocess   class Test():  def __init__(self):  self.proc = subprocess.Popen(["sort file1.txt file2.txt)"],  shell=True,  stdout=subprocess.PIPE,  stderr=subprocess.PIPE)   def __iter__(self):  return self   def __next__(self):  while True:  line = self.proc.stdout.readline()  if not line:  raise StopIteration  return line.strip().decode('utf-8')   t = Test() for line in t:  print(line)  

Вышесказанное работает отлично, но на самом деле мне нужна команда, чтобы сделать что-то вроде:

 sort lt;(python file1.txt) lt;(python file2.txt)  

Это, похоже, ничего не запускает, хотя даже это не работает

 sort lt;(cat file1.txt) lt;(cat file2.txt)  

Как я могу заставить это работать с подпроцессом python и перебирать результаты строка за строкой

Ответ №1:

Вы должны сообщить подпроцессу.Использовать Popen () /bin/bash , который поддерживает lt;(..) синтаксис, вместо функции по умолчанию /bin/sh , которая не:

 def __init__(self):  self.proc = subprocess.Popen(["sort lt;(cat file1.txt) lt;(cat file2.txt)"],  shell=True,  executable="/bin/bash",  stdout=subprocess.PIPE,  stderr=subprocess.PIPE)   def __iter__(self):  return self   def __next__(self):  while True:  line = self.proc.stdout.readline()  if not line:  raise StopIteration  return line.strip().decode('utf-8')   t = Test() for line in t:  print(line)  

Комментарии:

1. Отлично, это отлично работает