Я запускаю скрипт для управления процессами на удаленной машине (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()
Но должно быть лучшее решение, чем изменение всех моих операторов печати!
Вы можете добавить -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
Обычно буферизация строк - хороший выбор
Установите для свойства dropOnEmpty значение true. Для получения дополнительной информации см. http://jqueryui.com/demos/sortable/#empty-lists .
-121--1714780-Если используются одни и те же исполняемые файлы, результаты должны совпадать. Однако стоит отметить, что вычисления с плавающей запятой обычно сильно настраиваются рядом постоянных настроек (режим бесконечности, режим округления и т. д.). Это означает, что одна и та же команда с плавающей запятой может давать различные результаты в зависимости от текущей комбинации настроек. Если приложение проверяет, что все эти настройки сброшены на одинаковые значения в начале выполнения, то результаты должны быть одинаковыми. Однако если некоторые из этих параметров настройки не сброшены или зависят от внешних параметров (например, переменных среды), то в некоторых случаях на разных машинах могут наблюдаться различные результаты.
-121--4460076-Возможное решение, найденное в другой теме , предлагает использовать
ssh -t user@host ./five.py
, который подделывает терминал. Только недостаток, ssh отпечатки
Connection to host closed.
в дополнение.
Одна вещь, которую вы можете использовать, поскольку уже используете Python, - это Paramiko , намного лучше способ удаленной работы по SSH. Вот статья о том, как я использую его в самом простом виде.
Вы можете заменить объект 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
, которая заставит ввод и вывод быть небуферизованными.