Library / SDK
tomerfiliba-org/rpyc avatar
tomerfiliba-org/rpyc

RPyC Remote Python Call: transparent object proxies across Python processes

RPyC (Remote Python Call) - A transparent and symmetric RPC library for python

1,702 stars253 forksPythonNOASSERTION

At a glance

What is it?
RPyC is a symmetric Python RPC library that exposes remote objects through local-looking proxies. It fits Python distributed systems, but its permissive object model requires careful scrutiny of exposed services and version selection.
Who is it for?
RPyC suits developers who need Python-native object access across trusted process or machine boundaries and can control the exposed service. It is a poor fit for environments that require narrow, language-neutral interfaces or where unrestricted remote attribute access is unacceptable.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 41 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 7, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • tomerfiliba-org/rpyc1,702 ★ · -2
Star history
Repository2026-10-162026-11-07
tomerfiliba-org/rpyc1.7k1.7k

-2 Stars in the last 22 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

RPyC's remote object proxy model

RPyC addresses Python code that must call functions or manipulate objects in another process or on another computer. The README describes it as both transparent and symmetrical, with the latter term applying to its remote procedure call architecture. Its central technique is object proxying: a local client works through a proxy that represents an object owned by the remote Python runtime. Attribute reads, method calls, and related operations can therefore appear similar to work on a local Python object even though execution crosses a network boundary.

This approach differs from designing an RPC schema around primitive request and response records. RPyC instead carries Python behavior and object references across the boundary. That makes it useful when both ends already use Python and the natural interface is an existing class or instance rather than a small collection of serialized values. Clustering, distributed computing, and systems administration are all named as target uses in the project metadata.

Transparency is also the main design boundary. An interface that resembles local Python does not mean that remote execution has the same cost, isolation, or operational behavior as local access. The README's screenshot of a Windows client connected to a Linux server illustrates cross-machine use, while its note about stdout shows that remote output remains attached to the server console.

Inside RPyC's connection and proxy flow

The documented mechanism begins with a remote object identity and the dynamic nature of Python. RPyC creates a local proxy for that remote object, then forwards client-side operations to the server and returns results through the connection. The symmetry means the library is designed for remote interaction in both directions rather than treating every endpoint as a passive data source.

The repository layout supports a full Python package under `rpyc/`, command-line entry points under `rpyc/cli/`, documentation under `docs/`, and a dedicated `tests/` directory. This indicates that connection handling, public APIs, CLI programs, and tests are separate parts of the project rather than a single demonstration script.

The README does not describe the wire protocol, serialization format, authentication flow, encryption behavior, timeout policy, or object lifecycle rules. Those details therefore cannot be inferred merely from the word "transparent." In particular, a transparent proxy should not be read as evidence that the connection is authenticated or suitable for exposure to an untrusted network. Any adoption decision that depends on those properties requires checking the documentation and service configuration directly.

Installing RPyC and locating a first runnable example

The README does not include installation commands, a pip invocation, or a complete client-server example. It directs readers to the documentation at `https://rpyc.readthedocs.io`. The project metadata identifies the distribution as `rpyc`, requires Python 3.8 or later, and declares one runtime dependency, `plumbum`.

The exact package metadata is visible in `pyproject.toml`:

toml
[project]
name = "rpyc"
description = "Remote Python Call (RPyC) is a transparent and symmetric distributed computing library"
readme = "README.rst"
license = {text = "MIT License"}
requires-python = ">=3.8"
dependencies = [
    "plumbum",
]

This block confirms package identity, Python compatibility, licensing metadata, and the declared dependency, but it is not an installation tutorial by itself. The repository also defines these console scripts:

toml
[project.scripts]
rpyc_classic = "rpyc.cli.rpyc_classic:main"
rpyc_registry = "rpyc.cli.rpyc_registry:main"
"rpyc_classic.py" = "rpyc.cli.rpyc_classic:main"
"rpyc_registry.py" = "rpyc.cli.rpyc_registry:main"

The available files do not show the arguments accepted by these commands, so a complete first invocation cannot be given without guessing. A new user should start with the documentation linked by the README and locate the server setup, client connection code, and matching configuration for the intended RPyC version.

Where transparent Python RPC becomes a liability

RPyC is a poor fit when remote access must be represented by a narrow, stable contract. Python proxies can preserve the convenience of attribute access, but convenience reduces the distance between an application's normal code and its exposed surface. A service that exposes broad object behavior can require more careful review than one limited to explicitly designed operations. The README does not document a capability allowlist or a method-level authorization model, so neither should be assumed.

Version selection is another concrete constraint. Release 6.0.0 states that it fixed an RCE from `__array__`. The release notes do not describe the affected versions or remediation mechanics, but they make the upgrade history operationally relevant. A deployment should not treat an older RPyC installation as equivalent to the 6.0.1 release merely because both expose the same Python RPC interface.

