subprocess.Popen висит основное приложение - PullRequest
0 голосов
/ 16 октября 2018

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

def send_to_printer(pdffile):
    acrobat = r'C:\Program Files (x86)\Adobe\Acrobat 11.0\Acrobat\Acrobat.exe'

    # '"%s"'is to wrap double quotes around paths
    # as subprocess will use list2cmdline internally if we pass it a list
    # which escapes double quotes and Adobe Reader doesn't like that

    cmd = '"{}" /N /T "{}" "{}"'.format(acrobat, pdffile, printer_name)

    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = proc.communicate()
    exit_code = proc.wait()

Если я запускаю этот фрагмент кода самостоятельно и передаю его в формате pdf, я пытаюсь напечатать, он работает довольно хорошо.Когда я пытаюсь вызвать его из основного приложения, это вызывает проблемы.По сути, я собираю кучу отдельных PDF-файлов и собираю их вместе, а затем печатаю, чтобы они были двухсторонними.

Код, вызывающий этот код, выглядит следующим образом.

output1 = PdfFileWriter()
for pdf in args[:len(args)//2]:
    page = PdfFileReader(pdf).getPage(0)
    output1.addPage(page)

outputStream1 = open('front_pages_to_print.pdf', 'wb')
output1.write(outputStream1)
outputStream1.close()

send_to_printer('front_pages_to_print.pdf')

Когда я запускаю приведенный выше код перед отправкой его на принтер, он печатает первые страницы и затем зависает.Я также пытался просто вызывать отдельные файлы самостоятельно, но это приводит к тому же самому поведению.Он печатает первую страницу и зависает.Я немного прочитал об этом, и, предположительно, использование proc.wait () может вызвать тупик, если вы не используете commuicate (), как упоминалось здесь .Однако в коде, за которым я следую, есть строка stdout, stderr = proc.communicate (), который, как я предполагаю, обрабатывает это?Я должен быть честным, хотя, я пытаюсь понять код и не совсем понимаю.У кого-нибудь есть какие-либо предложения по этому поводу?

Спасибо

Редактировать - Это в Windows 10. Я забыл упомянуть об этом.

1 Ответ

0 голосов
/ 16 октября 2018

Так что после дурачения с отладчиком он ждал

stdout, stderr = proc.communicate()
exit_code = proc.wait()

Оба из них в конечном итоге не получили ответ, я полагаю?Я не совсем понимаю, почему, но когда я вынул их, это начало работать.Возможно, что Adobe открыла и отправила документ на принтер, а затем закрыла до вызова proc.communicate ().

...