subprocess.Popen挂起主应用程序

时间:2018-10-16 13:43:41

标签: python-3.x windows pdf subprocess popen

我正在尝试遵循一个发现here的代码示例,并且对代码进行了一些修改,以便在主应用程序中看起来像这样

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

当我在将上述代码发送到打印机之前运行上述代码时,它将打印第一页,然后挂起。我也尝试过仅自行调用各个文件,但结果相同。它打印第一页并挂起。我仔细阅读了一下,如果您不使用here中提到的commuicate(),则使用proc.wait()可能会导致死锁。但是,在我遵循的代码中,它具有stdout行,我假设stderr = proc.communicate()正在处理此行?不过,我必须老实说,我试图理解代码,但还不太了解。有人对此有任何建议吗?

谢谢

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

1 个答案:

答案 0 :(得分:0)

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

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

我猜这两个都没有得到回应吗?我不太清楚为什么,但是当我把它们取出来时,它开始起作用。可能是Adobe已打开,然后将文档发送到打印机,然后在可以调用proc.communicate()之前将其关闭。