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

2024-04-25 19:32:20 发布

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

在Windows7平台上,我使用Python3.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。你知道吗

最多有10个这样的子进程以这种方式从独立的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完成时,os.删除(redirfilename)for A和B有时抛出异常“PermissionError”,即文件仍由另一个进程使用。但是从taskmanager我可以看到,进程A和B已经不存在了(正如预期的那样)。你知道吗

我试图捕获PermissionError,并在延迟一段时间后重复delete命令。只有在“C”终止后(60秒后超时),才能删除A或B的重拨文件。你知道吗

为什么redirstream仍然被阻止并以某种方式被使用,尽管后面的进程不再是活动的,为什么它被ReadFile()在一个完全不相关的进程中阻止,而这个进程肯定与特定的文件不相关?这是Python中的问题还是我的实现中的问题?你知道吗

任何提示都非常感谢。。。你知道吗


Tags: 文件可执行文件for进程情况proc线程subprocess

热门问题