Fetching latest headlines…
pyxclip: Cross-Platform Clipboard for Python, Backed by Rust
NORTH AMERICA
🇺🇸 United StatesMarch 22, 2026

pyxclip: Cross-Platform Clipboard for Python, Backed by Rust

0 views0 likes0 comments
Originally published byDev.to

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:

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 was posted specifically to fix this error. A Python Forum thread from April 2025 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 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.

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.

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.

Install

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

If you find this useful, consider giving it a star on GitHub. Issues and PRs are welcome.

Comments (0)

Sign in to join the discussion

Be the first to comment!