首页 > 解决方案 > subprocess.Popen 挂起主应用程序

问题描述

我正在尝试遵循我在此处找到的代码示例,并且我对代码进行了一些修改,因此在我的主应用程序中看起来像这样

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')

当我在将上面的代码发送到打印机之前运行上面的代码时,它会打印第一页然后挂起。我也尝试过自己调用各个文件,但会导致相同的行为。它打印第一页并挂起。我对其进行了一些阅读,据说如果您不使用此处提到的 commuicate() ,则使用 proc.wait() 可能会导致死锁。但是,在我遵循的代码中,它有 stdout, stderr = proc.communicate() 行,我假设它正在处理这个?不过,我必须说实话,我正在尝试理解代码并且不太明白。有人对此有什么建议吗?

谢谢

编辑 - 这是在 Windows 10 上。我忘了提到这一点。

标签: python-3.xwindowspdfsubprocesspopen

解决方案


因此,在与调试器鬼混之后,它正在等待

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

我猜这两个最终都没有收到回复?我不太明白为什么,但是当我把它们拿出来时,它开始起作用了。可能是 adobe 打开,并将文档发送到打印机,然后在调用 proc.communicate() 之前关闭。


推荐阅读