RPyC also does not remove the operational costs of a distributed system. A failed connection, unavailable server, blocked network path, or long-running remote method can still affect the caller. The release history includes timeout and thread binding fixes in 5.3.1, which indicates that those concerns are part of the library's behavior. The README does not provide retry guarantees or a rollback procedure, so neither can be promised from the documentation.

RPyC compared with explicit message-based boundaries

The practical alternative is an explicitly defined message API that exposes selected operations and exchanges ordinary data. Such a boundary requires the application to name requests, responses, payloads, and errors. RPyC instead derives its client experience from Python object proxying and dynamic remote attributes. That is the concrete architectural difference.

An explicit message boundary can be easier to inspect when participants use different languages or when only a small set of operations should be reachable. It also avoids presenting a broad Python object model as though it were local. RPyC has the advantage when both ends are Python and the service already has a useful class or function interface that can be proxied. The project metadata explicitly targets Python 3, so that is its natural environment.

Neither approach can be selected from the phrase "transparent" alone. The decision depends on whether preserving the Python object interface outweighs the need for a deliberately small network surface. The README does not document RPyC interoperability with non-Python clients, so such compatibility must not be assumed.

RPyC maintenance, packaging, and upgrade boundaries

The repository is not archived, and its last push was on 2026-09-27. That establishes recent repository activity, but it does not guarantee compatibility with every deployment. The most recent listed release is 6.0.1 from 2024-09-25, whose release note lists fixes for proxy cache behavior, the `get` method, ID packing, and streams. Earlier releases include the `__array__` RCE fix in 6.0.0 and timeout and thread binding fixes in 5.3.1.

Packaging uses Hatchling. `pyproject.toml` declares `hatchling>=1.6.0` as its build requirement, while `requirements.txt` specifies `plumbum>=1.2`. The project supports Python versions from 3.8 onward and lists classifiers through Python 3.15. An upgrade therefore needs attention to both the Python runtime and behavior changes in the proxy, stream, cache, and connection layers.

There is a metadata inconsistency worth resolving before distribution decisions. `pyproject.toml` says `MIT License`, and the README badge also points to an MIT license, while the repository classification describes a custom license that GitHub cannot classify. The actual `LICENSE` file is therefore the first file to inspect for the terms that apply to a specific release. This is a licensing verification point, not legal advice.

RPyC adoption scope and release checks

Adopt RPyC when both participants are Python systems and remote objects are the intended interface. The project's proxy model and symmetric RPC design are directly aligned with that use. Do not adopt it merely because remote calls sound convenient, or when a narrow language-neutral contract and an easily enumerated network surface are primary requirements.

The first checks are specific: confirm the deployed RPyC version, review whether it predates the 6.0.0 `__array__` RCE fix, inspect the selected release's `LICENSE`, and enumerate every object and attribute intended for remote access. If those checks pass, begin with the version-matched setup instructions in the linked documentation. The concrete judgement is that RPyC fits trusted Python-to-Python object distribution, while its proxy surface and security history require release-specific review before adoption.

Editorial conclusion

RPyC suits developers who need Python-native object access across trusted process or machine boundaries and can control the exposed service. It is a poor fit for environments that require narrow, language-neutral interfaces or where unrestricted remote attribute access is unacceptable. Before adoption, verify the version in use, review the 6.0.0 change concerning __array__, inspect the LICENSE file, and determine what methods and attributes the service exposes.

Frequently asked questions

What is RPyC used for?

RPyC provides symmetric remote procedure calls through Python object proxies, allowing remote objects to be accessed across process or computer boundaries. Its metadata targets clustering, distributed computing, and systems administration.

What Python versions and dependencies does RPyC require?

The project metadata requires Python 3.8 or later and declares `plumbum` as a runtime dependency. `requirements.txt` specifies `plumbum>=1.2`.

Did RPyC 6.0.0 fix a security issue?

Yes. The 6.0.0 release note says it fixed an RCE from `__array__`. The release information does not provide further technical detail about that issue.

Does the RPyC README provide installation commands?

No. The README links to `https://rpyc.readthedocs.io`, while `pyproject.toml` identifies the package as `rpyc` and declares its Python requirement and dependency.

Official sources

  1. Issues
  2. Project website
  3. README
  4. Releases
  5. tomerfiliba-org/rpyc on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/tomerfiliba-org-rpyc.svg)](https://hysenlabs.com/projects/tomerfiliba-org-rpyc)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/tomerfiliba-org-rpyc.svg)](https://hysenlabs.com/projects/tomerfiliba-org-rpyc)

Was this useful?