Skip to main content
Downloads Github stars Github forks Contributors
Latest version Binary packages License
GH actions Documentation Status Twitter Follow

About

Python FTP server library provides a high-level portable interface to easily write very efficient, scalable and asynchronous FTP servers with Python. It is the most complete RFC-959 FTP server implementation available for the Python programming language.

Features

  • Extremely lightweight, fast and scalable (see why and benchmarks).

  • Uses sendfile(2) (see pysendfile) system call for uploads (Linux only).

  • Uses epoll() / kqueue() / select() to handle concurrency asynchronously.

  • …But can optionally skip to a multiple thread / process model (as in: you’ll be free to block or use slow filesystems).

  • Portable: entirely written in pure Python.

  • Supports FTPS (RFC-4217), IPv6 (RFC-2428), Unicode file names (RFC-2640), MLSD/MLST commands (RFC-3659).

  • Support for virtual users and virtual filesystem.

  • Flexible system of “authorizers” able to manage both “virtual” and “real” users on on both UNIX and Windows.

Performances

Despite being written in an interpreted language, pyftpdlib has transfer rates comparable or superior to common UNIX FTP servers written in C. It usually tends to scale better (see benchmarks) because whereas vsftpd and proftpd use multiple processes to achieve concurrency, pyftpdlib only uses one (see the C10K problem).

pyftpdlib vs. proftpd 1.3.4

benchmark type

pyftpdlib

proftpd

speedup

STOR (client -> server)

585.90 MB/sec

600.49 MB/sec

-0.02x

RETR (server -> client)

1652.72 MB/sec

1524.05 MB/sec

+0.08

300 concurrent clients (connect, login)

0.19 secs

9.98 secs

+51x

STOR (1 file with 300 idle clients)

585.59 MB/sec

518.55 MB/sec

+0.1x

RETR (1 file with 300 idle clients)

1497.58 MB/sec

1478.19 MB/sec

0x

300 concurrent clients (RETR 10M file)

3.41 secs

3.60 secs

+0.05x

300 concurrent clients (STOR 10M file)

8.60 secs

11.56 secs

+0.3x

300 concurrent clients (QUIT)

0.03 secs

0.39 secs

+12x

pyftpdlib vs. vsftpd 2.3.5

benchmark type

pyftpdlib

vsftpd

speedup

STOR (client -> server)

585.90 MB/sec

611.73 MB/sec

-0.04x

RETR (server -> client)

1652.72 MB/sec

1512.92 MB/sec

+0.09

300 concurrent clients (connect, login)

0.19 secs

20.39 secs

+106x

STOR (1 file with 300 idle clients)

585.59 MB/sec

610.23 MB/sec

-0.04x

RETR (1 file with 300 idle clients)

1497.58 MB/sec

1493.01 MB/sec

0x

300 concurrent clients (RETR 10M file)

3.41 secs

3.67 secs

+0.07x

300 concurrent clients (STOR 10M file)

8.60 secs

9.82 secs

+0.07x

300 concurrent clients (QUIT)

0.03 secs

0.01 secs

+0.14x

For more benchmarks see here.

Command line usage

Start an anonymous FTP server on port 2121:

$ python3 -m pyftpdlib
[I 2024-06-23 13:49:35] >>> starting FTP server on 0.0.0.0:2121, pid=763634 <<<

Same but with write permissions (useful to setup a quick and dirty file sharing server):

$ python3 -m pyftpdlib --write
[I 2024-06-23 13:49:35] >>> starting FTP server on 0.0.0.0:2121, pid=763641 <<<

Also see CLI doc for more command line examples.

API usage

>>> from pyftpdlib.authorizers import DummyAuthorizer
>>> from pyftpdlib.handlers import FTPHandler
>>> from pyftpdlib.servers import FTPServer
>>>
>>> authorizer = DummyAuthorizer()
>>> authorizer.add_user("user", "12345", "/home/giampaolo", perm="elradfmwMT")
>>> authorizer.add_anonymous("/home/nobody")
>>>
>>> handler = FTPHandler
>>> handler.authorizer = authorizer
>>>
>>> server = FTPServer(("127.0.0.1", 21), handler)
>>> server.serve_forever()
[I 13-02-19 10:55:42] >>> starting FTP server on 127.0.0.1:21 <<<
[I 13-02-19 10:55:42] poller: <class 'pyftpdlib.ioloop.Epoll'>
[I 13-02-19 10:55:42] masquerade (NAT) address: None
[I 13-02-19 10:55:42] passive ports: None
[I 13-02-19 10:55:42] use sendfile(2): True
[I 13-02-19 10:55:45] 127.0.0.1:34178-[] FTP session opened (connect)
[I 13-02-19 10:55:48] 127.0.0.1:34178-[user] USER 'user' logged in.
[I 13-02-19 10:56:27] 127.0.0.1:34179-[user] RETR /home/giampaolo/.vimrc completed=1 bytes=1700 seconds=0.001
[I 13-02-19 10:56:39] 127.0.0.1:34179-[user] FTP session closed (disconnect).

For other code samples read the tutorial

Donate

A lot of time and effort went into making pyftpdlib as it is right now. If you feel pyftpdlib is useful to you or your business and want to support its future development please consider donating me some money.

Release files for pyftpdlib 2.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyftpdlib 2.2.0
File Size Uploaded
pyftpdlib-2.2.0.tar.gz 189.2 kB Details

Release files / pyftpdlib-2.2.0.tar.gz

Download URL pyftpdlib-2.2.0.tar.gz
Size 189.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4ba0642078792df63dd3b2e9c8f838f2a3ecf428c7518d5921c0530d53512acf
BLAKE2b-256 checksum
How to use checksums
f9428751c5f58ae59b09e070da4fa322ae9693a340d2cc456b5a380b2c1ee47a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.3

Release history Release notifications | RSS feed

This release

2.2.0 This release

1 release file

2.1.0

1 release file

2.0.1

1 release file

2.0.0

1 release file

1.5.10

1 release file

1.5.9

1 release file

1.5.8

1 release file

1.5.7

1 release file

1.5.6

1 release file

1.5.5

1 release file

1.5.4

1 release file

1.5.3

1 release file

1.5.2

1 release file

1.5.1

1 release file

1.5.0

1 release file

1.4.0

1 release file

1.3.1

1 release file

1.3.0

1 release file

1.2.0

1 release file

1.1.0

1 release file

1.0.1

1 release file

1.0.0

1 release file

0.7.0

1 release file

0.6.0

1 release file

0.5.2

1 release file

0.5.1

1 release file

0.5.0

1 release file

0.4.0

1 release file

0.3.0

1 release file

0.2.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page