es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Redirige la entrada con subprocess en Python.

¿Cómo puedo utilizar la redirección de entrada <() con subprocess.Popen de Python?

Por ejemplo, digamos que tengo:

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)

Lo anterior funciona perfectamente bien, pero realmente necesito que el comando haga algo como:

sort <(python file1.txt) <(python file2.txt)

Sin embargo, eso no parece ejecutar nada, incluso esto no funciona:

sort <(cat file1.txt) <(cat file2.txt)

¿Cómo puedo hacer que esto funcione con subprocess de Python y recorrer los resultados línea por línea?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para utilizar la redirección de entrada con subprocess.Popen, puedes utilizar la opción subprocess.PIPE para stdin en lugar de stdout. La redirección de entrada se puede pasar como una cadena al método stdin.write() del objeto Popen. Aquí tienes un ejemplo de código que implementa la redirección de entrada utilizando subprocess.Popen:

    import subprocess
    
    class Test():
        def __init__(self):
            self.proc = subprocess.Popen(['sort', '-'],
                                         stdin=subprocess.PIPE,
                                         stdout=subprocess.PIPE,
                                         stderr=subprocess.PIPE)
    
            with open('file1.txt', 'rb') as f1, open('file2.txt', 'rb') as f2:
                self.proc.stdin.write(f'<(python {f1.name}) <(python {f2.name})\n'.encode())
    
        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)
    

    En el código anterior, creamos el subprocess con stdin=subprocess.PIPE en lugar de stdout=subprocess.PIPE. Luego abrimos los archivos utilizando la declaración with, codificamos la cadena de redirección de entrada y la pasamos al método stdin.write() del objeto Popen. Finalmente, iteramos a través de la salida del subprocess línea por línea y la imprimimos.

Comments are closed.