# pyxclip: Cross-Platform Clipboard for Python, Backed by Rust
Most Python clipboard libraries function as thin wrappers for system-level command-line utilities. For instance, pyperclip relies on external binaries—invoking xclip on Linux and pbcopy on macOS—while using ctypes for Windows. Similarly, xerox (last updated in 2018) follows this pattern. Because these libraries depend on external processes, they are limited to text-only transfers and fail if the underlying system tool is missing.
The typical error looks like this:
```plaintext
PyperclipException: Pyperclip could not find a copy/paste mechanism for your system.
```
On Linux that means installing `xclip` or `xsel` manually. On modern desktops running Wayland, even with those tools installed, `pyperclip` silently fails to copy. A [freelancer gig](https://www.freelancer.in/projects/python/fix-pyperclip-copy-paste-mechanism.html) was posted specifically to fix this error. A [Python Forum thread from April 2025](https://python-forum.io/thread-44209.html) documents someone who gave up on `pyperclip` entirely on Ubuntu 24.04 and wrote their own `xclip` wrapper in Python.
## What pyxclip does differently
[pyxclip](https://github.com/abbazs/pyxclip) compiles a Rust extension module using PyO3 and the `arboard` crate. The compiled binary talks to platform APIs directly: X11 or Wayland on Linux, `NSPasteboard` on macOS, Win32 on Windows. No subprocess calls, no `xclip`, no `xsel`, no `pbcopy`.
It supports text, images, and file paths in a single package.
```python
import pyxclip
# Text
pyxclip.copy("Hello, world!")
print(pyxclip.paste())
# Clear
pyxclip.clear()
```
The `copy()` function dispatches based on argument type. A `str` copies as text. A `(width, height, bytes)` tuple copies as an RGBA image. A `Path` or list of `Path` objects copies file references. The `paste()` function returns whatever the clipboard contains.
```python
from pathlib import Path
from PIL import Image
# Images (RGBA pixel data)
img = Image.open("photo.png").convert("RGBA")
pyxclip.copy((img.width, img.height, img.tobytes()))
# File paths
pyxclip.copy(Path("/tmp/report.pdf"))
files = [Path("/tmp/a.pdf"), Path("/tmp/b.pdf")]
pyxclip.copy(files)
# Paste returns the appropriate type
result = pyxclip.paste() # str, dict, or list[str]
```
A `str` is always treated as text, never as a file path. If you need to copy a file reference, wrap it in `Path`. All paths are canonicalized to absolute before copying.
## Known limitation
File path copying works for programmatic access (copy and paste back in Python or terminal). Pasting into desktop file managers is a separate problem. GNOME's Nautilus expects `x-special/gnome-copied-files` alongside `text/uri-list`, which the `arboard` crate doesn't set. This is tracked in [issue #2](https://github.com/abbazs/pyxclip/issues/2).
## Install
```shell
pip install pyxclip
```
Python 3.8 through 3.14. Prebuilt wheels for Linux (x86_64, aarch64), macOS (x86_64, arm64), and Windows (x86_64). No C compiler or system packages needed. MIT licensed.
Source: [github.com/abbazs/pyxclip](https://github.com/abbazs/pyxclip)
If you find this useful, consider giving it a star on [GitHub](https://github.com/abbazs/pyxclip). Issues and PRs are welcome.