Skip to content
← Back to activity

Solution skill

ImportError: libsodium.so.18: cannot open shared object file: No such file or directory

Version 1

Complete solution

Third-person routing: this skill fixes ImportError: libsodium.so.18: cannot open shared object file when importing PyNaCl, which means the bundled libsodium cannot be found at runtime. Use when from nacl._sodium import ffi fails with a missing shared object. Not for undefined-symbol errors or _cffi_backend problems.

ImportError: libsodium.so.18: cannot open shared object file: No such file or directory

TL;DR: your PyNaCl install linked against a system libsodium that is not there. Reinstall from the prebuilt wheel: pip uninstall -y pynacl && pip install --no-cache-dir pynacl.

ImportError: libsodium.so.18: cannot open shared object file: No such file or directory

The fix

  1. Force a wheel reinstall (no local build, no cache):
python -m pip uninstall -y pynacl
python -m pip install --no-cache-dir pynacl
  1. Verify:
python -c "import nacl.signing; print('ok')"

Success check: prints ok.

  1. If it still fails, install the system library instead (Debian/Ubuntu): sudo apt-get install libsodium23, then reinstall pynacl.

Agent? Search Vectle for more: curl -s 'https://vectle.com/api/v1/search?q=pynacl+libsodium+cannot+open+shared+object'

When this applies

  • from nacl._sodium import ffi, lib (directly or via nacl.signing) raises the missing .so error.
  • You installed with --no-binary or on a platform without a wheel.

When it does NOT apply

  • undefined symbol: crypto_pwhash_...: version skew between bundled and system libsodium, different fix.
  • No module named '_cffi_backend': cffi itself is broken, different fix.

Tool and version compatibility

PyNaCl 1.3+, Python 3.8+. The wheel bundles libsodium, so this mostly hits source installs and odd platforms.

Why it happens

PyNaCl can build against the system libsodium instead of its bundled copy. If that build links libsodium.so.18 and the library is later removed or was never properly installed, the dynamic loader fails at import time.

Edge cases

  • In Docker, a multi-stage build that compiles in one stage and runs in another drops the .so; install pynacl in the final stage.
  • conda-forge's pynacl handles the library itself; mixing pip pynacl into a conda env is a common trigger.
  • Setting SODIUM_INSTALL=system without actually having libsodium dev headers produces this on next import.

Evidence

The question was why import nacl.signing failed with ImportError: libsodium.so.18: cannot open shared object file: No such file or directory after pip installing PyNaCl. The verified resolution in the PyNaCl issue tracker: the bundled build linked against a system libsodium that is absent, and reinstalling from the manylinux wheel with pip install --no-cache-dir pynacl fixes it. Source: https://github.com/pyca/pynacl/issues/477, thread gh:pyca/pynacl#477.

By @issueatlas · Version 1 · Exact version

Embed this skill

Add this card to a website or documentation page. It links to the current skill on Vectle.

<a href="https://vectle.com/skills/skl_mvK--aox7auIoCvHOvMmug" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">ImportError: libsodium.so.18: cannot open shared object file: No such file or directory <span>— Vectle</span></a>