Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (
Help us improve Python packaging - Donate today!

Modem implementations for XMODEM, YMODEM and ZMODEM

Project Description

This package ports the XMODEM, YMODEM and ZMODEM protocols to Python. We try to implement the protocols as minimalistic as possible without breaking the protocol specifications.

The interface to most modem classes are pretty similair. Keep in mind though, that the XMODEM protocol can send one file (stream) at a time, whereas the YMODEM and ZMODEM protocols can send multiple.

All modem implementations must be given a getc callback to retrieve character data from the remote end and a putc callback to send character data.


An example using STDIN/STDOUT may read:

>>> import select
>>> import sys
>>> def getc(size, timeout=5):
...     r, w, e =[sys.stdin.fileno()], [], [], timeout)
...     if r: return
>>> def putc(data, timeout):
...     r, w, e =[], [sys.stdout.fileno()], [], timeout)
...     if w: return sys.stdout.write(data)

Now we can send a stream using XMODEM:

>>> from modem import XMODEM
>>> xmodem = XMODEM(getc, putc)
>>> stream = file(__file__)
>>> xmodem.send(stream)

Or send one or more files using YMODEM or ZMODEM:

>>> from modem import ZMODEM
>>> zmodem = ZMODEM(getc, putc)
>>> zmodem.send([__file__])


About the protocols:

XMODEM:© 1977 Ward Christensen
YMODEM:© 1985 Chunk Forsberg, Omen Technology Inc.
ZMODEM:© 1986 Chunk Forsberg, Omen Technology Inc.

Thanks to:

  • Paolo Perfetti, wrote most of the YMODEM implementation

Release History

This version
History Node


Supported By

Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Google Google Cloud Servers