Вывод сценариев Python, отображенных только при завершении при использовании SSH?

Я запускаю скрипт для управления процессами на удаленной машине (SSH). Давайте назовем это five.py

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

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

Если я теперь работаю

ssh user@host five.py

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

0
1
2
3
4

появитесь по моему стандарту, второму вторым (как он делает, если выполняются локально).. То, что происходит: Я получаю 0 от "эха" сразу же, и остальное только появляется сразу после того, как вся программа заканчивается. (Не помогает вложить 'five.py' в сценарий удара; назвать его 'Python five.py'; или использовать 'печать>> sys.stdout, я').

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

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
задан Ivan Lappo-Danilevski 25 February 2010 в 17:46
поделиться

4 ответа

Вы можете добавить -u в строку shebang, как подсказал interjay

#!/usr/bin/python -u

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

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

Обычно буферизация строк - хороший выбор

6
ответ дан 14 December 2019 в 04:36
поделиться

Установите для свойства dropOnEmpty значение true. Для получения дополнительной информации см. http://jqueryui.com/demos/sortable/#empty-lists .

-121--1714780-

Если используются одни и те же исполняемые файлы, результаты должны совпадать. Однако стоит отметить, что вычисления с плавающей запятой обычно сильно настраиваются рядом постоянных настроек (режим бесконечности, режим округления и т. д.). Это означает, что одна и та же команда с плавающей запятой может давать различные результаты в зависимости от текущей комбинации настроек. Если приложение проверяет, что все эти настройки сброшены на одинаковые значения в начале выполнения, то результаты должны быть одинаковыми. Однако если некоторые из этих параметров настройки не сброшены или зависят от внешних параметров (например, переменных среды), то в некоторых случаях на разных машинах могут наблюдаться различные результаты.

-121--4460076-

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

ssh -t user@host ./five.py

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

Connection to host closed.

в дополнение.

2
ответ дан 14 December 2019 в 04:36
поделиться

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

0
ответ дан 14 December 2019 в 04:36
поделиться

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

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
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: