为什么os.remove()引发异常PermissionError?

时间:2018-04-18 08:21:18

标签: python subprocess readfile named-pipes

在Windows 7平台上,我使用python 3.6作为框架来启动工作流程(用C语言编写)。 为了启动流程,使用了subprocess.Popen。以下显示了相关代码(每个进程要启动一个线程)。

redirstream = open(redirfilename, "w")
proc = subprocess.Popen(batchargs, shell=False, stdout=redirstream)
outs, errs = proc.communicate(timeout=60)

# wait for job to be finished
ret = proc.wait()

...

if ret == 0:  # changed !!
    redirstream.flush()
    redirstream.close()
    os.remove(redirfilename)

communicate用于能够在60秒后终止可执行文件,以防止它挂起。 redirstream用于将可执行文件(用C编写)的输出写入文件,用于一般调试目的(与此问题无关)。当然,所有进程都以redirfiles传递不同的文件名。

从独立的python线程以这种方式启动多达十个这样的子进程。

虽然它有效但我做了一个神秘的观察:

对于可执行文件已完成且没有错误的情况,我想删除redirfilename,因为它已不再使用。

现在让我们说,我已经启动了流程-A,B和C.

进程A和B完成并返回0作为结果。 然而,进程C故意不获取数据(仅用于测试,串行连接已断开)并使用Windows ReadFile函数等待来自命名管道(从python创建)的输入:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

在这种情况下,当“C”仍在等待ReadFile完成时,A和B的os.remove(redirfilename)有时会抛出异常“PermissionError”,说,该文件仍然被另一个进程使用。但是从任务管理器我可以看到,进程A和B不再存在(正如预期的那样)。

我试图抓住PermissionError并在延迟一段时间后重复删除命令。只有在“C”终止后(60秒后超时),才能删除A或B的redirfile。

为什么redirstream仍然被屏蔽并以某种方式使用,虽然后面的进程不再存在,为什么它在一个完全不相关的进程中被ReadFile()阻止,绝对不是相关到该特定文件?这是Python或我的实现中的问题吗?

任何提示都受到高度赞赏......

0 个答案:

没有答案