python-3.x - 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 上。我忘了提到这一点。
解决方案
因此,在与调试器鬼混之后,它正在等待
stdout, stderr = proc.communicate()
exit_code = proc.wait()
我猜这两个最终都没有收到回复?我不太明白为什么,但是当我把它们拿出来时,它开始起作用了。可能是 adobe 打开,并将文档发送到打印机,然后在调用 proc.communicate() 之前关闭。
推荐阅读
- sql - 如何为 Bartender 中的每个记录行选择自定义数量?
- angular - 离开页面Angular时使用sessionStorage将值保留在选择值中
- c++ - Qt 中的 iOS 通知
- powershell - Azure devops - 更新 json 文件 - powershell 脚本
- c++ - 有没有办法在 C++ 中初始化这样的 3D 数组?
- c - 为什么 getpwnam 返回的结构的 pw_passwd 字段不包含我的密码哈希?
- c# - 使用一个脚本获得 3 个不同的值
- c# - 如何禁用特定行并防止在 Xamarin 数据网格中单击?
- reactjs - React Grid 上的弹出图像
- python - Python 使用 pytest_mock 在一个函数中模拟多个查询