Ошибка буферизации чтения stdout из скрипта python с использованием цикла perl while - PullRequest
0 голосов
/ 15 октября 2019

Я использую цикл while в perl, чтобы выполнить скрипт на python и прочитать вывод построчно. Сценарий python вставляет данные в базу данных, выводится оператор слияния или вставки, а результат также отправляется на стандартный вывод. Скрипт perl читает это, но он буферизует и не включает всю информацию, пока скрипт python не завершится с каждым слиянием / вставкой. Я пытался использовать unbuffer, но он все еще обрезает данные.

Я пытался использовать unbuffer

  open(P,"unbuffer master_program_insert.py 2>&1 |");
  while(<P>) {
    chop;
    print OF "$_\n";
  }
  close(P)

, следя за журналом. Я вижу вывод, но он обрезается. Команда слияния выполняется, но показывает только половину команды. Как только слияние завершается, оно выводит оставшуюся часть команды слияния и результат слияния.

вывод, который я вижу:

"слияние в tar dbtable1 с использованием (выберите отдельный S_Customer, S_Src, T_Customer, T_Src, start_date, end_date, flg_ins_upd, случай, когда flg_ins_upd = 0, тогда случай, когда S_Customer = T_Customer и S_Src = T_Src, затем 0 еще 2 заканчиваются еще 1, заканчиваются как flg_real_ins_upd из (выберите STG.Crc ... , TGT.Customer как T_Customer, TGT.Src как T_Src, Start_date, end_date, случай, когда TGT.Customer равен нулю, а затем 1 или 0 завершается как flg_ins_upd из dbtable1 STG левого внешнего соединения dbtable2 TGT на STG.Customer = TGT.Custo. end_date = '9999-12-31') a) источник в tar.Customer = source.s_customer при сопоставлении и "

фактический оператор слияния:

" объединяется в tar dbtable1 с помощью (выберите отдельныйS_Customer, S_Src, T_Customer, T_Src, start_date, end_date, flg_ins_upd, случай, когда flg_ins_upd = 0, затем случай, когда S_Customer = T_Customer и S_Src = T_Src, затем 0, иначе 2, конец, еще 1, конец как flg_real_ins_upd из (выберите STG.Customer в качестве S_Customer, STG.Src в качестве S_Src, TGT.Customer в качестве T_Customer, TGT.Src в качестве T_Src, Start_date, end_dT.C, когда T =null, затем 1, иначе 0 завершается как flg_ins_upd из dbtable1 STG левого внешнего соединения dbtable2 TGT на STG.Customer = TGT.Customer и TGT.end_date = '9999-12-31') a) source на tar.Customer = source.s_customer при совпадениии source.flg_real_ins_upd = 2 и tar.end_date = '9999-12-31' затем обновите набор tar.end_date = DATEADD (Day, -1, current_date), если не найдено совпадение, и source.flg_real_ins_upd = 1 затем вставьте значения (source.s_customer, source.s_src, current_date, '9999-12-31') "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...