python – subprocess.call不等待进程完成
根据
Python文档,subprocess.call应该阻塞并等待子进程完成.在这段代码中,我试图通过在命令行上调用Libreoffice将少量xls文件转换为新格式.我假设对子进程调用的调用是阻塞的,但似乎我需要在每次调用后添加一个人工延迟,否则我会错过out目录中的几个文件.
我究竟做错了什么?为什么我需要延迟? from subprocess import call for i in range(0,len(sorted_files)): args = ['libreoffice','-headless','-convert-to','xls',"%s/%s.xls" %(sorted_files[i]['filename'],sorted_files[i]['filename']),'-outdir','out'] call(args) var = raw_input("Enter something: ") # if comment this line I dont get all the files in out directory 编辑通过以下评论可能很难找到答案.我使用unoconv进行文件转换,这种转换阻塞并且易于使用脚本. 解决方法
问题是soffice命令行工具(libreoffice只是一个链接,或者是另一个包装器)只是真实程序soffice.bin的“控制器”.它找到soffice.bin的运行副本和/或创建on,告诉它做一些工作,然后退出.
因此,调用正在做正确的事情:它等待libreoffice退出. 但你不想等待libreoffice退出,你想等soffice.bin完成libreoffice要求它做的工作. 看起来你正在尝试做的事情是不可能直接做的.但它可以间接地做. docs说无头模式:
换句话说,在运行一些UNO字符串/进行一些转换/在命令行上指定的任何其他内容后,应用程序不会退出,它会等待来自外部的更多UNO命令,而启动器只是在发送时立即运行应用程序的相应命令. 您可能必须直接使用上述外部控制API(UNO). 有关基础知识,请参阅Scripting LibreOffice(尽管有关于内部脚本的信息比外部更多),有关详细信息和示例,请参阅API documentation. 但是可能有一个更简单的答案: 另请注意,unoconv是用Python编写的,旨在用作模块.如果您只是导入它,您可以编写自己的(更简单,特定于用例)代码来替换“Main entrance”代码,而根本不使用子进程. (或者,当然,您可以撕开模块并自己使用相关代码,或者只是将它用作从Python中使用UNO的非常好的示例代码.) 此外,上面链接的unoconv页面列出了各种其他类似工具,一些通过UNO工作,一些不工作,所以如果它不适合你,请尝试其他工具. 如果没有其他工作,你可以考虑,例如,创建一个sentinel文件和使用文件系统监视,所以至少你将能够准确地检测它何时完成其工作,而不必猜测超时.但这是一个真正的最后沟渠解决方案,在消除所有其他选项之前,您甚至不应该考虑这个问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |