Back to Blog
PyMOLVisualization

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.

SSSudipta SardarJuly 20, 20269 min read
Install Open-Source PyMOL with Conda for Molecular Visualization (Apple Silicon)

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.

bash
# 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.

bash
conda create -n bu-pymol -y --override-channels -c conda-forge -c bioconda pymol-open-source

conda 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.0 built as py314h73e9b85_8 is the version we get, native for osx-arm64.
  • The single heavyweight is qt-main at 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 create finished 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

bash
conda activate bu-pymol

The 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:

bash
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

ErrorFix
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 foundYou 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 stuckconda 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 installYou 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 SSHThere 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 toolsPyMOL 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:

bash
conda update -n bu-pymol --override-channels -c conda-forge -c bioconda pymol-open-source

Pin 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:

bash
conda create -n bu-pymol -y --override-channels -c conda-forge -c bioconda \
  pymol-open-source=3.1.0 python=3.12

Export the exact environment so a collaborator can recreate it:

bash
conda env export -n bu-pymol > pymol-env.yml

Remove the env entirely when you are done (this reclaims that ~1.1 GB):

bash
conda remove -n bu-pymol --all

Next steps

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.