{"library":"pyclamd","title":"pyClamd","description":"pyClamd provides a Pythonic interface to the ClamAV daemon (clamd), allowing applications to scan files and streams for viruses. Currently at version 0.4.0, it offers a robust way to integrate anti-malware scanning into Python projects, with releases occurring as needed for bug fixes or minor enhancements.","language":"python","status":"active","last_verified":"Mon May 18","install":{"commands":["pip install pyclamd"],"cli":null},"imports":["from pyclamd import ClamdAgnostic","from pyclamd import ClamdNetworkSocket","from pyclamd import ClamdUnixSocket"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import pyclamd\nimport os\n\n# Ensure Clamd daemon is running and accessible (e.g., via network or Unix socket)\n# For network socket: Host (default '127.0.0.1'), Port (default 3310)\n# For Unix socket: Socket path (default '/var/run/clamav/clamd.ctl')\n\nclamd_host = os.environ.get('CLAMD_HOST', '127.0.0.1')\nclamd_port = int(os.environ.get('CLAMD_PORT', '3310'))\nclamd_socket = os.environ.get('CLAMD_SOCKET', '/var/run/clamav/clamd.ctl') # Default for many Linux systems\n\ntry:\n    # Use ClamdAgnostic for automatic detection (Unix socket preferred if available)\n    # This will try UnixSocket first, then NetworkSocket\n    cd = pyclamd.ClamdAgnostic(\n        unix_socket=clamd_socket,\n        host=clamd_host,\n        port=clamd_port\n    )\n\n    # Ping the ClamAV daemon to check connectivity\n    cd.ping()\n    print(\"Successfully connected to ClamAV daemon.\")\n\n    # EICAR test string (standard antivirus test file)\n    eicar_string = b\"X5O!P%@AP[4\\\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*\"\n    \n    # Scan a stream of bytes\n    result_stream = cd.scan_stream(eicar_string)\n    print(f\"Scan stream result for EICAR: {result_stream}\")\n\n    # Create a dummy file for file scan\n    test_file_path = \"eicar_test.txt\"\n    with open(test_file_path, \"wb\") as f:\n        f.write(eicar_string)\n    \n    result_file = cd.scan_file(test_file_path)\n    print(f\"Scan file result for '{test_file_path}': {result_file}\")\n\n    if os.path.exists(test_file_path):\n        os.remove(test_file_path)\n\nexcept pyclamd.ClamdError as e:\n    print(f\"ClamAV daemon error: {e}\")\n    print(\"Please ensure the ClamAV daemon (clamd) is running and accessible.\")\n    print(f\"  Network: {clamd_host}:{clamd_port}\")\n    print(f\"  Unix Socket: {clamd_socket}\")\nexcept Exception as e:\n    print(f\"An unexpected error occurred: {e}\")","lang":"python","description":"This quickstart demonstrates how to connect to the ClamAV daemon using `ClamdAgnostic`, ping it to verify connectivity, and then scan both a byte stream and a temporary file containing the EICAR test string. It includes basic error handling for common connection issues.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-18","installed_version":"0.4.0","pypi_latest":"0.4.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":2.4,"avg_import_s":0.01,"wheel_type":"sdist"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.7,"disk_size":"19.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.01,"mem_mb":0.7,"disk_size":"20M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"21.6M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"22M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.4,"disk_size":"11.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":3,"import_time_s":0.01,"mem_mb":0.4,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.6,"disk_size":"11.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2.7,"import_time_s":0.01,"mem_mb":0.4,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.01,"mem_mb":0.4,"disk_size":"18.8M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyclamd","exit_code":0,"wheel_type":"sdist","failure_reason":null,"import_side_effects":"clean","install_time_s":2.3,"import_time_s":0.01,"mem_mb":0.7,"disk_size":"19M"}]}}