Я работаю над скриптом 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.
попробовать добавить 'sys.stdout.flush()' перед вызовом подпроцесса. – CasualDemon
, чтобы отключить буферизацию, запустите свой скрипт с флагом '-u':' python -u your_script.py' – jfs
С помощью этого сценария я выбрал опцию 'sys.stdout.flush()', но обе опции работал отлично. Спасибо вам за удивительно простые исправления! –