我在项目中使用metamap作为外部程序。项目中的完整代码是用Python编写的。在我的代码中,我必须将输入文件作为参数传递给metamap,然后读取metamap生成的输出文件。我调用metamap如下:
command = '/bin/metamap --silent --sldiID temp_input'
subprocess.call(command, shell=True)
在上面的例子中,输出文件以temp的名称生成_输入输出在当前工作目录中。然后我需要处理这个输出文件的内容。我目前面临的问题是,考虑到输出文件是空的,python代码向前移动。我怎样才能确保输出文件是完全写入的,并且只有这样python代码才会向前移动呢。在
到目前为止,我正在做的事情,我觉得这不是实现上述目标的正确方法或最干净的方法。在
^{pr2}$
如何确保输出文件是完全写入的,并且只有这样python代码才会向前移动。
一般来说,如果您希望处理是可靠的,您需要让写入文件的进程发送某种信号,说明它已经成功地写入了输入文件。当一个cd2{cd2>文件完成时,{cd2>将依赖于这个文件。您的代码不会处理任何名称为}已经完成复制。在
*.copying
模式的文件。或者,在成功地写入文件之后,写入过程可以创建一个名为filename.done
的标志文件,以表明{在这种情况下,由于您生成了子进程,您不仅需要(大概)等待子进程完成,还需要以某种方式确定它成功运行到完成。
metamap
进程是否提供了可以使用的返回代码?大多数实用程序在成功时返回0
,当由于某种原因失败时返回非零。在没有其他可靠的方法。因为没有额外的信息,读取过程就无法知道输入文件已被完全复制。写入过程可能会在写入文件的中途失败—例如,网络连接可能会失败。在
再说一遍-没有其他可靠的方法。在
在linux中,有一组称为inotify的事件,可以用来检测某个进程是否正在访问一个文件。 有一个python库用于访问这个库pyinotify。在
这篇博客文章解释了如何用pyinotify检查文件。在
http://www.saltycrane.com/blog/2010/04/monitoring-filesystem-python-and-pyinotify/
另外,
lsof
可能是一个选项,在这种情况下,您可以使用http://pythonhosted.org/psutil/index.html?highlight=lsof#psutil.Process.open_files。在您可以使用子进程.Popen.wait(超时=无)”。 https://docs.python.org/3/library/subprocess.html#subprocess.Popen.wait
相关问题 更多 >
编程相关推荐