如何在Python中创建一个RAM磁盘?

51

我想在Python中创建一块RamDisk。我希望以跨平台的方式实现,以便在Windows XP到7、Mac和Linux上运行。我希望能够像操作常规磁盘驱动器一样对这个RamDisk进行读写,最好能使用驱动器字母/路径。

我之所以想要这样做是为了编写一个脚本的测试用例,该脚本会创建具有特定结构的目录。我希望完全在RamDisk中创建目录,以确保测试结束后目录被完全删除。我考虑使用Python的tempfile,但如果测试在中途停止,则可能无法删除目录。即使在测试过程中有人拔掉计算机的电源,我也希望能完全确定它已被删除。


7
我怀疑没有简单的跨平台方法来做到这一点,因为每个操作系统都以不同的方式处理挂载。虽然非常有趣的问题! - Ben Blank
如果测试在中途停止,目录可能无法被删除。您有证据吗?这与文档描述相矛盾。 - S.Lott
1
@S.Lott 我想象一下,如果测试没有机会在自己之后进行清理。在这种情况下,我会争辩:为什么不让测试设置确保一个干净的状态(如果需要,删除目录),而不管现有状态如何? - user166390
@pst:当文件关闭时,它将被删除。测试中没有“清理”操作——删除是操作系统对文件的定义的一部分,与任何应用软件无关。 - S.Lott
2
@S.Lott:“使用mkdtemp()的用户负责在完成后删除临时目录及其内容。”来自Python的tempfile文档。 - Ram Rachum
@pst:我希望计算机在测试运行之间保持没有垃圾目录/文件。 - Ram Rachum
4个回答

22

2
目前看来这是最好的解决方案,但我需要替代os.mkdir(和其他类似函数)在MemoryFS上操作的函数。如果没有这样的函数存在,我就必须自己编写。 - Ram Rachum
1
实际上,似乎可以在Linux系统上使用fuse挂载MemoryFS,并使用Python的标准函数访问它。http://www.willmcgugan.com/2010/6/20/pyfilesystem-03-released/ http://packages.python.org/fs/expose/fuse.html#module-fs.expose.fuse - esamatti
Fuse 的确很棒,但它不跨平台是个问题。此外,其中一些部分是 GPL 许可的,这可能会成为一个问题。 - Ram Rachum
1
内存文件系统的链接已经失效。这是当前的链接:https://docs.pyfilesystem.org/en/latest/reference/memoryfs.html - philologon
这实际上现在不起作用。fs.expose模块与fuse甚至不存在。 - user3496060

4
由于文件和目录处理是如此底层和依赖于操作系统,我怀疑类似于您想要的东西不存在(或者甚至不可能存在)。您最好的选择可能是实现一组“虚拟”文件系统功能、类和方法,以跟踪所创建的文件和目录层次结构及其内容。
在这种仿真中的可调用对象需要具有与应用程序使用的各种Python标准内置函数和模块中的对应项相同的签名并返回相同的值。
我怀疑这可能不像听起来的工作量那么大——模拟标准Python文件系统接口——这取决于您实际使用了多少,因为您不一定需要模仿所有内容。而且,如果使用纯Python™编写,则也将是便携式且易于维护和增强的。

2
有一些 Python 模块,比如 fs,几乎可以实现这个功能,但由于很难包装操作系统,它们提供了自己的接口,虽然不匹配,但在对象的方法中具有所有操作。 - Dan D.

1
一种选择可能是注入(猴子补丁)修改过的方法版本,这些方法用于os模块以及写入StringIO文件而不是磁盘的内置openfile。显然,这种替换只应在被测试的模块中发生;


对于我的情况来说,这并没有帮助,因为我的脚本会创建目录。 - Ram Rachum
有趣...那我该如何“虚拟化”os.mkdir - Ram Rachum
也许可以使用模拟库? - nikow

-7
请阅读以下内容:

http://docs.python.org/library/tempfile.html#tempfile.TemporaryFile

返回一个类似文件的对象,可用作临时存储区域。该文件使用mkstemp()创建。它将在关闭时被销毁(包括在垃圾回收对象时进行的隐式关闭)。
一切都已为您处理好了。什么都不需要做,它已经可以工作了。

2
正如我在问题中所说,我需要创建目录,而不仅仅是文件。根据您提供的链接:“使用mkdtemp()的用户负责在完成后删除临时目录及其内容。” - Ram Rachum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接