Skip to main content

Implementation of `select.poll` on Microsoft Windows.

Project description

Implementation of select.poll on Microsoft Windows.

  • Pure Python; no C extensions (uses ctypes.windll.Ws2_32)
  • Drop-in-compatible API
  • Clean "ponyfill"; library does no monkeypatching
  • Python 3.7+ compatible
  • No dependencies

Usage

Alternative to select.poll

try:
    from select import (
        POLLIN, POLLOUT, POLLERR, POLLHUP, POLLNVAL,
        poll
    )

except ImportError:
    # https://github.com/python/cpython/issues/60711
    from winpoll import (
        POLLIN, POLLOUT, POLLERR, POLLHUP, POLLNVAL,
        wsapoll as poll
    )
p = poll()

p.register(sock1, POLLIN)
p.register(sock2, POLLIN | POLLOUT)
p.unregister(sock1)

for fd, events in p.poll(3):
    print(f"<socket.socket fd={fd}> is ready with {events}")

Like select.poll, winpoll.wsapoll objects acquire no special resources, thus have no cleanup requirement (besides plain garbage collection).

Alternative to selectors.PollSelector/selectors.DefaultSelector

import sys
from selectors import (
    EVENT_READ, EVENT_WRITE,
    DefaultSelector, SelectSelector
)

if (DefaultSelector is SelectSelector) and (sys.platform == 'win32') and (sys.getwindowsversion() >= (10, 0, 19041)):
    # https://github.com/python/cpython/issues/60711
    from winpoll import WSAPollSelector as DefaultSelector
s = DefaultSelector()

s.register(sock1, EVENT_READ)
s.register(sock2, EVENT_READ | EVENT_WRITE)
s.unregister(sock1)

for (sock, _fd, _eventmask, _data), events in s.select(3):
    print(f"{sock} is ready with {events}")

Limitations / Bugs

  • Does not work before Windows Vista.

    • Last affected OS: Windows XP (EOL April 8, 2014; not supported by Python 3.7+ anyway.)
  • Outbound TCP connections don't correctly report failure-to-connect ((POLLHUP | POLLERR | POLLWRNORM)) before Windows 10 version 2004 ("May 2020 Update" / "20H1" / "OS Build 19041").

Installation

Command-line

pip install "winpoll ; sys_platform == 'win32'"

requirements.txt

...
winpoll ; sys_platform == 'win32'

setup.py

...

setup(
    ...,
    install_requires: [
        ...,
        "winpoll ; sys_platform == 'win32'"
    ]
)

pyproject.toml

[project]
...

dependencies = [
  ...,
  "winpoll ; sys_platform == 'win32'",
]

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

winpoll-0.20301.1.tar.gz (11.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

winpoll-0.20301.1-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file winpoll-0.20301.1.tar.gz.

File metadata

  • Download URL: winpoll-0.20301.1.tar.gz
  • Upload date:
  • Size: 11.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.9

File hashes

Hashes for winpoll-0.20301.1.tar.gz
Algorithm Hash digest
SHA256 baed012dcdbbd0602e8b7b6df061c6d91f17da9e7627308cfbf9d052bff48571
MD5 32106ffcb8739cba7e7855288fcc9312
BLAKE2b-256 de21542cabda0dd6b269eca4a24cab2106dc71886d7bb1334d58f8bafcd77d2b

See more details on using hashes here.

File details

Details for the file winpoll-0.20301.1-py3-none-any.whl.

File metadata

  • Download URL: winpoll-0.20301.1-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.9

File hashes

Hashes for winpoll-0.20301.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3486bf6626a833f32bc1117d3de4cbc05aa1971b5e793429d69e292250d0226f
MD5 55f31cbb35446cdbc492528de6a50ff5
BLAKE2b-256 68eacfe88582ac998e828f30738e7906e0ca17978cef7ee87968e2d912fa1f62

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page