等待外部进程完成fi写入

2024-10-03 06:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在项目中使用metamap作为外部程序。项目中的完整代码是用Python编写的。在我的代码中,我必须将输入文件作为参数传递给metamap,然后读取metamap生成的输出文件。我调用metamap如下:

command = '/bin/metamap --silent --sldiID temp_input'
subprocess.call(command, shell=True)

在上面的例子中,输出文件以temp的名称生成_输入输出在当前工作目录中。然后我需要处理这个输出文件的内容。我目前面临的问题是,考虑到输出文件是空的,python代码向前移动。我怎样才能确保输出文件是完全写入的,并且只有这样python代码才会向前移动呢。在

到目前为止,我正在做的事情,我觉得这不是实现上述目标的正确方法或最干净的方法。在

^{pr2}$

Tags: 文件项目方法代码程序inputbinshell
3条回答

如何确保输出文件是完全写入的,并且只有这样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。在

>>> import psutil
>>> f = open('file.test', 'w')
>>> p = psutil.Process()
>>> p.open_files()
[popenfile(path='/Users/username/file.test', fd=3)]
>>>

您可以使用子进程.Popen.wait(超时=无)”。 https://docs.python.org/3/library/subprocess.html#subprocess.Popen.wait

相关问题 更多 >