{"library":"pyftpdlib","title":"pyftpdlib","description":"pyftpdlib is a very fast, scalable, and asynchronous Python FTP server library. It provides a high-level portable interface to easily write efficient FTP servers, being the most complete RFC-959 FTP server implementation available for Python. It supports FTPS (RFC-4217), IPv6 (RFC-2428), Unicode filenames (RFC-2640), and virtual users. The library is currently at version 2.2.0 and actively maintained.","language":"python","status":"active","last_verified":"Sat May 16","install":{"commands":["pip install pyftpdlib"],"cli":{"name":"pyftpdlib","version":"sh: 1: pyftpdlib: not found"}},"imports":["from pyftpdlib.authorizers import DummyAuthorizer","from pyftpdlib.handlers import FTPHandler","from pyftpdlib.servers import FTPServer","from pyftpdlib.handlers import TLS_FTPHandler","from pyftpdlib.servers import ThreadedFTPServer"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport logging\nfrom pyftpdlib.authorizers import DummyAuthorizer\nfrom pyftpdlib.handlers import FTPHandler\nfrom pyftpdlib.servers import FTPServer\n\ndef main():\n    # Setup a dummy authorizer for managing virtual users\n    authorizer = DummyAuthorizer()\n\n    # Add a user with read/write permissions\n    ftp_user = os.environ.get('FTP_USER', 'user')\n    ftp_pass = os.environ.get('FTP_PASS', '12345')\n    home_dir = os.environ.get('FTP_HOME', os.getcwd())\n    authorizer.add_user(ftp_user, ftp_pass, home_dir, perm='elradfmwMT')\n\n    # Add an anonymous user with read-only permissions\n    authorizer.add_anonymous(home_dir)\n\n    # Instantiate FTP handler class\n    handler = FTPHandler\n    handler.authorizer = authorizer\n\n    # Define a customized banner\n    handler.banner = \"pyftpdlib based FTP server ready.\"\n\n    # Specify a masquerade address and the range of ports for passive connections\n    # Uncomment and configure if behind a NAT\n    # handler.masquerade_address = '151.25.42.11'\n    # handler.passive_ports = range(60000, 65535)\n\n    # Instantiate FTP server class and listen on all interfaces, port 2121\n    address = ('', 2121)\n    server = FTPServer(address, handler)\n\n    # Set limits for connections\n    server.max_cons = 256\n    server.max_cons_per_ip = 5\n\n    # Configure logging\n    logging.basicConfig(level=logging.INFO, format='%(levelname)s:%(name)s:%(message)s')\n\n    # Start ftp server\n    print(f\"Starting FTP server on {address[0] or '0.0.0.0'}:{address[1]} with user '{ftp_user}' and home '{home_dir}'\")\n    server.serve_forever()\n\nif __name__ == \"__main__\":\n    main()","lang":"python","description":"This quickstart sets up a basic FTP server with a virtual user (configurable via environment variables FTP_USER, FTP_PASS, FTP_HOME) and an anonymous read-only user. It listens on port 2121, sets connection limits, and configures basic logging. Remember to set `FTP_HOME` to a directory you wish to share, and `FTP_USER`/`FTP_PASS` for authenticated access.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-16","installed_version":"2.2.0","pypi_latest":"2.2.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.3,"avg_import_s":0.02,"wheel_type":"sdist"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":0.4,"disk_size":"18.4M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.01,"mem_mb":0.4,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.03,"mem_mb":0.4,"disk_size":"20.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.3,"import_time_s":0.02,"mem_mb":0.4,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":0.4,"disk_size":"12.4M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.02,"mem_mb":0.4,"disk_size":"13M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0,"mem_mb":0.4,"disk_size":"12.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3,"import_time_s":0,"mem_mb":0.2,"disk_size":"13M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.02,"mem_mb":0.4,"disk_size":"17.9M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyftpdlib","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3.7,"import_time_s":0.02,"mem_mb":0.4,"disk_size":"18M"}]}}