2015-08-05 15 views
9

Sto eseguendo uno script Python di lunga durata tramite ssh su una macchina remota usando paramiko. Funziona come un fascino, nessun problema finora.viene emesso continuamente da paramiko ssh exec_command

Sfortunatamente, lo stdout (rispettivamente lo stderr) viene visualizzato solo al termine dello script! Tuttavia, a causa del tempo di esecuzione, preferisco di gran lunga lo per stampare ogni nuova riga mentre viene stampata, non dopo.

remote = paramiko.SSHClient() 
remote.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
remote.connect("host", username="uname", password="pwd") 

# myScript produces continuous output, that I want to capture as it appears  
stdin, stdout, stderr = remote.exec_command("python myScript.py") 
stdin.close() 
for line in stdout.read().splitlines(): 
    print(line) 

Come può essere ottenuto?Nota: Naturalmente si potrebbe inviare l'output in un file e 'meno' questo file tramite un'altra sessione ssh, ma questo è molto brutto e ho bisogno di un pulitore, soluzione ideale divinatorio :)

+0

solo per aiutare gli altri in futuro, myScript.py dovrebbe contenere sys.stdout.flush() – ItayB

risposta

8

Come specificato nel read([size]) documentation, se non si specifica size, viene letto fino a EOF, che fa in modo che lo script attenda fino al termine del comando prima di tornare da read() e stampare qualsiasi output.

Verificare le risposte: How to loop until EOF in Python? e How to do a "While not EOF" per esempi su come esaurire l'oggetto simile a File.

+8

grazie a @KurzedMetal per avermi indirizzato nella giusta direzione: 'per la riga in iter (lambda: stdout.readline (2048)," "): print (line, end =" ")' ... ha fatto il trucco! –

7

Mi trovavo di fronte a un problema simile. Sono stato in grado di risolverlo aggiungendo get_pty = True al paramiko:

stdin, stdout, stderr = client.exec_command("/var/mylongscript.py", get_pty=True) 
4

Un esempio minimo e completo lavoro di come usare this answer (testati in Python 3.6.1)

# run.py 
from paramiko import SSHClient 

ssh = SSHClient() 
ssh.load_system_host_keys() 

ssh.connect('...') 

print('started...') 
stdin, stdout, stderr = ssh.exec_command('python -m example', get_pty=True) 

for line in iter(stdout.readline, ""): 
    print(line, end="") 
print('finished.') 

e

# example.py, at the server 
import time 

for x in range(10): 
    print(x) 
    time.sleep(2) 

corsa sulla macchina locale con

python -m run 
+1

Questo non funziona con Python 2.7. – Patryk

+0

@Patryk, puoi essere più specifico su cosa esattamente non funziona? –

Problemi correlati