Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 等待外部进程完成文件写入_Python_Python 2.7_File_Parsing - Fatal编程技术网

Python 等待外部进程完成文件写入

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生成。然后我需要处理这个输出文件的内容

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

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关闭)。我们能可靠地做到这一点吗?