Python/Linux:如何确定移动的文件何时完全可用?

2024-09-24 04:17:25 发布

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

我有一个文件夹,其中不断添加新文件。我有一个python脚本,它使用os.listdir()查找这些文件,然后自动对它们执行分析。但是,这些文件相当大,因此在实际编写/复制之前,它们似乎会显示在os.listdir()中。是否有某种方法可以区分哪些文件未在移动过程中?将大小与os.path.getsize()进行比较似乎不起作用

使用Python 3.7.3在Pi4上运行Raspbian Buster。我是编程和linux的新手

谢谢


Tags: 文件path方法脚本文件夹os过程linux
2条回答

有关原子和跨文件系统移动的概念性解释,请参阅此moves in Python(可以真正节省您的时间)

您可以采取以下方法来解决您的问题:-

->;使用Pyinotifyusage of Pynotify监视文件系统事件

->;使用flock将文件锁定几秒钟

->;使用lsof,我们基本上可以检查使用特定文件的进程

`from subprocess import check_output,Popen, PIPE
try:
   lsout=Popen(['lsof',filename],stdout=PIPE, shell=False)
   check_output(["grep",filename], stdin=lsout.stdout, shell=False)
except:
   #check_output will throw an exception here if it won't find any process using that file`

只需在except部分编写日志处理代码,就可以开始了

->;一个守护进程,通过使用监视程序库watchdog implementation来监视父文件夹的任何更改

->;您可以通过在/proc中的PID/s循环查找特定id来检查另一个进程正在使用的文件(假设您可以控制不断添加新文件以标识其id的程序)

->;可以使用psutil检查文件上是否有句柄

在编程中,这被称为concurrency,这是指计算同时发生,且执行顺序无法保证的情况。在您的情况下,一个程序在另一个程序完成对文件的写入之前开始读取该文件。这个特殊的问题称为reader-writers problem,实际上在嵌入式系统中相当常见

这个问题有很多解决方案,但最简单和最常见的是lock。最简单的锁可以防止一个资源同时被多个程序访问。实际上,它确保资源上的操作以原子方式进行。锁被实现为一个对象,可以获取释放(这些通常是对象的函数)。程序尝试在循环中获取锁,只要程序没有获取锁,循环就会迭代。当获得锁时,它会授予持有锁的程序执行某些代码块的能力(这通常是一个简单的if语句),然后释放锁。请注意,我所指的程序通常称为thread

在Python中,可以使用^{}对象。首先,需要创建一个锁对象

from threading import Lock
file_lock = Lock()

然后在每个线程中,等待获取锁后再继续。如果设置blocking=True,它将导致整个线程停止运行,直到获得锁为止,而不需要循环

file_lock.acquire(blocking=True):
# atomic operation
file_lock.release()

请注意,每个线程中应使用相同的锁对象。在读取和写入文件之前,需要获取锁,在读取和写入文件之后,需要释放锁。这将确保这些操作不会再次同时发生

相关问题 更多 >