Python compatibility

PyPy implements the Python language version 2.7.9. It supports all of the core language, passing Python test suite (with minor modifications that were already accepted in the main python in newer versions). It supports most of the commonly used Python standard library modules; details below.

PyPy has alpha/beta-level support for the CPython C API, however, this feature is not yet complete. We strongly advise use of CFFI instead. CFFI come builtin with PyPy. Many libraries will require a bit of effort to work, but there are known success stories. Check out PyPy blog for updates, as well as the Compatibility Wiki.

C extensions need to be recompiled for PyPy in order to work. Depending on your build system, it might work out of the box or will be slightly harder.

Standard library modules supported by PyPy. Note that large parts of python library are implemented in pure python, so they don't have to be listed there. Please just check if it imports. If it imports, it should work.

  • __builtin__, __pypy__, _ast, _cffi_backend, _codecs, _collections, _continuation, _csv, _file, _hashlib, _io, _locale, _lsprof, _md5, _minimal_curses, _multibytecodec, _multiprocessing, _numpypy, _pickle_support, _pypyjson, _random, _rawffi, _sha, _socket, _sre, _ssl, _struct, _testing, _warnings, _weakref, array, binascii, bz2, cStringIO, cmath, cppyy, cpyext, crypt, errno, exceptions, fcntl, gc, imp, itertools, marshal, math, mmap, operator, parser, posix, pwd, pyexpat, pypyjit, select, signal, symbol, sys, termios, thread, time, token, unicodedata, zipimport, zlib

Supported, but written in pure Python:

  • cPickle, ctypes, datetime, dbm, _functools, grp, readline, resource, sqlite3, syslog

All modules that are pure python in CPython of course work.

Numpy support is not complete. We maintain our own fork of numpy for now, further instructions can be found at https://bitbucker.org/pypy/numpy.git.

Python libraries known to work under PyPy (the list is not exhaustive). A community maintained compatibility wiki is hosted on bitbucket:

  • ctypes
  • django
  • sqlalchemy
  • flask
  • twisted
  • pylons
  • divmod's nevow
  • pyglet
  • Pillow (the PIL fork)
  • lxml

The main difference that is not going to be fixed is that PyPy does not support refcounting semantics. The following code won't fill the file immediately, but only after a certain period of time, when the GC does a collection:

open("filename", "w").write("stuff")

The proper fix is

f = open("filename", "w")
f.write("stuff")
f.close()

or using the with keyword

with open("filename", "w") as f:
f.write("stuff")

Similarly, remember that you must close() a non-exhausted generator in order to have its pending finally or with clauses executed immediately:

def mygen():
with foo:
yield 42

for x in mygen():
if x == 42:
break # foo.__exit__ is not run immediately!

# fixed version:
gen = mygen()
try:
for x in gen:
if x == 42:
break
finally:
gen.close()

More generally, __del__() methods are not executed as predictively as on CPython: they run “some time later” in PyPy (or not at all if the program finishes running in the meantime). See more details here.

A more complete list of known differences is available at our dev site.