objectif
Copier efficacement entre des descripteurs de fichiers sans buffer utilisateur.
code minimal
import os, tempfile, pathlib, shutil
with tempfile.TemporaryDirectory() as tmp:
src = pathlib.Path(tmp)/"a"; dst = pathlib.Path(tmp)/"b"
src.write_bytes(b"x"*1024)
if hasattr(os, "sendfile"):
with src.open("rb") as fsrc, dst.open("wb") as fdst:
sent = os.sendfile(fdst.fileno(), fsrc.fileno(), 0, os.path.getsize(src))
print(dst.stat().st_size == src.stat().st_size) # attendu: True
else:
shutil.copyfile(src, dst)
print(dst.read_bytes() == src.read_bytes())
utilisation
import os, tempfile, pathlib
with tempfile.TemporaryDirectory() as tmp:
p = pathlib.Path(tmp)/"z"; p.write_bytes(b"data")
ok = True if p.exists() else False
print(ok)
variante(s) utile(s)
import os
print(hasattr(os, "sendfile"))
notes
- Disponible sur de nombreuses plateformes Unix; fallback nécessaire ailleurs.
- Idéal pour serveurs de fichiers ou proxies simples.