If you're trying to install pairtools
—a toolkit for parsing, sorting, and analyzing Hi-C paired-end sequencing data—but run into linking issues with pysam
, you're not alone.
A common and frustrating issue is this:
ImportError: libchtslib.cpython-312-x86_64-linux-gnu.so: cannot open shared object file: No such file or directory
Even after using --no-build-isolation
, you might still see errors like:
/tmp/pip-build-env-*/overlay/lib/python3.12/site-packages/pysam/libchtslib.cpython-312-x86_64-linux-gnu.so => not found
This happens because the compiled shared object is wrongly linked to temporary build paths. In this guide, I'll show you how to fix this for good.
✅ Goal
To install pairtools
in an isolated environment (like GitHub Codespaces), ensuring that:
-
pysam
is installed from source. - Shared libraries are not linked to
/tmp
or other temporary build paths. - All 17 tests pass using
pytest
.
📦 Step-by-Step Installation
🔄 1. Start Fresh (Use a Clean Codespace or Environment)
Delete and recreate the Codespace or virtual environment to prevent cached artifacts from interfering.
🔧 2. Install System Dependencies
sudo apt update && sudo apt install -y build-essential libhts-dev python3-dev
This ensures your system has the compilers and headers required for building C extensions like those in pysam
.
❌ 3. Uninstall Existing Builds
Remove any previously installed versions of pysam
or pairtools
:
pip uninstall pysam pairtools -y
🧪 4. Build pysam
from Source
This is crucial. We want to avoid using binary wheels:
pip install "pysam==0.23.0" --no-binary pysam --no-cache-dir --verbose
✅ Check for .so
files:
ls /home/codespace/.python/current/lib/python3.12/site-packages/pysam/*.so
You should see something like:
libchtslib.cpython-312-x86_64-linux-gnu.so
csamtools.cpython-312-x86_64-linux-gnu.so
🔍 5. Verify Proper Linking of pysam
ldd /home/codespace/.python/current/lib/python3.12/site-packages/pysam/libchtslib.cpython-312-x86_64-linux-gnu.so
Ensure the output does not reference any /tmp
paths.
Expected:
linux-vdso.so.1 => ...
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f...)
📂 6. Clone and Install pairtools
Navigate to your cloned pairtools
directory:
cd /workspaces/pairtools
Install in editable mode with --no-build-isolation
:
pip install -e .[all] --no-build-isolation --no-cache-dir --verbose
The
[all]
includes all optional dependencies, and--no-cache-dir
avoids reuse of broken builds.
🧬 7. Confirm pairtools
Linking
ldd /workspaces/pairtools/pairtools/lib/parse_pysam.cpython-312-x86_64-linux-gnu.so
You should see it link to:
/home/codespace/.python/current/lib/python3.12/site-packages/pysam/libchtslib.cpython-312-x86_64-linux-gnu.so
There should be no reference to /tmp/pip-build-env-*
.
✅ 8. Run Tests
Now validate the setup:
/home/codespace/.python/current/bin/python -m pytest -v
You should see:
collected 17 items
...
17 passed in ...
Note: At the time of writing this article, the Pairtools had 17 tests in total. Kindly recheck it to see if there has been any addition to the tests using:
pytest --collect-only
🧹 If Issues Persist: Manual Build
If you still see broken paths in the ldd
output, do this:
cd /workspaces/pairtools
rm -rf build dist *.egg-info pairtools/lib/*.so
python setup.py build_ext --inplace --verbose
pip install -e .[all] --no-build-isolation --no-cache-dir --verbose
Also check and clear any conflicting environment variables:
unset LD_LIBRARY_PATH
unset PYTHONPATH
🧠 Why This Works
-
--no-build-isolation
forces pip to use your installedpysam
, not a temp one. - Building from source ensures
.so
files are in the correct, persistent location. - Cleaning build artifacts ensures you're not pulling in a mislinked
.so
.
💡 Pro Tip: Verify Shared Object Path
Always check your .so
dependencies using:
ldd .so
If it points to /tmp
, rebuild from scratch.
📌 Final Words
Installing pairtools
correctly in Python 3.12, especially in ephemeral environments like GitHub Codespaces, requires care. By following this guide, you can ensure proper linking and a smooth installation with all tests passing.