Python 等待外部进程完成文件写入
我在一个项目中使用外部程序。项目中的完整代码是用Python编写的。在代码中的某个位置,我必须将输入文件作为参数传递给metamap,然后读取metamap生成的输出文件。我按如下方式调用metamap:Python 等待外部进程完成文件写入,python,python-2.7,file,parsing,Python,Python 2.7,File,Parsing,我在一个项目中使用外部程序。项目中的完整代码是用Python编写的。在代码中的某个位置,我必须将输入文件作为参数传递给metamap,然后读取metamap生成的输出文件。我按如下方式调用metamap: command = '/bin/metamap --silent --sldiID temp_input' subprocess.call(command, shell=True) 在上述情况下,输出文件由当前工作目录中的名称temp_input.out生成。然后我需要处理这个输出文件的内容
command = '/bin/metamap --silent --sldiID temp_input'
subprocess.call(command, shell=True)
在上述情况下,输出文件由当前工作目录中的名称temp_input.out生成。然后我需要处理这个输出文件的内容。我目前面临的问题是,python代码在考虑输出文件为空的情况下向前移动。我如何确保输出文件被完全写入,并且只有在python代码向前移动的情况下
到目前为止,我正在做的事情,我觉得这不是实现上述目标的正确方法或最干净的方法
while fileExists == False:
if os.path.isfile(outputFileName):
fileExists = os.stat(outputFileName).st_size != 0
您可以使用“subprocess.Popen.wait(timeout=None)”来死锁子进程。 如何确保输出文件已完全写入,并且只有在python代码向前移动时才能执行 通常,如果希望处理可靠,则需要让写入文件的进程发送某种信号,表明它已成功写入输入文件。例如,它可以从名为
datafile.copying
的文件开始,然后在完成时依赖于大多数系统以原子方式实现rename()
,并rename()
将文件转换为datafile
。您的代码不会处理任何具有名称的*。复制模式的文件。或者,在成功写入文件后,写入过程可以创建一个名为filename.done
的标志文件,以表明filename
已完成复制
在这种情况下,由于生成了子进程,您不仅需要(大概)等待子进程完成,还需要以某种方式确定它成功运行到完成。metamap
过程是否提供了您可以使用的返回代码?大多数实用程序在成功时返回0
,在由于某种原因失败时返回非零
没有其他可靠的方法可以做到这一点。因为如果没有额外的信息,读取过程就无法知道输入文件已被完全复制。写入过程可能会在写入文件的中途失败,例如,网络连接可能会失败
同样,没有其他可靠的方法可以做到这一点。在linux中,有一组称为的事件,可以用来检测进程是否正在访问文件。
有一个python库用于访问这个名为
这篇博文解释了如何使用pyinotify检查文件
另外,lsof
可能是一个选项,在这种情况下,您可以使用
导入psutil
>>>f=打开('file.test','w')
>>>p=psutil.Process()
>>>p.打开_文件()
[popenfile(path='/Users/username/file.test',fd=3]
>>>
您能解释一下在上面的代码中是如何做到这一点的吗?虽然我还没有真正实现它,但pynotify会给我文件系统上事件的通知。我希望我的python程序等待外部文件完全写入,然后继续。pynotify如何帮助我做到这一点?有了pynotify,您应该能够捕获关闭文件句柄的事件,并且在这一点上,应该完成对该文件的写入过程。如果不能保证这一点,那么您必须在整个过程中以某种方式通知,文件已写入。可能是将完成的位写入文件,或者在队列中传递消息,或者类似的策略。因为,您是说没有可靠的方法来完成。我现在正朝着不同的方向思考。在我发布的上述问题中,另一种思路是找到一种方法,让python代码等待生成的输出文件关闭(在上面的例子中,temp_input.out关闭)。我们能可靠地做到这一点吗?