如何检查卷是否被安装在应该使用Python的地方?

我有一个用Python编写的备份脚本,在将源目录复制到目录之前创build目标目录。 我已经configuration它使用/external-backup作为目的地,这是我安装一个外部硬盘驱动器。 我刚刚运行了脚本,没有打开(或挂载)硬盘驱动器,发现它正常工作,虽然在内部硬盘上做了一个备份,但是没有足够的空间来备份。

我的问题是:如何在写入之前检查音量是否安装在正确的位置? 如果我可以检测到/external-backup没有挂载,我可以防止写入。

额外的问题是,为什么这是允许的,当操作系统知道该目录应该存在于另一台设备上时,我应该在后面安装该设备(外部硬盘驱动器)的数据(在内部硬盘驱动器上)会发生什么? 很明显,不同的设备在同一条path上不能有两个副本!

提前致谢!

我会看看os.path.ismount()

为了明确的答案,只有内核知道肯定,请问内核:

 cat /proc/mounts 

该文件可以像使用任何你喜欢的工具那样被读取/parsing,就像是一个普通的文件一样。 包括Python。 快速的肮脏的例子:

 #!/usr/bin/python d = {} for l in file('/proc/mounts'): if l[0] == '/': l = l.split() d[l[0]] = l[1] import pprint pprint.pprint(d) 

最简单的检查方法是通过subprocess调用mount ,看看它是否显示在那里。 要获得额外的功劳,请使用/dev/disk/by-*的内容上的os.readlink()来确定它是哪个设备。

奖金答案。 如果未挂载外部设备,则将数据写入path/external-backup根分区。 如果外部设备已挂载,则根分区上的数据仍然存在,但由于/external-backup现在指向外部设备,因此无法访问。

老问题,但我想我会提供我的解决scheme(基于丹尼斯·威廉姆森和伊格纳西奥·巴斯克斯 – 艾布拉姆斯的答案)反正。 由于我在非Linux环境中使用它来检查正在安装的远程目录,因此不能使用/ procmtab,也没有执行其他检查:

 def is_mounted(special, directory): search_prefix = '{} on {}'.format(special, directory.rstrip('/')) if os.path.ismount(directory): mounts = subprocess.check_output(['mount']).split('\n') for line in mounts: if line[:len(search_prefix)] == search_prefix: return True; return False 

改进欢迎!

/ etc / mtab文件存在告诉你什么是当前安装。 有一个getmntent调用,但我不认为它是在os模块中导出的。 快速和肮脏? 打开/ etc / mtab并分割。 确保您的设备存在于第0列中,并且第1列中的目标挂载点是正确的。