PyDwarfs
A wrapper of DwarFS command line utilities.
DwarFS is stands for Deduplicating Warp-speed Advanced Read-only File System, it is a fast high compression read-only file system for Linux and Windows. See this project's homepage.
Note: This project currently does not provide support for Windows version of DwarFS command line utility.
Features / TODO
- Mount/unmount a DwarFS image file to specified mountpoint (
dwarfs/mount.dwarfs) - Extract a DwarFS image file (
dwarfsextract, initially implemented) - Create a DwarFS image file (
mkdwarfs) - Check a DwarFS image file (
dwarfsck) - Performance test (
dwarfsbench)
Install
Just run the command: pip install pydwarfs.
Or you can download and install the wheel file from release page manually.
Examples
The following examples are for the more common uses of command line utilities.
Mount/unmount a DwarFS image file to specified mountpoint
Check if a path is a DwarFS mountpoint
>>> from pydwarfs.dwarfs import DwarFS
>>> DwarFS.isDwarFSMountPoint(this_is_dwarfs_mnt)
True
>>> DwarFS.isDwarFSMountPoint('/path/to/non-mnt')
False
>>> DwarFS.isDwarFSMountPoint('/proc') # Obviously not a DwarFS mountpoint
False
>>>
List all of DwarFS mountpoint
>>> DwarFS.listAllDwarFSMountPoints()
[MountPoint(source='dwarfs', target=PosixPath('/path/to/dwarfs/image/mountpoint'), fstype='fuse.dwarfs', options=('rw', 'nosuid', 'nodev', 'relatime', 'user_id=1000', 'group_id=1000'), freq=0, passno=0), ...]
>>>
Create a DwarFS instance
In the default case, Dwarfs.init() will find the location of dwarfs command via shutil.which().
>>> from pydwarfs.dwarfs import DwarFS
>>> dwarfs = Dwarfs.init()
>>> dwarfs.executable
'/usr/bin/dwarfs'
>>>
If the DwarFS command line utilities are not installed, you can specify a location of dwarfs command instead.
>>> from pydwarfs.dwarfs import DwarFS
>>> dwarfs = Dwarfs.init('/path/to/valid/dwarfs')
>>> dwarfs.executable
'/path/to/valid/dwarfs'
>>>
A simple mount
>>> dwarfs.mount('/path/to/source.dwarfs', '/path/to/destination/directory')
>>>
To check if the mount was actually successful, exit the Python REPL and run the following command:
$ > findmnt /path/to/destination/directory
TARGET SOURCE FSTYPE OPTIONS
/path/to/destination/directory dwarfs fuse.dwarfs rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
$ >
Mount with some specified options
Use the dedicated attribute class DwarFSMountOptions:
>>> from pydwarfs.dwarfs import DwarFS, DwarFSMountOptions
>>> dwarfs = Dwarfs.init()
>>> options1 = DwarFSMountOptions(cachefile='32M', readonly=True, debuglevel='debug')
>>> dwarfs.mount('/path/to/source.1.dwarfs', '/path/to/destination/directory.1', options)
I 04:06:32.182380 [dwarfs_main.cpp:1328] dwarfs (v0.7.4, fuse version 35)
D 04:06:32.182909 [filesystem_v2.cpp:482] found valid section index
D 04:06:32.182927 [filesystem_v2.cpp:493] section BLOCK @ 64 [16,669,939 bytes]
...
D 04:06:32.191025 [filesystem_v2.cpp:515] read 734 blocks and 175,158 bytes of metadata
I 04:06:32.191041 [dwarfs_main.cpp:1144] file system initialized [8.624ms]
>>>
Or simply specify options by dict and **kwargs:
>>> from pydwarfs.dwarfs import DwarFS, DwarFSMountOptions
>>> dwarfs = Dwarfs.init()
>>> options2 = {'cachefile': '16M', 'readonly': True}
>>> dwarfs.mount('/path/to/source.2.dwarfs', '/path/to/destination/directory.2', options, debuglevel='debug')
I 04:14:01.981335 [dwarfs_main.cpp:1328] dwarfs (v0.7.4, fuse version 35)
D 04:14:01.983736 [filesystem_v2.cpp:482] found valid section index
D 04:14:01.983753 [filesystem_v2.cpp:493] section BLOCK @ 64 [67,097,028 bytes]
...
D 04:14:01.984644 [filesystem_v2.cpp:515] read 7 blocks and 2,755 bytes of metadata
I 04:14:01.984656 [dwarfs_main.cpp:1144] file system initialized [3.27ms]
>>>
Unmount
>>> dwarfs.unmount('/path/to/destination/directory')
>>>
Unmount by the method umount instead of the default fusermount:
>>> dwarfs.unmount('/path/to/destination/directory.1', method='umount')
>>>
You can forcely unmount by add the argument lazy_unmount=True:
>>> dwarfs.unmount('/path/to/destination/directory.2', lazy_unmount=True)
>>>
Extract a DwarFS image file
A simple extraction
>>> import os
>>> from pydwarfs.dwarfsextract import DwarFSExtract
>>> dwarfsextract = DwarFSExtract.init()
>>> output_dir = '/path/to/dest/directory'
>>> dwarfsextract.extract('/path/to/image.dwarfs', output_dir)
>>>
>>> os.listdir(output_dir)
['dataWin', 'Sakuna.exe', 'steam_appid.txt', 'xaudio2_9redist.dll', ...]
>>>
Note: The path pointed to by output_dir must be an existing directory.
Extract image file with progress
>>> another_output_dir = '/path/to/another/output/directory'
>>> for progress in dwarfsextract.extract('/path/to/image.dwarfs', another_output_dir, yield_progress=True):
... print(progress)
...
100
99
98
...
2
1
0
>>> os.listdir(another_output_dir)
['dataWin', 'Sakuna.exe', 'steam_appid.txt', 'xaudio2_9redist.dll', ...]
>>>
Metadata
Release files for pydwarfs 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pydwarfs-0.3.1.tar.gz | 10.7 kB | Without provenance | Details for pydwarfs-0.3.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pydwarfs-0.3.1-py3-none-any.whl | Python 3 | none | any | Details for pydwarfs-0.3.1-py3-none-any.whl |
Total release size: 21.2 kB
Release files / pydwarfs-0.3.1.tar.gz
| Download URL | pydwarfs-0.3.1.tar.gz |
|---|---|
| Size | 10.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7131c4e22a2ef775c7ac6d17863a0552680d2b2d0bf294f2805d5b2812e2561a
|
|
BLAKE2b-256 checksum How to use checksums |
0476cec7c56f567be2cd4341e1f8a131c5421e66e1b31683844da4944bac0664
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.6
|
Release files / pydwarfs-0.3.1-py3-none-any.whl
| Download URL | pydwarfs-0.3.1-py3-none-any.whl |
|---|---|
| Size | 10.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2df6b0da7b9103cf3a895b85dbe4429c177b1ec38609ca062e7f1b6ad081c0fb
|
|
BLAKE2b-256 checksum How to use checksums |
af93152c0001c8033fb8a0469b4de0fec358f2a8f022b2d23599f1c1927710c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.6
|
Security for pydwarfs 0.3.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.