Sólo el primer subproceso.Popen (…, stdin = f) en un bucle funciona correctamente

Mi principal objective aquí es obtener toda la carga de la CPU de una lista de computadoras conectadas a Linux. He estado luchando y buscando en la red por algún tiempo pero debo perder algo porque no puedo encontrar mi respuesta. Así que definí un cpu_script.py:

import psutil print(psutil.cpu_percent(interval=1,percpu=True)) 

para ser llamado en mi script principal, que está en la misma carpeta, con:

 import subprocess import os import numpy as np import psutil usr = "AA" computer = ["c1", "c2", "c3"] #list of computer which cpu load is to be tested cpu_script = os.path.join(os.getcwd(),"cpu_script.py") with open(cpu_script,"rb") as f: for c in computer: input(c) process = subprocess.Popen(["ssh","-X",usr + "@" + c,"python3","-u","-"], stdin=f, stdout=subprocess.PIPE) out = process.communicate()[0] input(out) 

Ahora aquí está lo que obtuve de estos input :

 >> c1 #first computer >>  >> b'[1.0, 7.1, 0.0, 1.0, 2.0, 2.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0]\n' >> c2 #second computer >>  >> b'' >> c3 #third computer >>  >> b'' 

Así que aquí está mi pregunta: ¿por qué la segunda y tercera salida están vacías? ¿Cómo podría conseguirlos?

Sospeché que mi primer proceso no estaba bien “cerrado”, por lo que intenté agregar un process.wait() o un process.kill() justo después de la input(out) , pero fue en vano.

Gracias de antemano por su ayuda !


edit: subprocess.check_output() da los mismos resultados. También probé subprocess.run con:

 with open(cpu_script,"rb") as f: for c in computer: input(c) process = subprocess.run(["ssh","-X",usr + "@" + c,"python3","-u","-"], stdin=f, stdout=subprocess.PIPE) input(out) 

y consiguió:

 >> c1 #first computer >> CompletedProcess(args=['ssh', '-X', 'usr@c1', 'python3', '-u', '-'], returncode=0, stdout=b'[2.0, 1.0, 1.0, 2.9, 7.0, 0.0, 2.0, 1.0, 0.0, 0.0, 0.0, 1.0]\n') >> c2 #second computer >> CompletedProcess(args=['ssh', '-X', 'usr@c2', 'python3', '-u', '-'], returncode=0, stdout=b'') >> c3 #third computer >> CompletedProcess(args=['ssh', '-X', 'usr@c3', 'python3', '-u', '-'], returncode=0, stdout=b'') 

El problema aquí es que una vez que su archivo ha sido leído una vez, el puntero se encuentra al final del archivo, por lo que no queda nada para leer (por lo que la segunda vez que pase stdin=f para el mismo archivo, lo que queda está vacío) .

Invierta sus bucles internos y externos para volver a abrir el archivo una vez cada vez que quiera usarlo:

 for c in computer: with open(cpu_script, "rb") as f: process = subprocess.Popen(["ssh", "-X", "-l", usr, c, "python3 -u -"], stdin=f, stdout=subprocess.PIPE) out = process.communicate()[0] 

… o retroceda al principio entre los bucles internos utilizando la función seek() :

 with open(cpu_script, "rb") as f: for c in computer: f.seek(0) ### <- THIS RIGHT HERE process = subprocess.Popen(["ssh", "-X", "-l", usr, c, "python3 -u -"], stdin=f, stdout=subprocess.PIPE) out = process.communicate()[0]