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.

Redirigir comandos de Linux en Python.

Estoy tratando de conectar un par de comandos de Linux usando Python.
Ejemplo en la terminal de Linux:

ls -l | less

Aquí hay un pseudo-código de lo que hago:
1. Defino una tubería.
2. Creo un hijo para el proceso padre.
3. Establezco el número del descriptor de archivo stdout al extremo de escritura de la tubería.
4. Ejecuto el comando y salgo.
5. Creo otro proceso.
6. Establezco el número del descriptor de archivo stdin al extremo de lectura de la tubería.
7. Ejecuto el comando.

Pero no está funcionando.

child1 = os.fork()
if child1 < 0:
raise fork_exception
elif child1 == 0:
oread, owrite = os.pipe()
os.close(oread)
os.dup2(owrite, sys.stdout.fileno())
os.dup2(owrite, sys.stderr.fileno())
os.execvp(command[0][0], args=command[0])
child2 = os.fork()
if child2 < 0:
raise fork_exception
elif child2 == 0:
os.close(owrite)
os.dup2(oread, sys.stdin.fileno())
os.execvp(command[1][0], command[1])
sys.exit()
os.waitpid(child2, 0)
sys.exit(0)
os.waitpid(child1, 0)

El comando es una lista anidada de comandos conectados.

comando = [[“ls”, “-l”],[“less”]]

p.s 1: Intenté hacer que el hijo2 y el hijo1 fueran dos hijos separados de un padre, pero eso tampoco funcionó.

p.s 2: Hice un archivo temporal y lo usé como tubería, y eso funcionó bien. Pero al usar os.pipe(), no funciona, y no puedo encontrar el problema en mi código.

Nota: No quiero usar os.subprocess() ni ninguna otra función ni llamada al sistema. Quiero hacer correr este código, que está implementado usando os.fork() y os.pipe().

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás teniendo problemas para que tu código funcione con os.fork() y os.pipe(). Es posible que no estés configurando bien el tubo. Aquí hay algunos consejos que pueden ayudarte:

    1. Asegúrate de que estás configurando correctamente el tubo. Debes utilizar os.pipe() para crear el tubo y luego utilizar os.dup2() para establecer los descriptores de archivo para los extremos de lectura y escritura del tubo.
    2. Asegúrate de que estás bifurcando los procesos correctamente. Debes bifurcar el proceso padre y luego bifurcar los procesos hijo desde el padre.
    3. Asegúrate de que estás configurando correctamente los descriptores de archivo. Debes establecer los descriptores de archivo stdin y stdout en los extremos de lectura y escritura del tubo, respectivamente.

    4. Asegúrate de que estás saliendo de los procesos correctamente. Debes salir de los procesos hijo después de que hayan terminado de ejecutar los comandos, y luego salir del proceso padre después de que los procesos hijo hayan terminado.

    Espero que estos consejos te ayuden a hacer que tu código funcione con os.fork() y os.pipe(). ¡Buena suerte!

Comments are closed.