📁 Async pathlib for Python
Project description
📁 Async pathlib for Python
aiopath
is a complete implementation of pathlib
from Python 3.4+ that is compatible with asyncio
and the async/await
syntax. All I/O performed is asynchronous and awaitable.
This library will take advantage of libaio on Linux.
Usage
aiopath.Path
has the same API as pathlib.Path
, and aiopath.AsyncPurePath
works the same way as pathlib.PurePath
. The only difference is that with aiopath
, methods that perform I/O are asynchronous and awaitable, and methods that returned iterators now return async generators.
To run the following examples with top-level await
expressions, launch an asynchronous Python REPL using python3 -m asyncio
.
Basic
All of pathlib.Path
's methods that perform synchronous I/O are reimplemented as asynchronous methods.
import tempfile
from pathlib import Path
from aiopath import AsyncPath
with tempfile.NamedTemporaryFile() as temp:
path = Path(temp.name)
apath = AsyncPath(temp.name)
# check existence
## sync
assert path.exists()
## async
assert await apath.exists()
# check if file
## sync
assert path.is_file()
## async
assert await apath.is_file()
# touch
path.touch()
await apath.touch()
# read and write text
text = "example"
await apath.write_text(text)
assert text == await apath.read_text()
assert not path.exists()
assert not await apath.exists()
You can convert pathlib.Path
objects to aiopath.Path
objects easily:
from pathlib import Path
from aiopath import AsyncPath
home: Path = Path.home()
ahome: AsyncPath = AsyncPath(home)
assert isinstance(path, Path)
assert isinstance(apath, AsyncPath)
Opening a file
You can get an asynchronous file-like object handle by using asynchronous context managers.
import tempfile
from aiopath import AsyncPath
text: str = 'example'
with tempfile.NamedTemporaryFile() as temp:
apath = AsyncPath(temp.name)
async with apath.open(mode='w') as afile:
await afile.write(text)
result: str = await apath.read_text()
assert result == text
Globbing
aiopath
implements pathlib
globbing using async I/O and async generators.
from typing import List
from aiopath import AsyncPath
home: AsyncPath = await AsyncPath.home()
async for path in home.glob('*'):
assert isinstance(path, AsyncPath)
print(path)
downloads: AsyncPath = home / 'Downloads'
if await downloads.exists():
# caution! this might take awhile
paths: List[AsyncPath] = \
[path async for path in downloads.glob('**/*')]
Installation
Dependencies
- A POSIX compliant OS, or Windows
- Python 3.7+
requirements.txt
Linux
This library will take advantage of libaio, which is compatible with Linux 4.18 and up.
sudo apt install libaio1
PyPI
$ python3 -m pip install aiopath
GitHub
$ python3 -m pip install -r requirements.txt
$ python3 setup.py install
Support
Want to support this project and other open-source software?
License
See LICENSE
. If you'd like to use this project with a different license, please get in touch.
Credit
See CREDIT.md
.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for aiopath-0.1.1-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 042ddd2355b6f50d7896a29eda8e2feffce98aa6315d64ce77219d7d8b2842d2 |
|
MD5 | ec5e01d5ff9a086951317c30c7353f89 |
|
BLAKE2b-256 | 19f191b7edd08155f6736419ee089a26f336da771ebe180d4757caf10f99a485 |