| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- import io
- import platform
- def patch_psutil():
- """WSL's /proc/meminfo has an inconsistency where it
- nondeterministically omits a space after colons (after "SwapFree:"
- in my case).
- psutil then splits on spaces and then parses the wrong field,
- crashing on the 'int(fields[1])' expression in
- psutil._pslinux.virtual_memory().
- Workaround: We ensure there is a space following each colon.
- """
- assert (
- platform.system() == "Linux"
- and "Microsoft".lower() in platform.release().lower()
- )
- try:
- import psutil._pslinux
- except ImportError:
- psutil = None
- psutil_open_binary = None
- if psutil:
- try:
- psutil_open_binary = psutil._pslinux.open_binary
- except AttributeError:
- pass
- # Only patch it if it doesn't seem to have been patched already
- if psutil_open_binary and psutil_open_binary.__name__ == "open_binary":
- def psutil_open_binary_patched(fname, *args, **kwargs):
- f = psutil_open_binary(fname, *args, **kwargs)
- if fname == "/proc/meminfo":
- with f:
- # Make sure there's a space after colons
- return io.BytesIO(f.read().replace(b":", b": "))
- return f
- psutil._pslinux.open_binary = psutil_open_binary_patched
|