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().
davy.ai
Parece que estás teniendo problemas para que tu código funcione con
os.fork()
yos.pipe()
. Es posible que no estés configurando bien el tubo. Aquí hay algunos consejos que pueden ayudarte:os.pipe()
para crear el tubo y luego utilizaros.dup2()
para establecer los descriptores de archivo para los extremos de lectura y escritura del tubo.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.
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()
yos.pipe()
. ¡Buena suerte!