我正在尝试遵循一个发现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上。我忘了提了。
答案 0 :(得分:0)
因此,在调试器中鬼混之后,它正在等待
stdout, stderr = proc.communicate()
exit_code = proc.wait()
我猜这两个都没有得到回应吗?我不太清楚为什么,但是当我把它们取出来时,它开始起作用。可能是Adobe已打开,然后将文档发送到打印机,然后在可以调用proc.communicate()之前将其关闭。