2010-02-25 1 views
4

Я запускаю сценарий для управления процессами на удаленной машине (SSH). Давайте назовем это five.pyВывод скриптов python, отображаемых только при завершении при использовании SSH?

#!/usr/bin/python 
import time, subprocess 

subprocess.call('echo 0',shell=True) 
for i in range(1,5): 
    time.sleep(1) 
    print(i) 

Если я в настоящее время запустить

ssh [email protected] five.py 

Я хотел бы видеть на выходе

0 
1 
2 
3 
4 

появляющимся на моем стандарте из второй по второй (как он выполняется, если выполняется локально). Что происходит: я получаю 0 из «эха» сразу, а остальные появляются сразу после завершения всей программы. (Не помогает вложить «five.py» в скрипт bash, чтобы вызвать его «python five.py» или использовать «print >> sys.stdout, i»).

Это должно быть связано с тем, как питон пишет в стандартный вывод, так как другие программы ведут себя вполне нормально .. функциональный обходной путь является

import time, subprocess 
import sys 

subprocess.call('echo 0',shell=True) 
for i in range(1,5): 
    time.sleep(1) 
    sys.stdout.write(str(i)+'\n') 
    sys.stdout.flush() 

Но должно быть лучшим решением, чем изменить все мои заявления печати!

ответ

5

Вы можете добавить -u на притон линии, как interjay намекают

#!/usr/bin/python -u 

Вы также можете возобновить стандартный вывод с буферным выключены или установлен на линию буферизации

import os,sys 
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) # no buffering 
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) # line buffering 

, как правило, буферизации линии является хороший выбор

+0

Большое спасибо: sys.stdout = os.fdopen (sys.stdout.fileno(), 'w', 1) 'работает очень хорошо и должно быть более безопасным, чем' python -u ' –

2

Возможное решение найдено в another topic, предлагает ли я использовать

ssh -t [email protected] ./five.py 

, который Подделки терминал. Только недостатки, ssh отпечатки

Connection to host closed. 

в добавлении.

0

Вы можете заменить объект sys.stdout так, чтобы он автоматически сбрасывался после каждой записи. Это также повлияет на заявление print. Пример, взятый из this answer:

class flushfile(object): 
    def __init__(self, f): 
     self.f = f 
    def write(self, x): 
     self.f.write(x) 
     self.f.flush() 

import sys 
sys.stdout = flushfile(sys.stdout) 

Edit: Еще один вариант для запуска Python с -u вариант, который заставит вход и выход будет небуферизован.

0

Одна вещь, которую вы можете использовать при использовании, поскольку вы уже используете Python, - это Paramiko, гораздо лучший способ сделать удаленный SSH-работу. Вот article о том, как я использую его в своей базовой форме.