Release Change Log


Date: 07.08.2017

  • Fix refcount leakage when unboxing from cache (#196)
  • Fix TypeError when dispatching exceptions on py2 (unicode)
  • Respect rpyc_protocol_config for default Service getattr (#202)
  • Support unix domain sockets (#100,#208)
  • Use first accessible server in connect_by_service (#220)
  • Fix deadlock problem with logging (#207,#212)


Date: 26.07.2017

  • Add missing endpoints config in ThreadPoolServer (#222)
  • Fix jython support (#156,#171)
  • Improve documentation (#158,#185,#189,#198 and more)


Date: 14.06.2017

  • Fix export_function on python 3.6


Date: 09.06.2017

  • Fix issue high-cpu polling (#191,#218)
  • Fix filename argument in logging (#197)
  • Improved log messages (#191,#204)
  • Drop support for python 3.2 and py 2.5


Date: 29.05.2017

Please excuse the briefity for this versions changelist.

  • Add keepalive interface [#151]
  • Various fixes: #136, #140, #143, #147, #149, #151, #159, #160, #166, #173, #176, #179, #174, #182, #183 and others.


  • RPyC integrates with plumbum; plumbum is required for some features, like and zero deploy, but the core of the library doesn’t require it. It is, of course, advised to have it installed.
  • SshContext, SshTunnel classes killed in favor of plumbum’s SSH tunneling. The interface doesn’t change much, except that ssh_connect now accept a plumbum.SshMachine instance instead of SshContext.
  • Zero deploy: deploy RPyC to a remote machine over an SSH connection and form an SSH tunnel connected to it, in just one line of code. All you need is SSH access and a Python interpreter installed on the remote machine.
  • Dropping Python 2.4 support. RPyC now requires Python 2.5 - 3.3.
  • rpycd - a well-behaved daemon for, based on python-daemon
  • The OneShotServer is now exposed by rpyc_classic -m oneshot
  • scripts directory renamed bin
  • Introducing Splitbrain Python - running code on remote machines transparently. Although tested, it is still considered experimental.
  • Removing the BgServerThread and all polling/timeout hacks in favor of a “global background reactor thread” that handles all incoming transport from all connections. This should solve all threading issues once and for all.
  • Added MockClassicConnection - a mock RPyC “connection” that allows you to write code that runs either locally or remotely without modification
  • Added teleport_function


  • Fix (issue #76) for real this time
  • Fix issue with BgServingThread (#89)
  • Fix issue with ThreadPoolServer (#91)
  • Remove RPyC’s excepthook in favor of chaining the exception’s remote tracebacks in the exception class’ __str__ method. This solves numerous issues with logging and debugging.
  • Add OneShotServer
  • Add UNIX domain sockets


  • Windows: make SSH tunnels windowless (#68)
  • Fixes a compatibility issue with IronPython on Mono (#72)
  • Fixes an issue with introspection when an AttributeError is expected (#71)
  • The server now logs all exceptions (#73)
  • Forking server: call siginterrupt(False) in forked child (#76)
  • Shutting down the old wikidot site
  • Adding Travis CI integration


  • Adding missing import (#52)
  • Fixing site documentation issue (#54)
  • Fixing Python 3 incompatibilities (#58, #59, #60, #61, #66)
  • Fixing slice issue (#62)
  • Added the endpoints parameter to the config dict of connection (only on the server side)


  • Added support for IPv6 (#28)
  • Added SSH tunneling support (ssh_connect)
  • Added restricted object wrapping
  • Several fixes to AsyncResult and weak references
  • Added the ThreadPoolServer
  • Fixed some minor (harmless) races that caused tracebacks occasionally when server-threads terminated
  • Fixes issues #8, #41, #42, #43, #46, and #49.
  • Converted all CRLF to LF (#40)
  • Dropped TLSlite integration (#45). We’ve been dragging this corpse for too long.
  • New documentation (both the website and docstrings) written in Sphinx
    • The site has moved to sourceforge. Wikidot had served us well over the past three years, but they began displaying way too many ads and didn’t support uploading files over rsync, which made my life hard.
    • New docs are part of the git repository. Updating the site is as easy as make upload
  • Python 3.0-3.2 support


What’s New

  • Supports CPython 2.4-2.7, IronPython, and Jython
  • tlslite has been ported to python 2.5-2.7 (the original library targeted 2.3 and 2.4)
  • Initial python 3 support – not finished!
  • Moves to a more conventional directory structure
  • Moves to more standard facilities (logging, nosetests)
  • Solves a major performance issue with the BgServingThread (#32), by removing the contention between the two threads that share the connection
  • Fixes lots of issues concerning the ForkingServer (#3, #7, and #15)
  • Many small bug fixes (#16, #13, #4, etc.)
  • Integrates with the built-in ssl module for SSL support
    • now takes several --ssl-xxx switches (see --help for more info)
  • Fixes typos, running pylint, etc.

Breakage from 3.0.7

  • Removing egg builds (we’re pure python, and eggs just messed up the build)
  • Package layout changed drastically, and some files were renamed
    • The servers/ directory was renamed scripts/
    • was renamed
    • They scripts now install to your python scripts directory (no longer part of the package), e.g. C:\python27\Scripts
  • now takes --register in order to register, instead of --dont-register, which was a silly choice.
  • classic.tls_connect, factory.tls_connect were renamed tlslite_connect, to distinguish it from the new ssl_connect.


  • Moving to git as source control
  • Build script: more egg formats; register in pypi ; remove svn; auto-generate as well
  • Cosmetic touches to Connection: separate serve into _recv and dispatch
  • Shutdown socket before closing (SHUT_RDWR) to prevent TIME_WAIT and other problems with various Unixes
  • PipeStream: use low-level file APIs (, os.write) to prevent stdio-level buffering that messed up select
  • open logfile for writing (was opened for reading)
  • type of timeout is now int (was str)
  • utils/ better handling of sockets; fix python 2.4 syntax issue
  • ForkingServer: re-register SIGCHLD handler after handling that signal, to support non-BSD-compliant platforms where after the invocation of the signal handler, the handler is reset


  • Handle metaclasses better in inspect_methods
  • handle old-style-class exceptions better; python 2.4 issues
  • VdbAuthenticator: when loading files, open for read only; API changes (from_dict instead of from_users), from_file accepts open-mode
  • ForkingServer: better handling of SIGCHLD


  • now also creates egg files
  • Slightly improved servers/
  • Fixes to utis/
    • The authenticator is now invoked by _accept_client, which means it is invoked on the client’s context (thread or child process). This solves a problem with the forking server having a TLS authenticator.
    • Changed the forking server to handle SIGCHLD instead of using double-fork.


  • Fix: inspect_methods used dir and getattr to inspect the given object; this caused a problem with premature activation of properties (as they are activated by getattr). Now it inspects the object’s type instead, following the MRO by itself, to avoid possible side effects.


  • Changed versioning scheme: now 3.0.3 instead of 3.03, and the version tuple is (3, 0, 3)
  • Added servers/ - a utility to manage verifier databases (used by tlslite)
  • Added the --vdb switch to, which invokes a secure server (TLS) with the given VDB file.


  • Authenticators: authenticated servers now store the credentials of the connection in conn._config.credentials
  • Registry: added UDP and TCP registry servers and clients (from rpyc.utils.registry import ...)
  • Minor bug fixes
  • More tests
  • The test-suite now runs under python 2.4 too


  • Fixes some minor issues/bugs
  • The registry server can now be instantiated (no longer a singleton) and customized, and RPyC server can be customized to use the different registry.


Known Issues

  • comparison - comparing remote and local objects will usually not work, but there’s nothing to do about it.
  • 64bit platforms: since channels use 32bit length field, you can’t pass data/strings over 4gb. this is not a real limitation (unless you have a super-fast local network and tons of RAM), but as 64bit python becomes the defacto standard, I will upgrade channels to 64bit length field.
  • threads - in face of no better solution, and after consulting many people, I resorted to setting a timeout on the underlying recv(). This is not an elegant way, but all other solution required rewriting all sorts of threading primitives and were not necessarily deadlock/race-free. as the zen says, “practicality beats purity”.
  • Windows - pipes supported, but Win32 pipes work like shit

3.00 RC2

Known Issues

  • Windows - pipe server doesn’t work