Skip to main content

📁 Async pathlib for Python

Project description

📁 Async pathlib for Python

aiopath is a complete implementation of Python's pathlib that is compatible with asyncio and Python's async/await syntax. All I/O performed by aiopath is asynchronous and awaitable.

aiopath takes advantage of Python type annotations, and it also takes advantage of libaio on Linux.

Usage

aiopath.Path has the same API as pathlib.Path, and aiopath.AsyncPurePath has the same API as pathlib.PurePath.

With aiopath, methods that perform I/O are asynchronous and awaitable, and methods that are overriden from pathlib 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. PurePath methods are not asynchronous because they don't perform I/O.

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.AsyncPath objects, and vice versa:

from pathlib import Path
from aiopath import AsyncPath

home: Path = Path.home()
ahome: AsyncPath = AsyncPath(home)
path: Path = Path(ahome)

assert isinstance(home, Path)
assert isinstance(ahome, AsyncPath)
assert isinstance(path, Path)
assert str(home) == str(ahome) == str(path)

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():
  # this might take a while
  paths: List[AsyncPath] = \
    [path async for path in downloads.glob('**/*')]

Installation

Dependencies

  • A POSIX compliant OS, or Windows
  • Python 3.7+
  • requirements.txt

Linux dependencies

If you're using a 4.18 or newer kernel and have libaio installed, aiopath will use it via aiofile. You can install libaio on Debian/Ubuntu like so:

$ 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 projects like it?

Buy Me A Coffee

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiopath-0.3.1.tar.gz (13.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

aiopath-0.3.1-py2.py3-none-any.whl (15.1 kB view details)

Uploaded Python 2Python 3

File details

Details for the file aiopath-0.3.1.tar.gz.

File metadata

  • Download URL: aiopath-0.3.1.tar.gz
  • Upload date:
  • Size: 13.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.4.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.6

File hashes

Hashes for aiopath-0.3.1.tar.gz
Algorithm Hash digest
SHA256 29d59e2eafc016dc47295cc8ca0a76d9d8470f0f1232c644f49dca16c69b14e2
MD5 6a29aadd2caae96596708a4334e65630
BLAKE2b-256 995f8428bbfeb8914d0e24f3e73129021e003c1657566ac60dd924caf2fcf01c

See more details on using hashes here.

File details

Details for the file aiopath-0.3.1-py2.py3-none-any.whl.

File metadata

  • Download URL: aiopath-0.3.1-py2.py3-none-any.whl
  • Upload date:
  • Size: 15.1 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/46.4.0 requests-toolbelt/0.9.1 tqdm/4.45.0 CPython/3.8.6

File hashes

Hashes for aiopath-0.3.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 c3cd0ebc174f8e041821a7c806467f1c657b202cae835da128b32708171eafa4
MD5 449959bdd2224d6fb91f11c9b1fb59b8
BLAKE2b-256 0f35c5234c9b01aa9e7f03e21b603b0f0c6e819653e27be2dee0e346f095c658

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page