52

I want to create a ramdisk in Python. I want to be able to do this in a cross-platform way, so it'll work on Windows XP-to-7, Mac, and Linux. I want to be able to read/write to the ramdisk like it's a normal drive, preferably with a drive letter/path.

The reason I want this is to write tests for a script that creates a directory with a certain structure. I want to create the directory completely in the ramdisk so I'll be sure it would be completely deleted after the tests are over. I considered using Python's tempfile, but if the test will be stopped in the middle the directory might not be deleted. I want to be completely sure it's deleted even if someone pulls the plug on the computer in the middle of a test.

6
  • 7
    I rather suspect there's no simple, cross-platform way to do this, as each OS handles mounting differently. Very interesting question, though! Commented Dec 4, 2010 at 0:12
  • "if the test will be stopped in the middle the directory might not be deleted" Do you have any evidence of this? That contradicts the documentation. Commented Dec 4, 2010 at 0:18
  • 1
    @S.Lott I imagine if the test doesn't (get a chance to) clean up after itself. In which case I'd argue: Why not simply make the test setup ensure a clean state (delete directory if required, perhaps), regardless of existing state? Commented Dec 4, 2010 at 0:30
  • @pst: The file is deleted when it's closed. There's no "cleanup" in the test -- the delete is part of the OS definition of the file. Nothing to do with any application software. Commented Dec 4, 2010 at 2:53
  • 2
    @S.Lott: "The user of mkdtemp() is responsible for deleting the temporary directory and its contents when done with it." From Python's tempfile docs. Commented Dec 4, 2010 at 11:19

4 Answers 4

22

How about PyFilesystem?

https://docs.pyfilesystem.org/en/latest/reference/memoryfs.html

https://docs.pyfilesystem.org/en/latest/reference/tempfs.html

The downside is that you have to access the filesystem with PyFilesystem API, but you can also access the real fs with PyFilesystem.

Sign up to request clarification or add additional context in comments.

5 Comments

This currently seems like the best solution, but I will need substitutes for os.mkdir (and other such functions) that operate on MemoryFS. If no such functions exist, I'll have to write my own.
Actually it seems that you can mount the MemoryFS with fuse on Linux systems and access that with stock functions of Python. willmcgugan.com/2010/6/20/pyfilesystem-03-released packages.python.org/fs/expose/fuse.html#module-fs.expose.fuse
The Fuse thing is really awesome, but the fact it isn't cross-platform is a problem. Also, some of it is GPL licensed which can be a problem.
The link to memoryfs has rotted. Here is the current link: docs.pyfilesystem.org/en/latest/reference/memoryfs.html
This doesn't actually work now. The fs.expose module with fuse doesn't even exist.
4

Because file and directory-handling is so low-level and OS dependent, I doubt anything like what you want exists (or is even possible). Your best bet might be to implement a "virtual" file-system-like set of functions, classes, and methods that keep track of the files and directory-hierarchy created and their content.

Callables in such an emulation would need to have the same signature and return the same value(s) as their counterparts in the various Python standard built-ins and modules your application uses.

I suspect this might not be as much work as it sounds -- emulating the standard Python file-system interface -- depending on how much of it you're actually using since you wouldn't necessarily have to imitate all of it. Also, if written in Pure Python™, it would also be portable and easy to maintain and enhance.

1 Comment

there are python modules such as fs that do nearly this but because it's hard to wrap os they provide their own interface which doesn't match but has all of the operations as methods on a object
1

One option might be to inject (monkey patch) modified versions of the methods used in the os module as well as the builtins open and file that write to StringIO files instead of to disk. Obviously this substitution should only occur for the module being tested;

3 Comments

For my case it won't help, since my script creates directories.
Interesting... And how would I "virtualize" os.mkdir?
Maybe using the mock library?
-1

I know this is an old question, but if anyone is still looking for a python based, cross platform ramdisk, check out http://github.com/clockworksspheres/ramdisk

disclaimer: I am one of the authors, and the current maintainer.

It is a cross platform python ramdisk that can either be used as either a script, or as a library.

The Windows part needs work before it's fully functional.

The script/app is a python interface that's the same across platforms, and underneath handles the platform specific details. Binaries for Linux and Windows as well as an app for macOS are created with PyInstaller.

The macOS and Linux ramdisk sections rely on the OS facilities to create the ramdisk, the Windows one relies on Imdisk being installed.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.