Search code examples
pythonpython-3.xmountpyfilesystem

How to mount a memory filesystem onto a directory


I have a memory filesystem in Python, created in the following fashion:

import fs
mem_fs = fs.open_fs('mem://')
mem_fs.makedirs('/dir1')
with mem_fs.open('/dir1/file1', 'w') as file1:
    file1.write('test')

I want to mount this filesystem onto a directory in my OS filesystem (e.g., /home/user/mem_dir). I can create an object that would reference OS filesystem:

os_fs = fs.open_fs('/home/user/mem_dir')

But then I have no idea how to go about mounting mem_fs onto os_fs. I tried using MountFS class, but it only creates a virtual filesystem. I need to create a mount point in a way that other external applications (e.g., nautilus) would be able to see it and copy files to/from there. Any feedback would be appreciated.


Solution

  • I had the same requirement, ans i've managed it this way

    from fs.tempfs import TempFS
    tmp = TempFS(identifier='_toto', temp_dir='tmp/ramdisk/')
    

    it does mount create a directory, with an arbitrary name suffixed by _toto

    tmp/ramdisk ❯❯❯ ls
    tmpa1_4azgi_toto

    which is totaly available as a standard filesystem in the host as in your python code

    tmp/ramdisk/tmpa1_4azgi_toto ❯❯❯ mkdir test                                                                    
    tmp/ramdisk/tmpa1_4azgi_toto ❯❯❯ ls                                                                            
    test
    
     >>> tmp.listdir('/')
    ['test']
    

    it look quite magic as it does not appear at all in the mounted host's filesystem

     ❯❯❯ df -ah | grep -E '(ramdisk|tmp)'                                              
    tmpfs                       785M    1,7M  783M   1% /run
    tmpfs                       3,9G    195M  3,7G   5% /dev/shm
    tmpfs                       5,0M    4,0K  5,0M   1% /run/lock
    tmpfs                       3,9G       0  3,9G   0% /sys/fs/cgroup
    tmpfs                       785M     36K  785M   1% /run/user/1000
    

    and it does totally disepear when your code end, or when you call

    >>> tmp.close()
    

    tmp/ramdisk ❯❯❯ ls
    tmp/ramdisk ❯❯❯

    Cheers