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