Install Open-Source PyMOL with Conda for Molecular Visualization (Apple Silicon)
Install open-source PyMOL 3.1.0 with conda on an Apple Silicon Mac using one isolated env, native arm64 builds, and a real headless smoke test to verify it.
PyMOL is one of the most widely used tools for looking at 3D biomolecular structures: proteins, nucleic acids, ligands, and the poses that come out of docking runs. It gives you a Qt-based graphical window plus a full Python command line and API, so you can either click around a structure or script publication-quality renders.
There are two PyMOL worlds, and it is worth being clear about which one we install here. The open-source PyMOL (built by the community, distributed on conda-forge) is free and is what this guide covers. The incentive/commercial PyMOL sold by Schrodinger is a separate paid build with signed installers and support. They share a lineage and most commands, but this guide installs the open-source pymol-open-source package only.
The reason we put it in its own conda environment is the theme of this whole series: the exact build you need lives inside the env, isolated from your system Python and from every other tool. PyMOL pulls in a large GUI stack (Qt, GLEW, gstreamer, and friends), so you really do not want it leaking into a shared environment. One env per tool keeps things clean and reproducible.
Prerequisites
You need a working conda. If you have not set that up yet on your Mac, start with the companion guide, Install Miniconda on Apple Silicon, then come back here.
The machine used for this guide is an Apple Silicon Mac (arm64), macOS 26.5.2, with conda 25.5.1 using the fast libmamba solver. Everything below was run on that setup.
We install with --override-channels -c conda-forge -c bioconda. This deliberately skips Anaconda's defaults channel so you never hit the "Terms of Service have not been accepted" gate. The pymol-open-source package lives on conda-forge, so conda-forge plus bioconda is all we need.
TL;DR: copy-paste install
If you just want it working, run this. Explanations follow below.
# Create one isolated env just for PyMOL
conda create -n bu-pymol -y --override-channels -c conda-forge -c bioconda pymol-open-source
# Activate it
conda activate bu-pymol
# Verify (headless: no display needed)
pymol -cq -d "print('pymol headless OK', cmd.get_version()[0])"Step by step
1. Create the environment
Notice the package name is pymol-open-source with hyphens, not pymol. That is a common first stumble. We give the env a clear, tool-specific name (bu-pymol) so it is obvious what lives inside it.
conda create -n bu-pymol -y --override-channels -c conda-forge -c bioconda pymol-open-sourceconda resolves the environment and then downloads the packages. Here is the real output from the test machine, trimmed to the parts that matter:
### install pymol -> env bu-pymol : specs: pymol-open-source ###
Channels:
- conda-forge
- bioconda
Platform: osx-arm64
Collecting package metadata (repodata.json): done
Solving environment: done
## Package Plan ##
environment location: /opt/homebrew/Caskroom/miniconda/base/envs/bu-pymol
added / updated specs:
- pymol-open-source
The following packages will be downloaded:
package | build
---------------------------|-----------------
glew-2.3.0 | hf163413_0 448 KB conda-forge
hdf5-2.1.0 |nompi_hebe1841_110 3.8 MB conda-forge
libnetcdf-4.10.0 |nompi_ha00b61a_205 766 KB conda-forge
pmw-2.1.1 | py314h4dc9dd8_0 621 KB conda-forge
pymol-open-source-3.1.0 | py314h73e9b85_8 5.9 MB conda-forge
pyqt-5.15.11 | py314h17b549b_2 3.8 MB conda-forge
qt-main-5.15.15 | he8aa932_8 47.7 MB conda-forge
------------------------------------------------------------
Total: 112.5 MB
...
numpy conda-forge/osx-arm64::numpy-2.5.1-py314hb79c6fa_0
pymol-open-source conda-forge/osx-arm64::pymol-open-source-3.1.0-py314h73e9b85_8
pyqt conda-forge/osx-arm64::pyqt-5.15.11-py314h17b549b_2
python conda-forge/osx-arm64::python-3.14.6-h156bc91_100_cp314
qt-main conda-forge/osx-arm64::qt-main-5.15.15-he8aa932_8
...
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
# $ conda activate bu-pymol
#
real 47.93
A few things worth reading off that output:
pymol-open-source-3.1.0built aspy314h73e9b85_8is the version we get, native forosx-arm64.- The single heavyweight is
qt-mainat 47.7 MB; the whole Qt/GUI stack is why this download totals 112.5 MB and the unpacked env lands around 1.1 GB on disk — the largest environment in this series. That is expected: PyMOL ships a full desktop GUI. - The whole
conda createfinished in about 48 seconds (real 47.93) thanks to the libmamba solver. - Because we pinned nothing but the package name, conda pulled Python 3.14.6 to satisfy the newest build. That is fine. If you want a more conservative interpreter, see the pinning note under Managing the environment.
2. Activate it
conda activate bu-pymolThe pymol launcher and the pymol Python module only exist inside this env. If you ever see pymol: command not found, the fix is almost always that the env is not active.
Apple Silicon / architecture note
Good news for M1/M2/M3/M4 users: conda-forge ships native osx-arm64 builds of pymol-open-source 3.1.0. You can see it directly in the install plan above — every package resolves to conda-forge/osx-arm64::.... That means no Rosetta and no CONDA_SUBDIR=osx-64 workaround are needed. PyMOL runs as a true arm64 binary.
The GUI uses native Qt (pyqt) through macOS Cocoa, so you do not need XQuartz. And the headless import path (import pymol in Python) needs no display at all, which is what makes the verification below work over SSH or in a script.
If some day you hit an obscure dependency that only ships an Intel build, the documented Rosetta fallback (not needed here, and not run on the test machine) is: install Rosetta 2 with softwareupdate --install-rosetta --agree-to-license, then create the env under CONDA_SUBDIR=osx-64. For PyMOL 3.1.0 on Apple Silicon you will not need this.
Verify the install
PyMOL can run fully headless with pymol -cq, where -c means command-line (no GUI) and -q means quiet. That is the cleanest way to confirm the install without opening a window. Here is the exact check run on the test machine and its real output:
pymol -cq -d "print('pymol headless OK', cmd.get_version()[0])"PyMOL>print('pymol headless OK', cmd.get_version()[0])
pymol headless OK 3.1.0
Seeing 3.1.0 printed back confirms both that PyMOL launched and that the Python API (cmd) is wired up correctly.
Two more sanity checks are handy but were not executed on the test machine, so treat them as documentation, not captured runs: conda list -n bu-pymol pymol-open-source shows the exact installed build, and python -c "import pymol; from pymol import cmd; print('pymol import OK')" confirms the module imports inside the active env.
Opening the GUI
To actually see a structure, run pymol (no -c) from a real Mac desktop session and a window opens. Over SSH or inside a container there is no display, so stick to the headless pymol -cq script.pml form or the Python API. A missing display is the usual cause of a qt.qpa.plugin error or a segfault at startup — it is not a broken install.
Common errors and fixes
| Error | Fix |
|---|---|
CondaToSNonInteractiveError / "Terms of Service have not been accepted" | Do not use the defaults channel. Add --override-channels -c conda-forge -c bioconda to every create/install command, as shown. |
PackagesNotFoundError: pymol-open-source not found | You searched the wrong channel and/or used the wrong name. The package is on conda-forge, and it is pymol-open-source with hyphens, not pymol. |
| Solving environment is very slow or stuck | conda 25.5 already uses the libmamba solver. If it still hangs, install into a fresh empty env (never base), or run the same command with mamba. |
pymol: command not found after install | You forgot to activate the env. Run conda activate bu-pymol; the launcher only exists inside it. |
GUI fails to open, segfault, or qt.qpa.plugin error over SSH | There is no display. Script it headless with pymol -cq script.pml, or launch the GUI from a local Mac desktop session. XQuartz is not required. |
| numpy / dependency conflicts when adding other tools | PyMOL 3.1.0 needs numpy >=2.0. Keep one tool per env; install other packages in their own envs rather than forcing them alongside PyMOL. |
Managing the environment
Update PyMOL later within the same env:
conda update -n bu-pymol --override-channels -c conda-forge -c bioconda pymol-open-sourcePin for reproducibility. The captured run left the interpreter unpinned and got Python 3.14.6. If you would rather lock things down, pin the version (and optionally the interpreter) when you create the env. Note there is currently no py3.13 arm64 build, so Python 3.12 is a safe conservative choice:
conda create -n bu-pymol -y --override-channels -c conda-forge -c bioconda \
pymol-open-source=3.1.0 python=3.12Export the exact environment so a collaborator can recreate it:
conda env export -n bu-pymol > pymol-env.ymlRemove the env entirely when you are done (this reclaims that ~1.1 GB):
conda remove -n bu-pymol --allNext steps
- Use PyMOL to inspect docking poses from the AutoDock Vina install guide — visualizing the top-ranked pose alongside the receptor is exactly what PyMOL is for.
- If you want to understand the
--override-channels -c conda-forge -c biocondapattern more deeply, see Conda environments and Bioconda channels.
With PyMOL living safely in its own bu-pymol env, you can render structures, script figures, and analyze geometry without ever touching your base Python. That isolation is the whole point.