2015-08-20 4 views
1

Я работаю над скриптом python, который генерирует изображения двумя способами: сначала он создает базовые образы, а затем создает новые для сравнения с оригиналами, выводя, если были различия между два. Главный скрипт вызывает второй скрипт, который делает фактическое сравнение.Вывод скрипта/подпроцесса во временном порядке

Проблемы, с которыми я столкнулся, - это то, что выходные данные из двух сценариев не выстраиваются последовательно. Например, вот выход запуска сравнения:

DIFFERENTIAL RUNNING NOW 16:52:02.062000 
*** image05.jpg MATCHES *** 
MARKER ONE: Differential happened yet? 16:51:51.821000 
MARKER TWO: Where's the Diff? 16:51:51.824000 
==== Test\Dir ==== 
Copy Input 
Start Comparison 
Doing Comparison 

Формат Я хочу это в хотя это больше похоже на это:

MARKER ONE: Differential happened yet? 16:51:51.821000 
MARKER TWO: Where's the Diff? 16:51:51.824000 
==== Test\Dir ==== 
Copy Input 
Start Comparison 
Doing Comparison 
DIFFERENTIAL RUNNING NOW 16:52:02.062000 
*** image05.jpg MATCHES *** 

Так я получаю вывод, что нужно, но, глядя на метки времени,, они вышли из строя (для правильной организации, результаты должны произойти после «Doing Comparison» части)

кода потоки, как это (в целом):

# Imports, arguments 
. 
. 
MARKER ONE 
. 
. 
==== Test\Dir ==== 
. 
. 
if creating: 
    # create the images here 
    # 3 Subprocess are called here, but have no output (that I care about) 
    # Images are copied to their home directory 
    print "Copy Input" 
else: (comparison) 
    print "Start Comparison" 
    # create new images to be compared 
    # Repeat same 3 subprocesses 
    print "Doing Comparison" 
    # Comparison Subprocess 

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

if os.path.isfile(tempImg): 
     try: 
      ouput = Popen(command, shell=True) 
      stdout, stderr = output.communicate() 
      if stdout is not None: 
       print stdout 
      if stderr is not None: 
       print "Error occurred during execution:" 
       print stderr 
     except OSError as e: 
      print "Execution failed: " + e 
     with open(output) as r: 
      result = r.read() 
     if result == '0': 
      print "*** {} MATCHES ***".format(Base) 
     else: 
      message = "*** {0} DOES NOT MATCH: {1} pixels differ***".format(Base, result) 
      print message 
      out = open("{}\img_errs.txt".format(temp), "a") 
      out.write(message + "\n") 
    else: 
     message = "*** {} DOES NOT EXIST ***".format(tempImg) 
     print message 
     out = open("{}\img_errs.txt".format(temp), "a") 
     out.write(message + "\n") 

подпроцессов в родительском скрипта делается с помощью функции в одной и той же попытки/за исключением формата, показанного здесь. Я попытался использовать subprocess.call() вместо части Popen/.communicate(), а также Popen.wait(). Ничего не выходит из stdout, выход из этого - только операторы печати, но они, похоже, имеют приоритет от родительского скрипта и сначала печатают, даже если родительские строки встречаются первыми, о чем свидетельствуют отметки времени.

Можно ли каким-либо образом заставить родительский скрипт выводить на печать перед подпроцессом? Все это делается на Eclipse Mars с использованием Python 2.7.

+0

попробовать добавить 'sys.stdout.flush()' перед вызовом подпроцесса. – CasualDemon

+0

, чтобы отключить буферизацию, запустите свой скрипт с флагом '-u':' python -u your_script.py' – jfs

+0

С помощью этого сценария я выбрал опцию 'sys.stdout.flush()', но обе опции работал отлично. Спасибо вам за удивительно простые исправления! –

ответ

1

Это ответили в комментариях, но я хотел поставить его здесь, чтобы его было легче увидеть. Кредит на первой части происходит от комментария CasualDemon (который является один я в конечном итоге, используя):

Добавление линии заподлицо() здесь:

else: (comparison) 
    print "Start Comparison" 
    # create new images to be compared 
    # Repeat same 3 subprocesses 
    print "Doing Comparison" 
    sys.stdout.flush() <-- new 
    # Comparison Subprocess 

дал мне печатные последовательности мне нужно (во времени на основе заказ).

Вторая часть является заслугой ответа Дж. Ф. Себастьяна, который также работал. Я запускаю скрипт через конфигурацию внешних инструментов, поэтому, как-то, нужно будет туда.

Старый (под аргументами):

script.py ${folder_prompt} 

Новое:

-u script.py ${folder_prompt} 
Смежные вопросы