From f5e3c8dff0ed53e6e874f80267a1358873bccf1d Mon Sep 17 00:00:00 2001 From: Zhengchen Tao Date: Thu, 7 May 2026 14:26:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=B9=E7=94=A8=20PyInstaller=20?= =?UTF-8?q?=E5=8D=95=20exe=20=E5=88=86=E5=8F=91=EF=BC=8C=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=20PortablePython=20=E5=86=85=E5=B5=8C=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 仓库不再内置 25MB+ 的 Python 运行时与依赖;改由 PyInstaller 在 CI 打成单 exe,内嵌 UAC manifest,双击自动请求管理员权限 - 新增 GitHub / Gitea Actions(推送 v* tag 或页面手动触发),自动构建并发布 release,附 release zip(exe + config.ini + README) - release body 由 workflow 抽取 CHANGELOG.md 对应版本段,并自动注入 UTC 构建日期;CHANGELOG 文件不再手填日期 - script.py 适配 PyInstaller 冻结模式:config.ini 从 exe 同目录读取,避免落入 _MEI 临时解压目录 - README 重写使用流程,强调本工具仅支持「按住开镜」模式,与「切换/按键开镜」不兼容 - 新增 requirements.txt 记录运行/构建依赖;.gitignore 排除 build/ dist/ release/ *.spec --- .gitea/workflows/release.yml | 79 + .github/workflows/release.yml | 81 + .gitignore | 6 + CHANGELOG.md | 22 + PortablePython/LICENSE.txt | 676 ----- .../psutil-7.0.0.dist-info/INSTALLER | 1 - .../psutil-7.0.0.dist-info/LICENSE | 29 - .../psutil-7.0.0.dist-info/METADATA | 551 ---- .../psutil-7.0.0.dist-info/RECORD | 64 - .../psutil-7.0.0.dist-info/REQUESTED | 0 .../psutil-7.0.0.dist-info/WHEEL | 5 - .../psutil-7.0.0.dist-info/top_level.txt | 1 - .../Lib/site-packages/psutil/__init__.py | 2407 ----------------- .../Lib/site-packages/psutil/_common.py | 950 ------- .../Lib/site-packages/psutil/_psaix.py | 565 ---- .../Lib/site-packages/psutil/_psbsd.py | 971 ------- .../Lib/site-packages/psutil/_pslinux.py | 2295 ---------------- .../Lib/site-packages/psutil/_psosx.py | 544 ---- .../Lib/site-packages/psutil/_psposix.py | 207 -- .../Lib/site-packages/psutil/_pssunos.py | 734 ----- .../site-packages/psutil/_psutil_windows.pyd | Bin 67072 -> 0 bytes .../Lib/site-packages/psutil/_pswindows.py | 1103 -------- .../site-packages/psutil/tests/__init__.py | 2025 -------------- .../site-packages/psutil/tests/__main__.py | 12 - .../site-packages/psutil/tests/test_aix.py | 142 - .../site-packages/psutil/tests/test_bsd.py | 593 ---- .../psutil/tests/test_connections.py | 566 ---- .../psutil/tests/test_contracts.py | 325 --- .../site-packages/psutil/tests/test_linux.py | 2292 ---------------- .../psutil/tests/test_memleaks.py | 487 ---- .../site-packages/psutil/tests/test_misc.py | 873 ------ .../site-packages/psutil/tests/test_osx.py | 197 -- .../site-packages/psutil/tests/test_posix.py | 488 ---- .../psutil/tests/test_process.py | 1667 ------------ .../psutil/tests/test_process_all.py | 535 ---- .../psutil/tests/test_scripts.py | 240 -- .../site-packages/psutil/tests/test_sunos.py | 39 - .../site-packages/psutil/tests/test_system.py | 979 ------- .../psutil/tests/test_testutils.py | 577 ---- .../psutil/tests/test_unicode.py | 313 --- .../psutil/tests/test_windows.py | 914 ------- .../pynput-1.8.1.dist-info/COPYING.LGPL | 165 -- .../pynput-1.8.1.dist-info/INSTALLER | 1 - .../pynput-1.8.1.dist-info/METADATA | 914 ------- .../pynput-1.8.1.dist-info/RECORD | 55 - .../pynput-1.8.1.dist-info/REQUESTED | 0 .../pynput-1.8.1.dist-info/WHEEL | 6 - .../pynput-1.8.1.dist-info/pbr.json | 1 - .../pynput-1.8.1.dist-info/top_level.txt | 1 - .../pynput-1.8.1.dist-info/zip-safe | 1 - .../Lib/site-packages/pynput/__init__.py | 41 - .../Lib/site-packages/pynput/_info.py | 19 - .../site-packages/pynput/_util/__init__.py | 489 ---- .../Lib/site-packages/pynput/_util/darwin.py | 302 --- .../site-packages/pynput/_util/darwin_vks.py | 79 - .../Lib/site-packages/pynput/_util/uinput.py | 99 - .../Lib/site-packages/pynput/_util/win32.py | 598 ---- .../site-packages/pynput/_util/win32_vks.py | 179 -- .../Lib/site-packages/pynput/_util/xorg.py | 496 ---- .../pynput/_util/xorg_keysyms.py | 1715 ------------ .../site-packages/pynput/keyboard/__init__.py | 249 -- .../site-packages/pynput/keyboard/_base.py | 754 ------ .../site-packages/pynput/keyboard/_darwin.py | 367 --- .../site-packages/pynput/keyboard/_dummy.py | 23 - .../site-packages/pynput/keyboard/_uinput.py | 446 --- .../site-packages/pynput/keyboard/_win32.py | 389 --- .../site-packages/pynput/keyboard/_xorg.py | 667 ----- .../site-packages/pynput/mouse/__init__.py | 107 - .../Lib/site-packages/pynput/mouse/_base.py | 281 -- .../Lib/site-packages/pynput/mouse/_darwin.py | 212 -- .../Lib/site-packages/pynput/mouse/_dummy.py | 22 - .../Lib/site-packages/pynput/mouse/_win32.py | 226 -- .../Lib/site-packages/pynput/mouse/_xorg.py | 184 -- .../six-1.17.0.dist-info/INSTALLER | 1 - .../six-1.17.0.dist-info/LICENSE | 18 - .../six-1.17.0.dist-info/METADATA | 43 - .../site-packages/six-1.17.0.dist-info/RECORD | 8 - .../site-packages/six-1.17.0.dist-info/WHEEL | 6 - .../six-1.17.0.dist-info/top_level.txt | 1 - PortablePython/Lib/site-packages/six.py | 1003 ------- PortablePython/_asyncio.pyd | Bin 77288 -> 0 bytes PortablePython/_bz2.pyd | Bin 86504 -> 0 bytes PortablePython/_ctypes.pyd | Bin 140632 -> 0 bytes PortablePython/_decimal.pyd | Bin 283992 -> 0 bytes PortablePython/_elementtree.pyd | Bin 137192 -> 0 bytes PortablePython/_hashlib.pyd | Bin 65000 -> 0 bytes PortablePython/_lzma.pyd | Bin 160232 -> 0 bytes PortablePython/_multiprocessing.pyd | Bin 37864 -> 0 bytes PortablePython/_overlapped.pyd | Bin 58200 -> 0 bytes PortablePython/_queue.pyd | Bin 35672 -> 0 bytes PortablePython/_remote_debugging.pyd | Bin 44376 -> 0 bytes PortablePython/_socket.pyd | Bin 87384 -> 0 bytes PortablePython/_sqlite3.pyd | Bin 132440 -> 0 bytes PortablePython/_ssl.pyd | Bin 183640 -> 0 bytes PortablePython/_uuid.pyd | Bin 28504 -> 0 bytes PortablePython/_wmi.pyd | Bin 40792 -> 0 bytes PortablePython/_zoneinfo.pyd | Bin 51544 -> 0 bytes PortablePython/_zstd.pyd | Bin 503640 -> 0 bytes PortablePython/libcrypto-3.dll | Bin 5231472 -> 0 bytes PortablePython/libffi-8.dll | Bin 39696 -> 0 bytes PortablePython/libssl-3.dll | Bin 794992 -> 0 bytes PortablePython/pyexpat.pyd | Bin 206312 -> 0 bytes PortablePython/python.cat | Bin 583106 -> 0 bytes PortablePython/python.exe | Bin 105448 -> 0 bytes PortablePython/python3.dll | Bin 73192 -> 0 bytes PortablePython/python314._pth | 5 - PortablePython/python314.dll | Bin 6703960 -> 0 bytes PortablePython/python314.zip | Bin 4043187 -> 0 bytes PortablePython/pythonw.exe | Bin 103912 -> 0 bytes PortablePython/select.pyd | Bin 32744 -> 0 bytes PortablePython/sqlite3.dll | Bin 1583592 -> 0 bytes PortablePython/unicodedata.pyd | Bin 757736 -> 0 bytes PortablePython/vcruntime140.dll | Bin 120400 -> 0 bytes PortablePython/vcruntime140_1.dll | Bin 49776 -> 0 bytes PortablePython/winsound.pyd | Bin 32984 -> 0 bytes README.md | 40 +- requirements.txt | 3 + run.bat | 7 - script.py | 8 +- 119 files changed, 231 insertions(+), 34555 deletions(-) create mode 100644 .gitea/workflows/release.yml create mode 100644 .github/workflows/release.yml create mode 100644 CHANGELOG.md delete mode 100644 PortablePython/LICENSE.txt delete mode 100644 PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/INSTALLER delete mode 100644 PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/LICENSE delete mode 100644 PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/METADATA delete mode 100644 PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/RECORD delete mode 100644 PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/REQUESTED delete mode 100644 PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/WHEEL delete mode 100644 PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/top_level.txt delete mode 100644 PortablePython/Lib/site-packages/psutil/__init__.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_common.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_psaix.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_psbsd.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_pslinux.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_psosx.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_psposix.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_pssunos.py delete mode 100644 PortablePython/Lib/site-packages/psutil/_psutil_windows.pyd delete mode 100644 PortablePython/Lib/site-packages/psutil/_pswindows.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/__init__.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/__main__.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_aix.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_bsd.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_connections.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_contracts.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_linux.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_memleaks.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_misc.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_osx.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_posix.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_process.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_process_all.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_scripts.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_sunos.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_system.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_testutils.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_unicode.py delete mode 100644 PortablePython/Lib/site-packages/psutil/tests/test_windows.py delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/COPYING.LGPL delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/INSTALLER delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/METADATA delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/RECORD delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/REQUESTED delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/WHEEL delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/pbr.json delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/top_level.txt delete mode 100644 PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/zip-safe delete mode 100644 PortablePython/Lib/site-packages/pynput/__init__.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_info.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/__init__.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/darwin.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/darwin_vks.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/uinput.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/win32.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/win32_vks.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/xorg.py delete mode 100644 PortablePython/Lib/site-packages/pynput/_util/xorg_keysyms.py delete mode 100644 PortablePython/Lib/site-packages/pynput/keyboard/__init__.py delete mode 100644 PortablePython/Lib/site-packages/pynput/keyboard/_base.py delete mode 100644 PortablePython/Lib/site-packages/pynput/keyboard/_darwin.py delete mode 100644 PortablePython/Lib/site-packages/pynput/keyboard/_dummy.py delete mode 100644 PortablePython/Lib/site-packages/pynput/keyboard/_uinput.py delete mode 100644 PortablePython/Lib/site-packages/pynput/keyboard/_win32.py delete mode 100644 PortablePython/Lib/site-packages/pynput/keyboard/_xorg.py delete mode 100644 PortablePython/Lib/site-packages/pynput/mouse/__init__.py delete mode 100644 PortablePython/Lib/site-packages/pynput/mouse/_base.py delete mode 100644 PortablePython/Lib/site-packages/pynput/mouse/_darwin.py delete mode 100644 PortablePython/Lib/site-packages/pynput/mouse/_dummy.py delete mode 100644 PortablePython/Lib/site-packages/pynput/mouse/_win32.py delete mode 100644 PortablePython/Lib/site-packages/pynput/mouse/_xorg.py delete mode 100644 PortablePython/Lib/site-packages/six-1.17.0.dist-info/INSTALLER delete mode 100644 PortablePython/Lib/site-packages/six-1.17.0.dist-info/LICENSE delete mode 100644 PortablePython/Lib/site-packages/six-1.17.0.dist-info/METADATA delete mode 100644 PortablePython/Lib/site-packages/six-1.17.0.dist-info/RECORD delete mode 100644 PortablePython/Lib/site-packages/six-1.17.0.dist-info/WHEEL delete mode 100644 PortablePython/Lib/site-packages/six-1.17.0.dist-info/top_level.txt delete mode 100644 PortablePython/Lib/site-packages/six.py delete mode 100644 PortablePython/_asyncio.pyd delete mode 100644 PortablePython/_bz2.pyd delete mode 100644 PortablePython/_ctypes.pyd delete mode 100644 PortablePython/_decimal.pyd delete mode 100644 PortablePython/_elementtree.pyd delete mode 100644 PortablePython/_hashlib.pyd delete mode 100644 PortablePython/_lzma.pyd delete mode 100644 PortablePython/_multiprocessing.pyd delete mode 100644 PortablePython/_overlapped.pyd delete mode 100644 PortablePython/_queue.pyd delete mode 100644 PortablePython/_remote_debugging.pyd delete mode 100644 PortablePython/_socket.pyd delete mode 100644 PortablePython/_sqlite3.pyd delete mode 100644 PortablePython/_ssl.pyd delete mode 100644 PortablePython/_uuid.pyd delete mode 100644 PortablePython/_wmi.pyd delete mode 100644 PortablePython/_zoneinfo.pyd delete mode 100644 PortablePython/_zstd.pyd delete mode 100644 PortablePython/libcrypto-3.dll delete mode 100644 PortablePython/libffi-8.dll delete mode 100644 PortablePython/libssl-3.dll delete mode 100644 PortablePython/pyexpat.pyd delete mode 100644 PortablePython/python.cat delete mode 100644 PortablePython/python.exe delete mode 100644 PortablePython/python3.dll delete mode 100644 PortablePython/python314._pth delete mode 100644 PortablePython/python314.dll delete mode 100644 PortablePython/python314.zip delete mode 100644 PortablePython/pythonw.exe delete mode 100644 PortablePython/select.pyd delete mode 100644 PortablePython/sqlite3.dll delete mode 100644 PortablePython/unicodedata.pyd delete mode 100644 PortablePython/vcruntime140.dll delete mode 100644 PortablePython/vcruntime140_1.dll delete mode 100644 PortablePython/winsound.pyd create mode 100644 requirements.txt delete mode 100644 run.bat diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..0a43cc5 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,79 @@ +name: release + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + tag: + description: 'Release tag, 例如 v0.1.0(会自动创建 tag 并发布 release)' + required: true + type: string + +jobs: + build: + # 需要一台带 Windows 的自托管 act_runner(Gitea 没有官方 hosted Windows runner) + # 默认按 act_runner 常见标签 windows-latest;按你的 runner 实际 label 调整 + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - name: Resolve release tag + shell: pwsh + run: | + if ($env:GITHUB_EVENT_NAME -eq 'workflow_dispatch') { + $t = '${{ inputs.tag }}' + } else { + $t = $env:GITHUB_REF_NAME + } + echo "RELEASE_TAG=$t" >> $env:GITHUB_ENV + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Build exe + run: pyinstaller --onefile --uac-admin --console --name df-scope-hold script.py + + - name: Package release zip + shell: pwsh + run: | + New-Item -ItemType Directory -Force -Path release | Out-Null + Copy-Item dist/df-scope-hold.exe release/ + Copy-Item config.ini release/ + Copy-Item README.md release/ + Compress-Archive -Path release/* -DestinationPath "df-scope-hold-$env:RELEASE_TAG.zip" -Force + echo "ASSET_ZIP=df-scope-hold-$env:RELEASE_TAG.zip" >> $env:GITHUB_ENV + + - name: Upload workflow artifact + uses: actions/upload-artifact@v3 + with: + name: df-scope-hold-${{ env.RELEASE_TAG }} + path: ${{ env.ASSET_ZIP }} + + - name: Extract release notes from CHANGELOG.md + shell: pwsh + run: | + $content = Get-Content CHANGELOG.md -Raw + $escaped = [regex]::Escape($env:RELEASE_TAG) + $pattern = "(?ms)^## \[$escaped\].*?(?=^## |\Z)" + $m = [regex]::Match($content, $pattern) + if ($m.Success) { + $body = ($m.Value -replace '^## .*\r?\n', '').Trim() + } else { + $body = "Release $env:RELEASE_TAG" + } + $date = [DateTime]::UtcNow.ToString('yyyy-MM-dd') + $body = "**发布日期**: $date (UTC)`n`n" + $body + Set-Content -Path release-notes.md -Value $body -Encoding utf8 + + - name: Create Gitea Release + uses: akkuman/gitea-release-action@v1 + with: + tag_name: ${{ env.RELEASE_TAG }} + files: ${{ env.ASSET_ZIP }} + body_path: release-notes.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..d71e204 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,81 @@ +name: release + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + tag: + description: 'Release tag, 例如 v0.1.0(会自动创建 tag 并发布 release)' + required: true + type: string + +permissions: + contents: write + +jobs: + build: + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + + - name: Resolve release tag + shell: pwsh + run: | + if ($env:GITHUB_EVENT_NAME -eq 'workflow_dispatch') { + $t = '${{ inputs.tag }}' + } else { + $t = $env:GITHUB_REF_NAME + } + echo "RELEASE_TAG=$t" >> $env:GITHUB_ENV + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + cache: pip + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Build exe + run: pyinstaller --onefile --uac-admin --console --name df-scope-hold script.py + + - name: Package release zip + shell: pwsh + run: | + New-Item -ItemType Directory -Force -Path release | Out-Null + Copy-Item dist/df-scope-hold.exe release/ + Copy-Item config.ini release/ + Copy-Item README.md release/ + Compress-Archive -Path release/* -DestinationPath "df-scope-hold-$env:RELEASE_TAG.zip" -Force + echo "ASSET_ZIP=df-scope-hold-$env:RELEASE_TAG.zip" >> $env:GITHUB_ENV + + - name: Upload workflow artifact + uses: actions/upload-artifact@v4 + with: + name: df-scope-hold-${{ env.RELEASE_TAG }} + path: ${{ env.ASSET_ZIP }} + + - name: Extract release notes from CHANGELOG.md + shell: pwsh + run: | + $content = Get-Content CHANGELOG.md -Raw + $escaped = [regex]::Escape($env:RELEASE_TAG) + $pattern = "(?ms)^## \[$escaped\].*?(?=^## |\Z)" + $m = [regex]::Match($content, $pattern) + if ($m.Success) { + $body = ($m.Value -replace '^## .*\r?\n', '').Trim() + } else { + $body = "Release $env:RELEASE_TAG" + } + $date = [DateTime]::UtcNow.ToString('yyyy-MM-dd') + $body = "**发布日期**: $date (UTC)`n`n" + $body + Set-Content -Path release-notes.md -Value $body -Encoding utf8 + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.RELEASE_TAG }} + files: ${{ env.ASSET_ZIP }} + body_path: release-notes.md diff --git a/.gitignore b/.gitignore index 3bbe7b6..56f453a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,9 @@ __pycache__/ *.pyc *.pyo + +# PyInstaller build artifacts +build/ +dist/ +release/ +*.spec diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..002ee35 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,22 @@ +# Changelog + +本项目所有重要变更记录于此文件。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。 + +> 发布日期由 release workflow 在构建时自动注入到 GitHub/Gitea Release 页面,本文件版本标题不再手填日期。 + +## [Unreleased] + +## [v0.1.0] + +首个正式发布版本。 + +### Added +- 监听鼠标右键按下/松开,自动模拟绑定的"屏息"键(默认 `F12`) +- 进程门控:仅在目标游戏进程运行时激活监听,游戏关闭自动停止,重启自动恢复 +- `config.ini` 配置文件,可自定义按键、按键延迟(毫秒)、目标进程名 +- Windows 单 exe 分发,内嵌 UAC manifest,双击自动请求管理员权限 +- GitHub / Gitea Actions 自动构建并发布 release zip(含 exe + 默认 config.ini) + +### Notes +- 游戏客户端通常以管理员权限运行,本工具必须以同等权限运行才能检测到游戏进程 +- 仅在 Windows 上验证(三角洲行动客户端为 Windows 独占) diff --git a/PortablePython/LICENSE.txt b/PortablePython/LICENSE.txt deleted file mode 100644 index 4059c16..0000000 --- a/PortablePython/LICENSE.txt +++ /dev/null @@ -1,676 +0,0 @@ -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see https://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see https://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations, which became -Zope Corporation. In 2001, the Python Software Foundation (PSF, see -https://www.python.org/psf/) was formed, a non-profit organization -created specifically to own Python-related Intellectual Property. -Zope Corporation was a sponsoring member of the PSF. - -All Python releases are Open Source (see https://opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2 and above 2.1.1 2001-now PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -Python software and documentation are licensed under the -Python Software Foundation License Version 2. - -Starting with Python 3.8.6, examples, recipes, and other code in -the documentation are dual licensed under the PSF License Version 2 -and the Zero-Clause BSD license. - -Some software incorporated into Python is under different licenses. -The licenses are listed with code falling under that license. - - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001 Python Software Foundation; All Rights Reserved" -are retained in Python alone or in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -ZERO-CLAUSE BSD LICENSE FOR CODE IN THE PYTHON DOCUMENTATION ----------------------------------------------------------------------- - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. - - - -Additional Conditions for this Windows binary build ---------------------------------------------------- - -This program is linked with and uses Microsoft Distributable Code, -copyrighted by Microsoft Corporation. The Microsoft Distributable Code -is embedded in each .exe, .dll and .pyd file as a result of running -the code through a linker. - -If you further distribute programs that include the Microsoft -Distributable Code, you must comply with the restrictions on -distribution specified by Microsoft. In particular, you must require -distributors and external end users to agree to terms that protect the -Microsoft Distributable Code at least as much as Microsoft's own -requirements for the Distributable Code. See Microsoft's documentation -(included in its developer tools and on its website at microsoft.com) -for specific details. - -Redistribution of the Windows binary build of the Python interpreter -complies with this agreement, provided that you do not: - -- alter any copyright, trademark or patent notice in Microsoft's -Distributable Code; - -- use Microsoft's trademarks in your programs' names or in a way that -suggests your programs come from or are endorsed by Microsoft; - -- distribute Microsoft's Distributable Code to run on a platform other -than Microsoft operating systems, run-time technologies or application -platforms; or - -- include Microsoft Distributable Code in malicious, deceptive or -unlawful programs. - -These restrictions apply only to the Microsoft Distributable Code as -defined above, not to Python itself or any programs running on the -Python interpreter. The redistribution of the Python interpreter and -libraries is governed by the Python Software License included with this -file, or by other licenses as marked. - - - --------------------------------------------------------------------------- - -This program, "bzip2", the associated library "libbzip2", and all -documentation, are copyright (C) 1996-2019 Julian R Seward. All -rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. The origin of this software must not be misrepresented; you must - not claim that you wrote the original software. If you use this - software in a product, an acknowledgment in the product - documentation would be appreciated but is not required. - -3. Altered source versions must be plainly marked as such, and must - not be misrepresented as being the original software. - -4. The name of the author may not be used to endorse or promote - products derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE -GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Julian Seward, jseward@acm.org -bzip2/libbzip2 version 1.0.8 of 13 July 2019 - --------------------------------------------------------------------------- - -libffi - Copyright (c) 1996-2022 Anthony Green, Red Hat, Inc and others. -See source files for details. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -``Software''), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -BSD License - -For Zstandard software - -Copyright (c) Meta Platforms, Inc. and affiliates. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook, nor Meta, nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - -This software is copyrighted by the Regents of the University of -California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState -Corporation and other parties. The following terms apply to all files -associated with the software unless explicitly disclaimed in -individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, provided -that existing copyright notices are retained in all copies and that this -notice is included verbatim in any distributions. No written agreement, -license, or royalty fee is required for any of the authorized uses. -Modifications to this software may be copyrighted by their authors -and need not follow the licensing terms described here, provided that -the new terms are clearly indicated on the first page of each file where -they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -MODIFICATIONS. - -GOVERNMENT USE: If you are acquiring this software on behalf of the -U.S. government, the Government shall have only "Restricted Rights" -in the software and related documentation as defined in the Federal -Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -are acquiring the software on behalf of the Department of Defense, the -software shall be classified as "Commercial Computer Software" and the -Government shall have only "Restricted Rights" as defined in Clause -252.227-7014 (b) (3) of DFARs. Notwithstanding the foregoing, the -authors grant the U.S. Government and others acting in its behalf -permission to use and distribute the software in accordance with the -terms specified in this license. - -This software is copyrighted by the Regents of the University of -California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState -Corporation, Apple Inc. and other parties. The following terms apply to -all files associated with the software unless explicitly disclaimed in -individual files. - -The authors hereby grant permission to use, copy, modify, distribute, -and license this software and its documentation for any purpose, provided -that existing copyright notices are retained in all copies and that this -notice is included verbatim in any distributions. No written agreement, -license, or royalty fee is required for any of the authorized uses. -Modifications to this software may be copyrighted by their authors -and need not follow the licensing terms described here, provided that -the new terms are clearly indicated on the first page of each file where -they apply. - -IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -MODIFICATIONS. - -GOVERNMENT USE: If you are acquiring this software on behalf of the -U.S. government, the Government shall have only "Restricted Rights" -in the software and related documentation as defined in the Federal -Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -are acquiring the software on behalf of the Department of Defense, the -software shall be classified as "Commercial Computer Software" and the -Government shall have only "Restricted Rights" as defined in Clause -252.227-7013 (b) (3) of DFARs. Notwithstanding the foregoing, the -authors grant the U.S. Government and others acting in its behalf -permission to use and distribute the software in accordance with the -terms specified in this license. - diff --git a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/INSTALLER b/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/LICENSE b/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/LICENSE deleted file mode 100644 index cff5eb7..0000000 --- a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of the psutil authors nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/METADATA b/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/METADATA deleted file mode 100644 index e689c06..0000000 --- a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/METADATA +++ /dev/null @@ -1,551 +0,0 @@ -Metadata-Version: 2.1 -Name: psutil -Version: 7.0.0 -Summary: Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. -Home-page: https://github.com/giampaolo/psutil -Author: Giampaolo Rodola -Author-email: g.rodola@gmail.com -License: BSD-3-Clause -Keywords: ps,top,kill,free,lsof,netstat,nice,tty,ionice,uptime,taskmgr,process,df,iotop,iostat,ifconfig,taskset,who,pidof,pmap,smem,pstree,monitoring,ulimit,prlimit,smem,performance,metrics,agent,observability -Platform: Platform Independent -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Environment :: Win32 (MS Windows) -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Information Technology -Classifier: Intended Audience :: System Administrators -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows :: Windows 10 -Classifier: Operating System :: Microsoft :: Windows :: Windows 7 -Classifier: Operating System :: Microsoft :: Windows :: Windows 8 -Classifier: Operating System :: Microsoft :: Windows :: Windows 8.1 -Classifier: Operating System :: Microsoft :: Windows :: Windows Server 2003 -Classifier: Operating System :: Microsoft :: Windows :: Windows Server 2008 -Classifier: Operating System :: Microsoft :: Windows :: Windows Vista -Classifier: Operating System :: Microsoft -Classifier: Operating System :: OS Independent -Classifier: Operating System :: POSIX :: AIX -Classifier: Operating System :: POSIX :: BSD :: FreeBSD -Classifier: Operating System :: POSIX :: BSD :: NetBSD -Classifier: Operating System :: POSIX :: BSD :: OpenBSD -Classifier: Operating System :: POSIX :: BSD -Classifier: Operating System :: POSIX :: Linux -Classifier: Operating System :: POSIX :: SunOS/Solaris -Classifier: Operating System :: POSIX -Classifier: Programming Language :: C -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: Python -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: System :: Benchmark -Classifier: Topic :: System :: Hardware :: Hardware Drivers -Classifier: Topic :: System :: Hardware -Classifier: Topic :: System :: Monitoring -Classifier: Topic :: System :: Networking :: Monitoring :: Hardware Watchdog -Classifier: Topic :: System :: Networking :: Monitoring -Classifier: Topic :: System :: Networking -Classifier: Topic :: System :: Operating System -Classifier: Topic :: System :: Systems Administration -Classifier: Topic :: Utilities -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE -Provides-Extra: dev -Requires-Dist: pytest ; extra == 'dev' -Requires-Dist: pytest-xdist ; extra == 'dev' -Requires-Dist: setuptools ; extra == 'dev' -Requires-Dist: pywin32 ; extra == 'dev' -Requires-Dist: wheel ; extra == 'dev' -Requires-Dist: wmi ; extra == 'dev' -Requires-Dist: abi3audit ; extra == 'dev' -Requires-Dist: black ==24.10.0 ; extra == 'dev' -Requires-Dist: check-manifest ; extra == 'dev' -Requires-Dist: coverage ; extra == 'dev' -Requires-Dist: packaging ; extra == 'dev' -Requires-Dist: pylint ; extra == 'dev' -Requires-Dist: pyperf ; extra == 'dev' -Requires-Dist: pypinfo ; extra == 'dev' -Requires-Dist: pytest-cov ; extra == 'dev' -Requires-Dist: requests ; extra == 'dev' -Requires-Dist: rstcheck ; extra == 'dev' -Requires-Dist: ruff ; extra == 'dev' -Requires-Dist: sphinx ; extra == 'dev' -Requires-Dist: sphinx-rtd-theme ; extra == 'dev' -Requires-Dist: toml-sort ; extra == 'dev' -Requires-Dist: twine ; extra == 'dev' -Requires-Dist: virtualenv ; extra == 'dev' -Requires-Dist: vulture ; extra == 'dev' -Requires-Dist: pyreadline ; extra == 'dev' -Requires-Dist: pdbpp ; extra == 'dev' -Provides-Extra: test -Requires-Dist: pytest ; extra == 'test' -Requires-Dist: pytest-xdist ; extra == 'test' -Requires-Dist: setuptools ; extra == 'test' -Requires-Dist: pywin32 ; extra == 'test' -Requires-Dist: wheel ; extra == 'test' -Requires-Dist: wmi ; extra == 'test' - -| |downloads| |stars| |forks| |contributors| |coverage| -| |version| |py-versions| |packages| |license| -| |github-actions-wheels| |github-actions-bsd| |doc| |twitter| |tidelift| - -.. |downloads| image:: https://img.shields.io/pypi/dm/psutil.svg - :target: https://pepy.tech/project/psutil - :alt: Downloads - -.. |stars| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg - :target: https://github.com/giampaolo/psutil/stargazers - :alt: Github stars - -.. |forks| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg - :target: https://github.com/giampaolo/psutil/network/members - :alt: Github forks - -.. |contributors| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg - :target: https://github.com/giampaolo/psutil/graphs/contributors - :alt: Contributors - -.. |github-actions-wheels| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/build.yml.svg?label=Linux%2C%20macOS%2C%20Windows - :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Abuild - :alt: Linux, macOS, Windows - -.. |github-actions-bsd| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/bsd.yml.svg?label=FreeBSD,%20NetBSD,%20OpenBSD - :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Absd-tests - :alt: FreeBSD, NetBSD, OpenBSD - -.. |coverage| image:: https://coveralls.io/repos/github/giampaolo/psutil/badge.svg?branch=master - :target: https://coveralls.io/github/giampaolo/psutil?branch=master - :alt: Test coverage (coverall.io) - -.. |doc| image:: https://readthedocs.org/projects/psutil/badge/?version=latest - :target: https://psutil.readthedocs.io/en/latest/ - :alt: Documentation Status - -.. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi - :target: https://pypi.org/project/psutil - :alt: Latest version - -.. |py-versions| image:: https://img.shields.io/pypi/pyversions/psutil.svg - :alt: Supported Python versions - -.. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg - :target: https://repology.org/metapackage/python:psutil/versions - :alt: Binary packages - -.. |license| image:: https://img.shields.io/pypi/l/psutil.svg - :target: https://github.com/giampaolo/psutil/blob/master/LICENSE - :alt: License - -.. |twitter| image:: https://img.shields.io/twitter/follow/grodola.svg?label=follow&style=flat&logo=twitter&logoColor=4FADFF - :target: https://twitter.com/grodola - :alt: Twitter Follow - -.. |tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat - :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme - :alt: Tidelift - ------ - -Quick links -=========== - -- `Home page `_ -- `Install `_ -- `Documentation `_ -- `Download `_ -- `Forum `_ -- `StackOverflow `_ -- `Blog `_ -- `What's new `_ - - -Summary -======= - -psutil (process and system utilities) is a cross-platform library for -retrieving information on **running processes** and **system utilization** -(CPU, memory, disks, network, sensors) in Python. -It is useful mainly for **system monitoring**, **profiling and limiting process -resources** and **management of running processes**. -It implements many functionalities offered by classic UNIX command line tools -such as *ps, top, iotop, lsof, netstat, ifconfig, free* and others. -psutil currently supports the following platforms: - -- **Linux** -- **Windows** -- **macOS** -- **FreeBSD, OpenBSD**, **NetBSD** -- **Sun Solaris** -- **AIX** - -Supported Python versions are cPython 3.6+ and `PyPy `__. -Latest psutil version supporting Python 2.7 is -`psutil 6.1.1 `__. - -Funding -======= - -While psutil is free software and will always be, the project would benefit -immensely from some funding. -Keeping up with bug reports and maintenance has become hardly sustainable for -me alone in terms of time. -If you're a company that's making significant use of psutil you can consider -becoming a sponsor via `GitHub Sponsors `__, -`Open Collective `__ or -`PayPal `__ -and have your logo displayed in here and psutil `doc `__. - -Sponsors -======== - -.. image:: https://github.com/giampaolo/psutil/raw/master/docs/_static/tidelift-logo.png - :width: 200 - :alt: Alternative text - -`Add your logo `__. - -Example usages -============== - -This represents pretty much the whole psutil API. - -CPU ---- - -.. code-block:: python - - >>> import psutil - >>> - >>> psutil.cpu_times() - scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, guest_nice=0.0) - >>> - >>> for x in range(3): - ... psutil.cpu_percent(interval=1) - ... - 4.0 - 5.9 - 3.8 - >>> - >>> for x in range(3): - ... psutil.cpu_percent(interval=1, percpu=True) - ... - [4.0, 6.9, 3.7, 9.2] - [7.0, 8.5, 2.4, 2.1] - [1.2, 9.0, 9.9, 7.2] - >>> - >>> for x in range(3): - ... psutil.cpu_times_percent(interval=1, percpu=False) - ... - scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) - scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) - scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) - >>> - >>> psutil.cpu_count() - 4 - >>> psutil.cpu_count(logical=False) - 2 - >>> - >>> psutil.cpu_stats() - scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0) - >>> - >>> psutil.cpu_freq() - scpufreq(current=931.42925, min=800.0, max=3500.0) - >>> - >>> psutil.getloadavg() # also on Windows (emulated) - (3.14, 3.89, 4.67) - -Memory ------- - -.. code-block:: python - - >>> psutil.virtual_memory() - svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304) - >>> psutil.swap_memory() - sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944) - >>> - -Disks ------ - -.. code-block:: python - - >>> psutil.disk_partitions() - [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'), - sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext', opts='rw')] - >>> - >>> psutil.disk_usage('/') - sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5) - >>> - >>> psutil.disk_io_counters(perdisk=False) - sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412) - >>> - -Network -------- - -.. code-block:: python - - >>> psutil.net_io_counters(pernic=True) - {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0), - 'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)} - >>> - >>> psutil.net_connections(kind='tcp') - [sconn(fd=115, family=, type=, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254), - sconn(fd=117, family=, type=, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987), - ...] - >>> - >>> psutil.net_if_addrs() - {'lo': [snicaddr(family=, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None), - snicaddr(family=, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None), - snicaddr(family=, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)], - 'wlan0': [snicaddr(family=, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None), - snicaddr(family=, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None), - snicaddr(family=, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]} - >>> - >>> psutil.net_if_stats() - {'lo': snicstats(isup=True, duplex=, speed=0, mtu=65536, flags='up,loopback,running'), - 'wlan0': snicstats(isup=True, duplex=, speed=100, mtu=1500, flags='up,broadcast,running,multicast')} - >>> - -Sensors -------- - -.. code-block:: python - - >>> import psutil - >>> psutil.sensors_temperatures() - {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)], - 'asus': [shwtemp(label='', current=47.0, high=None, critical=None)], - 'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0), - shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]} - >>> - >>> psutil.sensors_fans() - {'asus': [sfan(label='cpu_fan', current=3200)]} - >>> - >>> psutil.sensors_battery() - sbattery(percent=93, secsleft=16628, power_plugged=False) - >>> - -Other system info ------------------ - -.. code-block:: python - - >>> import psutil - >>> psutil.users() - [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352), - suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)] - >>> - >>> psutil.boot_time() - 1365519115.0 - >>> - -Process management ------------------- - -.. code-block:: python - - >>> import psutil - >>> psutil.pids() - [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215, - 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932, - 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311, - 4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433, - 4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054, - 7055, 7071] - >>> - >>> p = psutil.Process(7055) - >>> p - psutil.Process(pid=7055, name='python3', status='running', started='09:04:44') - >>> p.pid - 7055 - >>> p.name() - 'python3' - >>> p.exe() - '/usr/bin/python3' - >>> p.cwd() - '/home/giampaolo' - >>> p.cmdline() - ['/usr/bin/python3', 'main.py'] - >>> - >>> p.ppid() - 7054 - >>> p.parent() - psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44') - >>> p.parents() - [psutil.Process(pid=4699, name='bash', started='09:06:44'), - psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'), - psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')] - >>> p.children(recursive=True) - [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'), - psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')] - >>> - >>> p.status() - 'running' - >>> p.create_time() - 1267551141.5019531 - >>> p.terminal() - '/dev/pts/0' - >>> - >>> p.username() - 'giampaolo' - >>> p.uids() - puids(real=1000, effective=1000, saved=1000) - >>> p.gids() - pgids(real=1000, effective=1000, saved=1000) - >>> - >>> p.cpu_times() - pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0) - >>> p.cpu_percent(interval=1.0) - 12.1 - >>> p.cpu_affinity() - [0, 1, 2, 3] - >>> p.cpu_affinity([0, 1]) # set - >>> p.cpu_num() - 1 - >>> - >>> p.memory_info() - pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0) - >>> p.memory_full_info() # "real" USS memory usage (Linux, macOS, Win only) - pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0) - >>> p.memory_percent() - 0.7823 - >>> p.memory_maps() - [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0), - pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0), - pmmap_grouped(path='[heap]', rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0), - pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0), - ...] - >>> - >>> p.io_counters() - pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543) - >>> - >>> p.open_files() - [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768), - popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)] - >>> - >>> p.net_connections(kind='tcp') - [pconn(fd=115, family=, type=, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'), - pconn(fd=117, family=, type=, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')] - >>> - >>> p.threads() - [pthread(id=5234, user_time=22.5, system_time=9.2891), - pthread(id=5237, user_time=0.0707, system_time=1.1)] - >>> - >>> p.num_threads() - 4 - >>> p.num_fds() - 8 - >>> p.num_ctx_switches() - pctxsw(voluntary=78, involuntary=19) - >>> - >>> p.nice() - 0 - >>> p.nice(10) # set - >>> - >>> p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO priority (Win and Linux only) - >>> p.ionice() - pionice(ioclass=, value=0) - >>> - >>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # set resource limits (Linux only) - >>> p.rlimit(psutil.RLIMIT_NOFILE) - (5, 5) - >>> - >>> p.environ() - {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto', - 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg', - ...} - >>> - >>> p.as_dict() - {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...} - >>> p.is_running() - True - >>> p.suspend() - >>> p.resume() - >>> - >>> p.terminate() - >>> p.kill() - >>> p.wait(timeout=3) - - >>> - >>> psutil.test() - USER PID %CPU %MEM VSZ RSS TTY START TIME COMMAND - root 1 0.0 0.0 24584 2240 Jun17 00:00 init - root 2 0.0 0.0 0 0 Jun17 00:00 kthreadd - ... - giampaolo 31475 0.0 0.0 20760 3024 /dev/pts/0 Jun19 00:00 python2.4 - giampaolo 31721 0.0 2.2 773060 181896 00:04 10:30 chrome - root 31763 0.0 0.0 0 0 00:05 00:00 kworker/0:1 - >>> - -Further process APIs --------------------- - -.. code-block:: python - - >>> import psutil - >>> for proc in psutil.process_iter(['pid', 'name']): - ... print(proc.info) - ... - {'pid': 1, 'name': 'systemd'} - {'pid': 2, 'name': 'kthreadd'} - {'pid': 3, 'name': 'ksoftirqd/0'} - ... - >>> - >>> psutil.pid_exists(3) - True - >>> - >>> def on_terminate(proc): - ... print("process {} terminated".format(proc)) - ... - >>> # waits for multiple processes to terminate - >>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate) - >>> - -Windows services ----------------- - -.. code-block:: python - - >>> list(psutil.win_service_iter()) - [, - , - , - , - ...] - >>> s = psutil.win_service_get('alg') - >>> s.as_dict() - {'binpath': 'C:\\Windows\\System32\\alg.exe', - 'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing', - 'display_name': 'Application Layer Gateway Service', - 'name': 'alg', - 'pid': None, - 'start_type': 'manual', - 'status': 'stopped', - 'username': 'NT AUTHORITY\\LocalService'} - -Projects using psutil -===================== - -Here's some I find particularly interesting: - -- https://github.com/google/grr -- https://github.com/facebook/osquery/ -- https://github.com/nicolargo/glances -- https://github.com/aristocratos/bpytop -- https://github.com/Jahaja/psdash -- https://github.com/ajenti/ajenti -- https://github.com/home-assistant/home-assistant/ - -Portings -======== - -- Go: https://github.com/shirou/gopsutil -- C: https://github.com/hamon-in/cpslib -- Rust: https://github.com/rust-psutil/rust-psutil -- Nim: https://github.com/johnscillieri/psutil-nim - diff --git a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/RECORD b/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/RECORD deleted file mode 100644 index 294bafc..0000000 --- a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/RECORD +++ /dev/null @@ -1,64 +0,0 @@ -psutil-7.0.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -psutil-7.0.0.dist-info/LICENSE,sha256=x63E1dEzelSLlnQh8fviWLkwM6BBdwj9b044-Oy864A,1577 -psutil-7.0.0.dist-info/METADATA,sha256=jEGY38opff7gdO5GOUIH8xeWXCXcGvitOIYrlUeVp8E,23136 -psutil-7.0.0.dist-info/RECORD,, -psutil-7.0.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -psutil-7.0.0.dist-info/WHEEL,sha256=-EX5DQzNGQEoyL99Q-0P0-D-CXbfqafenaAeiSQ_Ufk,100 -psutil-7.0.0.dist-info/top_level.txt,sha256=gCNhn57wzksDjSAISmgMJ0aiXzQulk0GJhb2-BAyYgw,7 -psutil/__init__.py,sha256=lvZWdYQ3W0flcZeW1vbN5QgoSHuqofXBnMxHZLzwgrU,89075 -psutil/__pycache__/__init__.cpython-313.pyc,, -psutil/__pycache__/_common.cpython-313.pyc,, -psutil/__pycache__/_psaix.cpython-313.pyc,, -psutil/__pycache__/_psbsd.cpython-313.pyc,, -psutil/__pycache__/_pslinux.cpython-313.pyc,, -psutil/__pycache__/_psosx.cpython-313.pyc,, -psutil/__pycache__/_psposix.cpython-313.pyc,, -psutil/__pycache__/_pssunos.cpython-313.pyc,, -psutil/__pycache__/_pswindows.cpython-313.pyc,, -psutil/_common.py,sha256=tPE7YVzC0ZIBhZzYdzqOFnh-geJVALbyBY3TSAwASXw,29592 -psutil/_psaix.py,sha256=CFBLwUi8DR5KsDC0yCs0jlLtLf2dhhyGArAhG_udqK8,18817 -psutil/_psbsd.py,sha256=UXd-QXUVk_H_wbFHWt2vshcChWxBrPwn38PX0HeYXfo,32727 -psutil/_pslinux.py,sha256=wKT1c3HX8XhnZ8sDNX1hiKRbVj7p53ASJ6VaniKaxs4,88323 -psutil/_psosx.py,sha256=LwFP6AtKp2hzNWRSaSLaWHB6nh1CiKSMu_KvP5009IE,16421 -psutil/_psposix.py,sha256=AJxyaRPf1h8dyT9rnsF8c-psHwXEbKqaNEt3OOm4Zuk,7349 -psutil/_pssunos.py,sha256=B58FY4JjbfndrdmbEV7QGX6lVi0v--V-g_Hxsg958MM,25654 -psutil/_psutil_windows.pyd,sha256=nH_IVdnRYU5wcFx9zG9Kw83Kta3-tqZ9OC9a3gnq3BU,67072 -psutil/_pswindows.py,sha256=is_Cq3yMuFnqGUfpOeiU8oWzZQNWmK_-Xt7asb8YCu4,37052 -psutil/tests/__init__.py,sha256=tFfa1RqnPJP9UuVe-JN7sAavHVoHlmqiN0pyk3I4KI0,66129 -psutil/tests/__main__.py,sha256=AQDwErrSFPsBGSY5wIKmh7LziqWTAARYKEqz_zrXMTc,321 -psutil/tests/__pycache__/__init__.cpython-313.pyc,, -psutil/tests/__pycache__/__main__.cpython-313.pyc,, -psutil/tests/__pycache__/test_aix.cpython-313.pyc,, -psutil/tests/__pycache__/test_bsd.cpython-313.pyc,, -psutil/tests/__pycache__/test_connections.cpython-313.pyc,, -psutil/tests/__pycache__/test_contracts.cpython-313.pyc,, -psutil/tests/__pycache__/test_linux.cpython-313.pyc,, -psutil/tests/__pycache__/test_memleaks.cpython-313.pyc,, -psutil/tests/__pycache__/test_misc.cpython-313.pyc,, -psutil/tests/__pycache__/test_osx.cpython-313.pyc,, -psutil/tests/__pycache__/test_posix.cpython-313.pyc,, -psutil/tests/__pycache__/test_process.cpython-313.pyc,, -psutil/tests/__pycache__/test_process_all.cpython-313.pyc,, -psutil/tests/__pycache__/test_scripts.cpython-313.pyc,, -psutil/tests/__pycache__/test_sunos.cpython-313.pyc,, -psutil/tests/__pycache__/test_system.cpython-313.pyc,, -psutil/tests/__pycache__/test_testutils.cpython-313.pyc,, -psutil/tests/__pycache__/test_unicode.cpython-313.pyc,, -psutil/tests/__pycache__/test_windows.cpython-313.pyc,, -psutil/tests/test_aix.py,sha256=M84ZfM1EeSDRyzrf404JGu5zy_ErRn5MK3t3yT11lz0,4550 -psutil/tests/test_bsd.py,sha256=GRbzguegV7K2m-O4dQJlUJGh7M7UH9fI8jvE2UjFOks,20784 -psutil/tests/test_connections.py,sha256=1D4HEQl_bZfZbk_4g-hc4rnrDqUD7q42rb9aIoJ1Amc,21723 -psutil/tests/test_contracts.py,sha256=8enorS1KmOftKyC4XTINXtnWNnmh18qFEYdLHKtrknY,12326 -psutil/tests/test_linux.py,sha256=Gap-GA6Bv9TfKbRupph49NwZC0vjv1V5isa5l-Eg3VY,91187 -psutil/tests/test_memleaks.py,sha256=yGEhTOOllW2NV-R2S5lybD2S8iO9CiS7--ND2E9rZTY,15608 -psutil/tests/test_misc.py,sha256=eQUmQqnh7nM0aIND_yOtgO4-Lwyspw3tgt3aWje0BPY,30545 -psutil/tests/test_osx.py,sha256=Y_NubjMylA88A7WAepiDkYTZl4YWvwgtCRFvu23Rm8A,6512 -psutil/tests/test_posix.py,sha256=yKL9N6ixiFUPNmv5v7cBS1OaoOZl-bm7hGdf7m2_M0E,17675 -psutil/tests/test_process.py,sha256=lmVD9FO6GJp4GZqSxR0j4Wsr7dcG8Py2qWsiv-furbY,61548 -psutil/tests/test_process_all.py,sha256=MfKc2BpL3pFBKqdmkq5gJ1GDD4CZzxUvesQ7sgnzzJg,18882 -psutil/tests/test_scripts.py,sha256=a3z4vFdBNlto_2pKe37kOPK6zVenfWzCsibduzyeO1c,7965 -psutil/tests/test_sunos.py,sha256=FxIAhIC3hycvJhgdVK8_98AmmV1pTZgXtovBgDmD9RA,1229 -psutil/tests/test_system.py,sha256=gi5Mci_pL5za6Q1Wp3nOv4J6Bj7L-IeM76rR5-1rFZk,37086 -psutil/tests/test_testutils.py,sha256=IUc3mMHGKGdnPpf_mhMWbDq0UDK9sXI4DZZ2dwujS7A,18915 -psutil/tests/test_unicode.py,sha256=kH08SGFmi0bxnL-LHEA7JX0fwauGPvY9W3zfkQumgTw,10705 -psutil/tests/test_windows.py,sha256=Zpg4Ek9KHkloYHpgHtHIrYBDXIgSf8HppSWcgWgogWE,34128 diff --git a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/REQUESTED b/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/WHEEL b/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/WHEEL deleted file mode 100644 index 816dfea..0000000 --- a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: false -Tag: cp37-abi3-win_amd64 - diff --git a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/top_level.txt b/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/top_level.txt deleted file mode 100644 index a4d92cc..0000000 --- a/PortablePython/Lib/site-packages/psutil-7.0.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -psutil diff --git a/PortablePython/Lib/site-packages/psutil/__init__.py b/PortablePython/Lib/site-packages/psutil/__init__.py deleted file mode 100644 index cf4a580..0000000 --- a/PortablePython/Lib/site-packages/psutil/__init__.py +++ /dev/null @@ -1,2407 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""psutil is a cross-platform library for retrieving information on -running processes and system utilization (CPU, memory, disks, network, -sensors) in Python. Supported platforms: - - - Linux - - Windows - - macOS - - FreeBSD - - OpenBSD - - NetBSD - - Sun Solaris - - AIX - -Supported Python versions are cPython 3.6+ and PyPy. -""" - -import collections -import contextlib -import datetime -import functools -import os -import signal -import socket -import subprocess -import sys -import threading -import time - - -try: - import pwd -except ImportError: - pwd = None - -from . import _common -from ._common import AIX -from ._common import BSD -from ._common import CONN_CLOSE -from ._common import CONN_CLOSE_WAIT -from ._common import CONN_CLOSING -from ._common import CONN_ESTABLISHED -from ._common import CONN_FIN_WAIT1 -from ._common import CONN_FIN_WAIT2 -from ._common import CONN_LAST_ACK -from ._common import CONN_LISTEN -from ._common import CONN_NONE -from ._common import CONN_SYN_RECV -from ._common import CONN_SYN_SENT -from ._common import CONN_TIME_WAIT -from ._common import FREEBSD -from ._common import LINUX -from ._common import MACOS -from ._common import NETBSD -from ._common import NIC_DUPLEX_FULL -from ._common import NIC_DUPLEX_HALF -from ._common import NIC_DUPLEX_UNKNOWN -from ._common import OPENBSD -from ._common import OSX # deprecated alias -from ._common import POSIX -from ._common import POWER_TIME_UNKNOWN -from ._common import POWER_TIME_UNLIMITED -from ._common import STATUS_DEAD -from ._common import STATUS_DISK_SLEEP -from ._common import STATUS_IDLE -from ._common import STATUS_LOCKED -from ._common import STATUS_PARKED -from ._common import STATUS_RUNNING -from ._common import STATUS_SLEEPING -from ._common import STATUS_STOPPED -from ._common import STATUS_TRACING_STOP -from ._common import STATUS_WAITING -from ._common import STATUS_WAKING -from ._common import STATUS_ZOMBIE -from ._common import SUNOS -from ._common import WINDOWS -from ._common import AccessDenied -from ._common import Error -from ._common import NoSuchProcess -from ._common import TimeoutExpired -from ._common import ZombieProcess -from ._common import debug -from ._common import memoize_when_activated -from ._common import wrap_numbers as _wrap_numbers - - -if LINUX: - # This is public API and it will be retrieved from _pslinux.py - # via sys.modules. - PROCFS_PATH = "/proc" - - from . import _pslinux as _psplatform - from ._pslinux import IOPRIO_CLASS_BE # noqa: F401 - from ._pslinux import IOPRIO_CLASS_IDLE # noqa: F401 - from ._pslinux import IOPRIO_CLASS_NONE # noqa: F401 - from ._pslinux import IOPRIO_CLASS_RT # noqa: F401 - -elif WINDOWS: - from . import _pswindows as _psplatform - from ._psutil_windows import ABOVE_NORMAL_PRIORITY_CLASS # noqa: F401 - from ._psutil_windows import BELOW_NORMAL_PRIORITY_CLASS # noqa: F401 - from ._psutil_windows import HIGH_PRIORITY_CLASS # noqa: F401 - from ._psutil_windows import IDLE_PRIORITY_CLASS # noqa: F401 - from ._psutil_windows import NORMAL_PRIORITY_CLASS # noqa: F401 - from ._psutil_windows import REALTIME_PRIORITY_CLASS # noqa: F401 - from ._pswindows import CONN_DELETE_TCB # noqa: F401 - from ._pswindows import IOPRIO_HIGH # noqa: F401 - from ._pswindows import IOPRIO_LOW # noqa: F401 - from ._pswindows import IOPRIO_NORMAL # noqa: F401 - from ._pswindows import IOPRIO_VERYLOW # noqa: F401 - -elif MACOS: - from . import _psosx as _psplatform - -elif BSD: - from . import _psbsd as _psplatform - -elif SUNOS: - from . import _pssunos as _psplatform - from ._pssunos import CONN_BOUND # noqa: F401 - from ._pssunos import CONN_IDLE # noqa: F401 - - # This is public writable API which is read from _pslinux.py and - # _pssunos.py via sys.modules. - PROCFS_PATH = "/proc" - -elif AIX: - from . import _psaix as _psplatform - - # This is public API and it will be retrieved from _pslinux.py - # via sys.modules. - PROCFS_PATH = "/proc" - -else: # pragma: no cover - msg = f"platform {sys.platform} is not supported" - raise NotImplementedError(msg) - - -# fmt: off -__all__ = [ - # exceptions - "Error", "NoSuchProcess", "ZombieProcess", "AccessDenied", - "TimeoutExpired", - - # constants - "version_info", "__version__", - - "STATUS_RUNNING", "STATUS_IDLE", "STATUS_SLEEPING", "STATUS_DISK_SLEEP", - "STATUS_STOPPED", "STATUS_TRACING_STOP", "STATUS_ZOMBIE", "STATUS_DEAD", - "STATUS_WAKING", "STATUS_LOCKED", "STATUS_WAITING", "STATUS_LOCKED", - "STATUS_PARKED", - - "CONN_ESTABLISHED", "CONN_SYN_SENT", "CONN_SYN_RECV", "CONN_FIN_WAIT1", - "CONN_FIN_WAIT2", "CONN_TIME_WAIT", "CONN_CLOSE", "CONN_CLOSE_WAIT", - "CONN_LAST_ACK", "CONN_LISTEN", "CONN_CLOSING", "CONN_NONE", - # "CONN_IDLE", "CONN_BOUND", - - "AF_LINK", - - "NIC_DUPLEX_FULL", "NIC_DUPLEX_HALF", "NIC_DUPLEX_UNKNOWN", - - "POWER_TIME_UNKNOWN", "POWER_TIME_UNLIMITED", - - "BSD", "FREEBSD", "LINUX", "NETBSD", "OPENBSD", "MACOS", "OSX", "POSIX", - "SUNOS", "WINDOWS", "AIX", - - # "RLIM_INFINITY", "RLIMIT_AS", "RLIMIT_CORE", "RLIMIT_CPU", "RLIMIT_DATA", - # "RLIMIT_FSIZE", "RLIMIT_LOCKS", "RLIMIT_MEMLOCK", "RLIMIT_NOFILE", - # "RLIMIT_NPROC", "RLIMIT_RSS", "RLIMIT_STACK", "RLIMIT_MSGQUEUE", - # "RLIMIT_NICE", "RLIMIT_RTPRIO", "RLIMIT_RTTIME", "RLIMIT_SIGPENDING", - - # classes - "Process", "Popen", - - # functions - "pid_exists", "pids", "process_iter", "wait_procs", # proc - "virtual_memory", "swap_memory", # memory - "cpu_times", "cpu_percent", "cpu_times_percent", "cpu_count", # cpu - "cpu_stats", # "cpu_freq", "getloadavg" - "net_io_counters", "net_connections", "net_if_addrs", # network - "net_if_stats", - "disk_io_counters", "disk_partitions", "disk_usage", # disk - # "sensors_temperatures", "sensors_battery", "sensors_fans" # sensors - "users", "boot_time", # others -] -# fmt: on - - -__all__.extend(_psplatform.__extra__all__) - -# Linux, FreeBSD -if hasattr(_psplatform.Process, "rlimit"): - # Populate global namespace with RLIM* constants. - from . import _psutil_posix - - _globals = globals() - _name = None - for _name in dir(_psutil_posix): - if _name.startswith('RLIM') and _name.isupper(): - _globals[_name] = getattr(_psutil_posix, _name) - __all__.append(_name) - del _globals, _name - -AF_LINK = _psplatform.AF_LINK - -__author__ = "Giampaolo Rodola'" -__version__ = "7.0.0" -version_info = tuple(int(num) for num in __version__.split('.')) - -_timer = getattr(time, 'monotonic', time.time) -_TOTAL_PHYMEM = None -_LOWEST_PID = None -_SENTINEL = object() - -# Sanity check in case the user messed up with psutil installation -# or did something weird with sys.path. In this case we might end -# up importing a python module using a C extension module which -# was compiled for a different version of psutil. -# We want to prevent that by failing sooner rather than later. -# See: https://github.com/giampaolo/psutil/issues/564 -if int(__version__.replace('.', '')) != getattr( - _psplatform.cext, 'version', None -): - msg = f"version conflict: {_psplatform.cext.__file__!r} C extension " - msg += "module was built for another version of psutil" - if hasattr(_psplatform.cext, 'version'): - v = ".".join(list(str(_psplatform.cext.version))) - msg += f" ({v} instead of {__version__})" - else: - msg += f" (different than {__version__})" - what = getattr( - _psplatform.cext, - "__file__", - "the existing psutil install directory", - ) - msg += f"; you may try to 'pip uninstall psutil', manually remove {what}" - msg += " or clean the virtual env somehow, then reinstall" - raise ImportError(msg) - - -# ===================================================================== -# --- Utils -# ===================================================================== - - -if hasattr(_psplatform, 'ppid_map'): - # Faster version (Windows and Linux). - _ppid_map = _psplatform.ppid_map -else: # pragma: no cover - - def _ppid_map(): - """Return a {pid: ppid, ...} dict for all running processes in - one shot. Used to speed up Process.children(). - """ - ret = {} - for pid in pids(): - try: - ret[pid] = _psplatform.Process(pid).ppid() - except (NoSuchProcess, ZombieProcess): - pass - return ret - - -def _pprint_secs(secs): - """Format seconds in a human readable form.""" - now = time.time() - secs_ago = int(now - secs) - fmt = "%H:%M:%S" if secs_ago < 60 * 60 * 24 else "%Y-%m-%d %H:%M:%S" - return datetime.datetime.fromtimestamp(secs).strftime(fmt) - - -def _check_conn_kind(kind): - """Check net_connections()'s `kind` parameter.""" - kinds = tuple(_common.conn_tmap) - if kind not in kinds: - msg = f"invalid kind argument {kind!r}; valid ones are: {kinds}" - raise ValueError(msg) - - -# ===================================================================== -# --- Process class -# ===================================================================== - - -class Process: - """Represents an OS process with the given PID. - If PID is omitted current process PID (os.getpid()) is used. - Raise NoSuchProcess if PID does not exist. - - Note that most of the methods of this class do not make sure that - the PID of the process being queried has been reused. That means - that you may end up retrieving information for another process. - - The only exceptions for which process identity is pre-emptively - checked and guaranteed are: - - - parent() - - children() - - nice() (set) - - ionice() (set) - - rlimit() (set) - - cpu_affinity (set) - - suspend() - - resume() - - send_signal() - - terminate() - - kill() - - To prevent this problem for all other methods you can use - is_running() before querying the process. - """ - - def __init__(self, pid=None): - self._init(pid) - - def _init(self, pid, _ignore_nsp=False): - if pid is None: - pid = os.getpid() - else: - if pid < 0: - msg = f"pid must be a positive integer (got {pid})" - raise ValueError(msg) - try: - _psplatform.cext.check_pid_range(pid) - except OverflowError as err: - msg = "process PID out of range" - raise NoSuchProcess(pid, msg=msg) from err - - self._pid = pid - self._name = None - self._exe = None - self._create_time = None - self._gone = False - self._pid_reused = False - self._hash = None - self._lock = threading.RLock() - # used for caching on Windows only (on POSIX ppid may change) - self._ppid = None - # platform-specific modules define an _psplatform.Process - # implementation class - self._proc = _psplatform.Process(pid) - self._last_sys_cpu_times = None - self._last_proc_cpu_times = None - self._exitcode = _SENTINEL - self._ident = (self.pid, None) - try: - self._ident = self._get_ident() - except AccessDenied: - # This should happen on Windows only, since we use the fast - # create time method. AFAIK, on all other platforms we are - # able to get create time for all PIDs. - pass - except ZombieProcess: - # Zombies can still be queried by this class (although - # not always) and pids() return them so just go on. - pass - except NoSuchProcess: - if not _ignore_nsp: - msg = "process PID not found" - raise NoSuchProcess(pid, msg=msg) from None - self._gone = True - - def _get_ident(self): - """Return a (pid, uid) tuple which is supposed to identify a - Process instance univocally over time. The PID alone is not - enough, as it can be assigned to a new process after this one - terminates, so we add process creation time to the mix. We need - this in order to prevent killing the wrong process later on. - This is also known as PID reuse or PID recycling problem. - - The reliability of this strategy mostly depends on - create_time() precision, which is 0.01 secs on Linux. The - assumption is that, after a process terminates, the kernel - won't reuse the same PID after such a short period of time - (0.01 secs). Technically this is inherently racy, but - practically it should be good enough. - """ - if WINDOWS: - # Use create_time() fast method in order to speedup - # `process_iter()`. This means we'll get AccessDenied for - # most ADMIN processes, but that's fine since it means - # we'll also get AccessDenied on kill(). - # https://github.com/giampaolo/psutil/issues/2366#issuecomment-2381646555 - self._create_time = self._proc.create_time(fast_only=True) - return (self.pid, self._create_time) - else: - return (self.pid, self.create_time()) - - def __str__(self): - info = collections.OrderedDict() - info["pid"] = self.pid - if self._name: - info['name'] = self._name - with self.oneshot(): - if self._pid_reused: - info["status"] = "terminated + PID reused" - else: - try: - info["name"] = self.name() - info["status"] = self.status() - except ZombieProcess: - info["status"] = "zombie" - except NoSuchProcess: - info["status"] = "terminated" - except AccessDenied: - pass - - if self._exitcode not in {_SENTINEL, None}: - info["exitcode"] = self._exitcode - if self._create_time is not None: - info['started'] = _pprint_secs(self._create_time) - - return "{}.{}({})".format( - self.__class__.__module__, - self.__class__.__name__, - ", ".join([f"{k}={v!r}" for k, v in info.items()]), - ) - - __repr__ = __str__ - - def __eq__(self, other): - # Test for equality with another Process object based - # on PID and creation time. - if not isinstance(other, Process): - return NotImplemented - if OPENBSD or NETBSD: # pragma: no cover - # Zombie processes on Open/NetBSD have a creation time of - # 0.0. This covers the case when a process started normally - # (so it has a ctime), then it turned into a zombie. It's - # important to do this because is_running() depends on - # __eq__. - pid1, ident1 = self._ident - pid2, ident2 = other._ident - if pid1 == pid2: - if ident1 and not ident2: - try: - return self.status() == STATUS_ZOMBIE - except Error: - pass - return self._ident == other._ident - - def __ne__(self, other): - return not self == other - - def __hash__(self): - if self._hash is None: - self._hash = hash(self._ident) - return self._hash - - def _raise_if_pid_reused(self): - """Raises NoSuchProcess in case process PID has been reused.""" - if self._pid_reused or (not self.is_running() and self._pid_reused): - # We may directly raise NSP in here already if PID is just - # not running, but I prefer NSP to be raised naturally by - # the actual Process API call. This way unit tests will tell - # us if the API is broken (aka don't raise NSP when it - # should). We also remain consistent with all other "get" - # APIs which don't use _raise_if_pid_reused(). - msg = "process no longer exists and its PID has been reused" - raise NoSuchProcess(self.pid, self._name, msg=msg) - - @property - def pid(self): - """The process PID.""" - return self._pid - - # --- utility methods - - @contextlib.contextmanager - def oneshot(self): - """Utility context manager which considerably speeds up the - retrieval of multiple process information at the same time. - - Internally different process info (e.g. name, ppid, uids, - gids, ...) may be fetched by using the same routine, but - only one information is returned and the others are discarded. - When using this context manager the internal routine is - executed once (in the example below on name()) and the - other info are cached. - - The cache is cleared when exiting the context manager block. - The advice is to use this every time you retrieve more than - one information about the process. If you're lucky, you'll - get a hell of a speedup. - - >>> import psutil - >>> p = psutil.Process() - >>> with p.oneshot(): - ... p.name() # collect multiple info - ... p.cpu_times() # return cached value - ... p.cpu_percent() # return cached value - ... p.create_time() # return cached value - ... - >>> - """ - with self._lock: - if hasattr(self, "_cache"): - # NOOP: this covers the use case where the user enters the - # context twice: - # - # >>> with p.oneshot(): - # ... with p.oneshot(): - # ... - # - # Also, since as_dict() internally uses oneshot() - # I expect that the code below will be a pretty common - # "mistake" that the user will make, so let's guard - # against that: - # - # >>> with p.oneshot(): - # ... p.as_dict() - # ... - yield - else: - try: - # cached in case cpu_percent() is used - self.cpu_times.cache_activate(self) - # cached in case memory_percent() is used - self.memory_info.cache_activate(self) - # cached in case parent() is used - self.ppid.cache_activate(self) - # cached in case username() is used - if POSIX: - self.uids.cache_activate(self) - # specific implementation cache - self._proc.oneshot_enter() - yield - finally: - self.cpu_times.cache_deactivate(self) - self.memory_info.cache_deactivate(self) - self.ppid.cache_deactivate(self) - if POSIX: - self.uids.cache_deactivate(self) - self._proc.oneshot_exit() - - def as_dict(self, attrs=None, ad_value=None): - """Utility method returning process information as a - hashable dictionary. - If *attrs* is specified it must be a list of strings - reflecting available Process class' attribute names - (e.g. ['cpu_times', 'name']) else all public (read - only) attributes are assumed. - *ad_value* is the value which gets assigned in case - AccessDenied or ZombieProcess exception is raised when - retrieving that particular process information. - """ - valid_names = _as_dict_attrnames - if attrs is not None: - if not isinstance(attrs, (list, tuple, set, frozenset)): - msg = f"invalid attrs type {type(attrs)}" - raise TypeError(msg) - attrs = set(attrs) - invalid_names = attrs - valid_names - if invalid_names: - msg = "invalid attr name{} {}".format( - "s" if len(invalid_names) > 1 else "", - ", ".join(map(repr, invalid_names)), - ) - raise ValueError(msg) - - retdict = {} - ls = attrs or valid_names - with self.oneshot(): - for name in ls: - try: - if name == 'pid': - ret = self.pid - else: - meth = getattr(self, name) - ret = meth() - except (AccessDenied, ZombieProcess): - ret = ad_value - except NotImplementedError: - # in case of not implemented functionality (may happen - # on old or exotic systems) we want to crash only if - # the user explicitly asked for that particular attr - if attrs: - raise - continue - retdict[name] = ret - return retdict - - def parent(self): - """Return the parent process as a Process object pre-emptively - checking whether PID has been reused. - If no parent is known return None. - """ - lowest_pid = _LOWEST_PID if _LOWEST_PID is not None else pids()[0] - if self.pid == lowest_pid: - return None - ppid = self.ppid() - if ppid is not None: - ctime = self.create_time() - try: - parent = Process(ppid) - if parent.create_time() <= ctime: - return parent - # ...else ppid has been reused by another process - except NoSuchProcess: - pass - - def parents(self): - """Return the parents of this process as a list of Process - instances. If no parents are known return an empty list. - """ - parents = [] - proc = self.parent() - while proc is not None: - parents.append(proc) - proc = proc.parent() - return parents - - def is_running(self): - """Return whether this process is running. - - It also checks if PID has been reused by another process, in - which case it will remove the process from `process_iter()` - internal cache and return False. - """ - if self._gone or self._pid_reused: - return False - try: - # Checking if PID is alive is not enough as the PID might - # have been reused by another process. Process identity / - # uniqueness over time is guaranteed by (PID + creation - # time) and that is verified in __eq__. - self._pid_reused = self != Process(self.pid) - if self._pid_reused: - _pids_reused.add(self.pid) - raise NoSuchProcess(self.pid) - return True - except ZombieProcess: - # We should never get here as it's already handled in - # Process.__init__; here just for extra safety. - return True - except NoSuchProcess: - self._gone = True - return False - - # --- actual API - - @memoize_when_activated - def ppid(self): - """The process parent PID. - On Windows the return value is cached after first call. - """ - # On POSIX we don't want to cache the ppid as it may unexpectedly - # change to 1 (init) in case this process turns into a zombie: - # https://github.com/giampaolo/psutil/issues/321 - # http://stackoverflow.com/questions/356722/ - - # XXX should we check creation time here rather than in - # Process.parent()? - self._raise_if_pid_reused() - if POSIX: - return self._proc.ppid() - else: # pragma: no cover - self._ppid = self._ppid or self._proc.ppid() - return self._ppid - - def name(self): - """The process name. The return value is cached after first call.""" - # Process name is only cached on Windows as on POSIX it may - # change, see: - # https://github.com/giampaolo/psutil/issues/692 - if WINDOWS and self._name is not None: - return self._name - name = self._proc.name() - if POSIX and len(name) >= 15: - # On UNIX the name gets truncated to the first 15 characters. - # If it matches the first part of the cmdline we return that - # one instead because it's usually more explicative. - # Examples are "gnome-keyring-d" vs. "gnome-keyring-daemon". - try: - cmdline = self.cmdline() - except (AccessDenied, ZombieProcess): - # Just pass and return the truncated name: it's better - # than nothing. Note: there are actual cases where a - # zombie process can return a name() but not a - # cmdline(), see: - # https://github.com/giampaolo/psutil/issues/2239 - pass - else: - if cmdline: - extended_name = os.path.basename(cmdline[0]) - if extended_name.startswith(name): - name = extended_name - self._name = name - self._proc._name = name - return name - - def exe(self): - """The process executable as an absolute path. - May also be an empty string. - The return value is cached after first call. - """ - - def guess_it(fallback): - # try to guess exe from cmdline[0] in absence of a native - # exe representation - cmdline = self.cmdline() - if cmdline and hasattr(os, 'access') and hasattr(os, 'X_OK'): - exe = cmdline[0] # the possible exe - # Attempt to guess only in case of an absolute path. - # It is not safe otherwise as the process might have - # changed cwd. - if ( - os.path.isabs(exe) - and os.path.isfile(exe) - and os.access(exe, os.X_OK) - ): - return exe - if isinstance(fallback, AccessDenied): - raise fallback - return fallback - - if self._exe is None: - try: - exe = self._proc.exe() - except AccessDenied as err: - return guess_it(fallback=err) - else: - if not exe: - # underlying implementation can legitimately return an - # empty string; if that's the case we don't want to - # raise AD while guessing from the cmdline - try: - exe = guess_it(fallback=exe) - except AccessDenied: - pass - self._exe = exe - return self._exe - - def cmdline(self): - """The command line this process has been called with.""" - return self._proc.cmdline() - - def status(self): - """The process current status as a STATUS_* constant.""" - try: - return self._proc.status() - except ZombieProcess: - return STATUS_ZOMBIE - - def username(self): - """The name of the user that owns the process. - On UNIX this is calculated by using *real* process uid. - """ - if POSIX: - if pwd is None: - # might happen if python was installed from sources - msg = "requires pwd module shipped with standard python" - raise ImportError(msg) - real_uid = self.uids().real - try: - return pwd.getpwuid(real_uid).pw_name - except KeyError: - # the uid can't be resolved by the system - return str(real_uid) - else: - return self._proc.username() - - def create_time(self): - """The process creation time as a floating point number - expressed in seconds since the epoch. - The return value is cached after first call. - """ - if self._create_time is None: - self._create_time = self._proc.create_time() - return self._create_time - - def cwd(self): - """Process current working directory as an absolute path.""" - return self._proc.cwd() - - def nice(self, value=None): - """Get or set process niceness (priority).""" - if value is None: - return self._proc.nice_get() - else: - self._raise_if_pid_reused() - self._proc.nice_set(value) - - if POSIX: - - @memoize_when_activated - def uids(self): - """Return process UIDs as a (real, effective, saved) - namedtuple. - """ - return self._proc.uids() - - def gids(self): - """Return process GIDs as a (real, effective, saved) - namedtuple. - """ - return self._proc.gids() - - def terminal(self): - """The terminal associated with this process, if any, - else None. - """ - return self._proc.terminal() - - def num_fds(self): - """Return the number of file descriptors opened by this - process (POSIX only). - """ - return self._proc.num_fds() - - # Linux, BSD, AIX and Windows only - if hasattr(_psplatform.Process, "io_counters"): - - def io_counters(self): - """Return process I/O statistics as a - (read_count, write_count, read_bytes, write_bytes) - namedtuple. - Those are the number of read/write calls performed and the - amount of bytes read and written by the process. - """ - return self._proc.io_counters() - - # Linux and Windows - if hasattr(_psplatform.Process, "ionice_get"): - - def ionice(self, ioclass=None, value=None): - """Get or set process I/O niceness (priority). - - On Linux *ioclass* is one of the IOPRIO_CLASS_* constants. - *value* is a number which goes from 0 to 7. The higher the - value, the lower the I/O priority of the process. - - On Windows only *ioclass* is used and it can be set to 2 - (normal), 1 (low) or 0 (very low). - - Available on Linux and Windows > Vista only. - """ - if ioclass is None: - if value is not None: - msg = "'ioclass' argument must be specified" - raise ValueError(msg) - return self._proc.ionice_get() - else: - self._raise_if_pid_reused() - return self._proc.ionice_set(ioclass, value) - - # Linux / FreeBSD only - if hasattr(_psplatform.Process, "rlimit"): - - def rlimit(self, resource, limits=None): - """Get or set process resource limits as a (soft, hard) - tuple. - - *resource* is one of the RLIMIT_* constants. - *limits* is supposed to be a (soft, hard) tuple. - - See "man prlimit" for further info. - Available on Linux and FreeBSD only. - """ - if limits is not None: - self._raise_if_pid_reused() - return self._proc.rlimit(resource, limits) - - # Windows, Linux and FreeBSD only - if hasattr(_psplatform.Process, "cpu_affinity_get"): - - def cpu_affinity(self, cpus=None): - """Get or set process CPU affinity. - If specified, *cpus* must be a list of CPUs for which you - want to set the affinity (e.g. [0, 1]). - If an empty list is passed, all egible CPUs are assumed - (and set). - (Windows, Linux and BSD only). - """ - if cpus is None: - return sorted(set(self._proc.cpu_affinity_get())) - else: - self._raise_if_pid_reused() - if not cpus: - if hasattr(self._proc, "_get_eligible_cpus"): - cpus = self._proc._get_eligible_cpus() - else: - cpus = tuple(range(len(cpu_times(percpu=True)))) - self._proc.cpu_affinity_set(list(set(cpus))) - - # Linux, FreeBSD, SunOS - if hasattr(_psplatform.Process, "cpu_num"): - - def cpu_num(self): - """Return what CPU this process is currently running on. - The returned number should be <= psutil.cpu_count() - and <= len(psutil.cpu_percent(percpu=True)). - It may be used in conjunction with - psutil.cpu_percent(percpu=True) to observe the system - workload distributed across CPUs. - """ - return self._proc.cpu_num() - - # All platforms has it, but maybe not in the future. - if hasattr(_psplatform.Process, "environ"): - - def environ(self): - """The environment variables of the process as a dict. Note: this - might not reflect changes made after the process started. - """ - return self._proc.environ() - - if WINDOWS: - - def num_handles(self): - """Return the number of handles opened by this process - (Windows only). - """ - return self._proc.num_handles() - - def num_ctx_switches(self): - """Return the number of voluntary and involuntary context - switches performed by this process. - """ - return self._proc.num_ctx_switches() - - def num_threads(self): - """Return the number of threads used by this process.""" - return self._proc.num_threads() - - if hasattr(_psplatform.Process, "threads"): - - def threads(self): - """Return threads opened by process as a list of - (id, user_time, system_time) namedtuples representing - thread id and thread CPU times (user/system). - On OpenBSD this method requires root access. - """ - return self._proc.threads() - - def children(self, recursive=False): - """Return the children of this process as a list of Process - instances, pre-emptively checking whether PID has been reused. - If *recursive* is True return all the parent descendants. - - Example (A == this process): - - A ─┐ - │ - ├─ B (child) ─┐ - │ └─ X (grandchild) ─┐ - │ └─ Y (great grandchild) - ├─ C (child) - └─ D (child) - - >>> import psutil - >>> p = psutil.Process() - >>> p.children() - B, C, D - >>> p.children(recursive=True) - B, X, Y, C, D - - Note that in the example above if process X disappears - process Y won't be listed as the reference to process A - is lost. - """ - self._raise_if_pid_reused() - ppid_map = _ppid_map() - ret = [] - if not recursive: - for pid, ppid in ppid_map.items(): - if ppid == self.pid: - try: - child = Process(pid) - # if child happens to be older than its parent - # (self) it means child's PID has been reused - if self.create_time() <= child.create_time(): - ret.append(child) - except (NoSuchProcess, ZombieProcess): - pass - else: - # Construct a {pid: [child pids]} dict - reverse_ppid_map = collections.defaultdict(list) - for pid, ppid in ppid_map.items(): - reverse_ppid_map[ppid].append(pid) - # Recursively traverse that dict, starting from self.pid, - # such that we only call Process() on actual children - seen = set() - stack = [self.pid] - while stack: - pid = stack.pop() - if pid in seen: - # Since pids can be reused while the ppid_map is - # constructed, there may be rare instances where - # there's a cycle in the recorded process "tree". - continue - seen.add(pid) - for child_pid in reverse_ppid_map[pid]: - try: - child = Process(child_pid) - # if child happens to be older than its parent - # (self) it means child's PID has been reused - intime = self.create_time() <= child.create_time() - if intime: - ret.append(child) - stack.append(child_pid) - except (NoSuchProcess, ZombieProcess): - pass - return ret - - def cpu_percent(self, interval=None): - """Return a float representing the current process CPU - utilization as a percentage. - - When *interval* is 0.0 or None (default) compares process times - to system CPU times elapsed since last call, returning - immediately (non-blocking). That means that the first time - this is called it will return a meaningful 0.0 value. - - When *interval* is > 0.0 compares process times to system CPU - times elapsed before and after the interval (blocking). - - In this case is recommended for accuracy that this function - be called with at least 0.1 seconds between calls. - - A value > 100.0 can be returned in case of processes running - multiple threads on different CPU cores. - - The returned value is explicitly NOT split evenly between - all available logical CPUs. This means that a busy loop process - running on a system with 2 logical CPUs will be reported as - having 100% CPU utilization instead of 50%. - - Examples: - - >>> import psutil - >>> p = psutil.Process(os.getpid()) - >>> # blocking - >>> p.cpu_percent(interval=1) - 2.0 - >>> # non-blocking (percentage since last call) - >>> p.cpu_percent(interval=None) - 2.9 - >>> - """ - blocking = interval is not None and interval > 0.0 - if interval is not None and interval < 0: - msg = f"interval is not positive (got {interval!r})" - raise ValueError(msg) - num_cpus = cpu_count() or 1 - - def timer(): - return _timer() * num_cpus - - if blocking: - st1 = timer() - pt1 = self._proc.cpu_times() - time.sleep(interval) - st2 = timer() - pt2 = self._proc.cpu_times() - else: - st1 = self._last_sys_cpu_times - pt1 = self._last_proc_cpu_times - st2 = timer() - pt2 = self._proc.cpu_times() - if st1 is None or pt1 is None: - self._last_sys_cpu_times = st2 - self._last_proc_cpu_times = pt2 - return 0.0 - - delta_proc = (pt2.user - pt1.user) + (pt2.system - pt1.system) - delta_time = st2 - st1 - # reset values for next call in case of interval == None - self._last_sys_cpu_times = st2 - self._last_proc_cpu_times = pt2 - - try: - # This is the utilization split evenly between all CPUs. - # E.g. a busy loop process on a 2-CPU-cores system at this - # point is reported as 50% instead of 100%. - overall_cpus_percent = (delta_proc / delta_time) * 100 - except ZeroDivisionError: - # interval was too low - return 0.0 - else: - # Note 1: - # in order to emulate "top" we multiply the value for the num - # of CPU cores. This way the busy process will be reported as - # having 100% (or more) usage. - # - # Note 2: - # taskmgr.exe on Windows differs in that it will show 50% - # instead. - # - # Note 3: - # a percentage > 100 is legitimate as it can result from a - # process with multiple threads running on different CPU - # cores (top does the same), see: - # http://stackoverflow.com/questions/1032357 - # https://github.com/giampaolo/psutil/issues/474 - single_cpu_percent = overall_cpus_percent * num_cpus - return round(single_cpu_percent, 1) - - @memoize_when_activated - def cpu_times(self): - """Return a (user, system, children_user, children_system) - namedtuple representing the accumulated process time, in - seconds. - This is similar to os.times() but per-process. - On macOS and Windows children_user and children_system are - always set to 0. - """ - return self._proc.cpu_times() - - @memoize_when_activated - def memory_info(self): - """Return a namedtuple with variable fields depending on the - platform, representing memory information about the process. - - The "portable" fields available on all platforms are `rss` and `vms`. - - All numbers are expressed in bytes. - """ - return self._proc.memory_info() - - def memory_full_info(self): - """This method returns the same information as memory_info(), - plus, on some platform (Linux, macOS, Windows), also provides - additional metrics (USS, PSS and swap). - The additional metrics provide a better representation of actual - process memory usage. - - Namely USS is the memory which is unique to a process and which - would be freed if the process was terminated right now. - - It does so by passing through the whole process address. - As such it usually requires higher user privileges than - memory_info() and is considerably slower. - """ - return self._proc.memory_full_info() - - def memory_percent(self, memtype="rss"): - """Compare process memory to total physical system memory and - calculate process memory utilization as a percentage. - *memtype* argument is a string that dictates what type of - process memory you want to compare against (defaults to "rss"). - The list of available strings can be obtained like this: - - >>> psutil.Process().memory_info()._fields - ('rss', 'vms', 'shared', 'text', 'lib', 'data', 'dirty', 'uss', 'pss') - """ - valid_types = list(_psplatform.pfullmem._fields) - if memtype not in valid_types: - msg = ( - f"invalid memtype {memtype!r}; valid types are" - f" {tuple(valid_types)!r}" - ) - raise ValueError(msg) - fun = ( - self.memory_info - if memtype in _psplatform.pmem._fields - else self.memory_full_info - ) - metrics = fun() - value = getattr(metrics, memtype) - - # use cached value if available - total_phymem = _TOTAL_PHYMEM or virtual_memory().total - if not total_phymem > 0: - # we should never get here - msg = ( - "can't calculate process memory percent because total physical" - f" system memory is not positive ({total_phymem!r})" - ) - raise ValueError(msg) - return (value / float(total_phymem)) * 100 - - if hasattr(_psplatform.Process, "memory_maps"): - - def memory_maps(self, grouped=True): - """Return process' mapped memory regions as a list of namedtuples - whose fields are variable depending on the platform. - - If *grouped* is True the mapped regions with the same 'path' - are grouped together and the different memory fields are summed. - - If *grouped* is False every mapped region is shown as a single - entity and the namedtuple will also include the mapped region's - address space ('addr') and permission set ('perms'). - """ - it = self._proc.memory_maps() - if grouped: - d = {} - for tupl in it: - path = tupl[2] - nums = tupl[3:] - try: - d[path] = list(map(lambda x, y: x + y, d[path], nums)) - except KeyError: - d[path] = nums - nt = _psplatform.pmmap_grouped - return [nt(path, *d[path]) for path in d] - else: - nt = _psplatform.pmmap_ext - return [nt(*x) for x in it] - - def open_files(self): - """Return files opened by process as a list of - (path, fd) namedtuples including the absolute file name - and file descriptor number. - """ - return self._proc.open_files() - - def net_connections(self, kind='inet'): - """Return socket connections opened by process as a list of - (fd, family, type, laddr, raddr, status) namedtuples. - The *kind* parameter filters for connections that match the - following criteria: - - +------------+----------------------------------------------------+ - | Kind Value | Connections using | - +------------+----------------------------------------------------+ - | inet | IPv4 and IPv6 | - | inet4 | IPv4 | - | inet6 | IPv6 | - | tcp | TCP | - | tcp4 | TCP over IPv4 | - | tcp6 | TCP over IPv6 | - | udp | UDP | - | udp4 | UDP over IPv4 | - | udp6 | UDP over IPv6 | - | unix | UNIX socket (both UDP and TCP protocols) | - | all | the sum of all the possible families and protocols | - +------------+----------------------------------------------------+ - """ - _check_conn_kind(kind) - return self._proc.net_connections(kind) - - @_common.deprecated_method(replacement="net_connections") - def connections(self, kind="inet"): - return self.net_connections(kind=kind) - - # --- signals - - if POSIX: - - def _send_signal(self, sig): - assert not self.pid < 0, self.pid - self._raise_if_pid_reused() - - pid, ppid, name = self.pid, self._ppid, self._name - if pid == 0: - # see "man 2 kill" - msg = ( - "preventing sending signal to process with PID 0 as it " - "would affect every process in the process group of the " - "calling process (os.getpid()) instead of PID 0" - ) - raise ValueError(msg) - try: - os.kill(pid, sig) - except ProcessLookupError as err: - if OPENBSD and pid_exists(pid): - # We do this because os.kill() lies in case of - # zombie processes. - raise ZombieProcess(pid, name, ppid) from err - self._gone = True - raise NoSuchProcess(pid, name) from err - except PermissionError as err: - raise AccessDenied(pid, name) from err - - def send_signal(self, sig): - """Send a signal *sig* to process pre-emptively checking - whether PID has been reused (see signal module constants) . - On Windows only SIGTERM is valid and is treated as an alias - for kill(). - """ - if POSIX: - self._send_signal(sig) - else: # pragma: no cover - self._raise_if_pid_reused() - if sig != signal.SIGTERM and not self.is_running(): - msg = "process no longer exists" - raise NoSuchProcess(self.pid, self._name, msg=msg) - self._proc.send_signal(sig) - - def suspend(self): - """Suspend process execution with SIGSTOP pre-emptively checking - whether PID has been reused. - On Windows this has the effect of suspending all process threads. - """ - if POSIX: - self._send_signal(signal.SIGSTOP) - else: # pragma: no cover - self._raise_if_pid_reused() - self._proc.suspend() - - def resume(self): - """Resume process execution with SIGCONT pre-emptively checking - whether PID has been reused. - On Windows this has the effect of resuming all process threads. - """ - if POSIX: - self._send_signal(signal.SIGCONT) - else: # pragma: no cover - self._raise_if_pid_reused() - self._proc.resume() - - def terminate(self): - """Terminate the process with SIGTERM pre-emptively checking - whether PID has been reused. - On Windows this is an alias for kill(). - """ - if POSIX: - self._send_signal(signal.SIGTERM) - else: # pragma: no cover - self._raise_if_pid_reused() - self._proc.kill() - - def kill(self): - """Kill the current process with SIGKILL pre-emptively checking - whether PID has been reused. - """ - if POSIX: - self._send_signal(signal.SIGKILL) - else: # pragma: no cover - self._raise_if_pid_reused() - self._proc.kill() - - def wait(self, timeout=None): - """Wait for process to terminate and, if process is a children - of os.getpid(), also return its exit code, else None. - On Windows there's no such limitation (exit code is always - returned). - - If the process is already terminated immediately return None - instead of raising NoSuchProcess. - - If *timeout* (in seconds) is specified and process is still - alive raise TimeoutExpired. - - To wait for multiple Process(es) use psutil.wait_procs(). - """ - if timeout is not None and not timeout >= 0: - msg = "timeout must be a positive integer" - raise ValueError(msg) - if self._exitcode is not _SENTINEL: - return self._exitcode - self._exitcode = self._proc.wait(timeout) - return self._exitcode - - -# The valid attr names which can be processed by Process.as_dict(). -# fmt: off -_as_dict_attrnames = { - x for x in dir(Process) if not x.startswith("_") and x not in - {'send_signal', 'suspend', 'resume', 'terminate', 'kill', 'wait', - 'is_running', 'as_dict', 'parent', 'parents', 'children', 'rlimit', - 'connections', 'oneshot'} -} -# fmt: on - - -# ===================================================================== -# --- Popen class -# ===================================================================== - - -class Popen(Process): - """Same as subprocess.Popen, but in addition it provides all - psutil.Process methods in a single class. - For the following methods which are common to both classes, psutil - implementation takes precedence: - - * send_signal() - * terminate() - * kill() - - This is done in order to avoid killing another process in case its - PID has been reused, fixing BPO-6973. - - >>> import psutil - >>> from subprocess import PIPE - >>> p = psutil.Popen(["python", "-c", "print 'hi'"], stdout=PIPE) - >>> p.name() - 'python' - >>> p.uids() - user(real=1000, effective=1000, saved=1000) - >>> p.username() - 'giampaolo' - >>> p.communicate() - ('hi', None) - >>> p.terminate() - >>> p.wait(timeout=2) - 0 - >>> - """ - - def __init__(self, *args, **kwargs): - # Explicitly avoid to raise NoSuchProcess in case the process - # spawned by subprocess.Popen terminates too quickly, see: - # https://github.com/giampaolo/psutil/issues/193 - self.__subproc = subprocess.Popen(*args, **kwargs) - self._init(self.__subproc.pid, _ignore_nsp=True) - - def __dir__(self): - return sorted(set(dir(Popen) + dir(subprocess.Popen))) - - def __enter__(self): - if hasattr(self.__subproc, '__enter__'): - self.__subproc.__enter__() - return self - - def __exit__(self, *args, **kwargs): - if hasattr(self.__subproc, '__exit__'): - return self.__subproc.__exit__(*args, **kwargs) - else: - if self.stdout: - self.stdout.close() - if self.stderr: - self.stderr.close() - try: - # Flushing a BufferedWriter may raise an error. - if self.stdin: - self.stdin.close() - finally: - # Wait for the process to terminate, to avoid zombies. - self.wait() - - def __getattribute__(self, name): - try: - return object.__getattribute__(self, name) - except AttributeError: - try: - return object.__getattribute__(self.__subproc, name) - except AttributeError: - msg = f"{self.__class__!r} has no attribute {name!r}" - raise AttributeError(msg) from None - - def wait(self, timeout=None): - if self.__subproc.returncode is not None: - return self.__subproc.returncode - ret = super().wait(timeout) - self.__subproc.returncode = ret - return ret - - -# ===================================================================== -# --- system processes related functions -# ===================================================================== - - -def pids(): - """Return a list of current running PIDs.""" - global _LOWEST_PID - ret = sorted(_psplatform.pids()) - _LOWEST_PID = ret[0] - return ret - - -def pid_exists(pid): - """Return True if given PID exists in the current process list. - This is faster than doing "pid in psutil.pids()" and - should be preferred. - """ - if pid < 0: - return False - elif pid == 0 and POSIX: - # On POSIX we use os.kill() to determine PID existence. - # According to "man 2 kill" PID 0 has a special meaning - # though: it refers to <> and that is not we want - # to do here. - return pid in pids() - else: - return _psplatform.pid_exists(pid) - - -_pmap = {} -_pids_reused = set() - - -def process_iter(attrs=None, ad_value=None): - """Return a generator yielding a Process instance for all - running processes. - - Every new Process instance is only created once and then cached - into an internal table which is updated every time this is used. - Cache can optionally be cleared via `process_iter.clear_cache()`. - - The sorting order in which processes are yielded is based on - their PIDs. - - *attrs* and *ad_value* have the same meaning as in - Process.as_dict(). If *attrs* is specified as_dict() is called - and the resulting dict is stored as a 'info' attribute attached - to returned Process instance. - If *attrs* is an empty list it will retrieve all process info - (slow). - """ - global _pmap - - def add(pid): - proc = Process(pid) - pmap[proc.pid] = proc - return proc - - def remove(pid): - pmap.pop(pid, None) - - pmap = _pmap.copy() - a = set(pids()) - b = set(pmap.keys()) - new_pids = a - b - gone_pids = b - a - for pid in gone_pids: - remove(pid) - while _pids_reused: - pid = _pids_reused.pop() - debug(f"refreshing Process instance for reused PID {pid}") - remove(pid) - try: - ls = sorted(list(pmap.items()) + list(dict.fromkeys(new_pids).items())) - for pid, proc in ls: - try: - if proc is None: # new process - proc = add(pid) - if attrs is not None: - proc.info = proc.as_dict(attrs=attrs, ad_value=ad_value) - yield proc - except NoSuchProcess: - remove(pid) - finally: - _pmap = pmap - - -process_iter.cache_clear = lambda: _pmap.clear() # noqa: PLW0108 -process_iter.cache_clear.__doc__ = "Clear process_iter() internal cache." - - -def wait_procs(procs, timeout=None, callback=None): - """Convenience function which waits for a list of processes to - terminate. - - Return a (gone, alive) tuple indicating which processes - are gone and which ones are still alive. - - The gone ones will have a new *returncode* attribute indicating - process exit status (may be None). - - *callback* is a function which gets called every time a process - terminates (a Process instance is passed as callback argument). - - Function will return as soon as all processes terminate or when - *timeout* occurs. - Differently from Process.wait() it will not raise TimeoutExpired if - *timeout* occurs. - - Typical use case is: - - - send SIGTERM to a list of processes - - give them some time to terminate - - send SIGKILL to those ones which are still alive - - Example: - - >>> def on_terminate(proc): - ... print("process {} terminated".format(proc)) - ... - >>> for p in procs: - ... p.terminate() - ... - >>> gone, alive = wait_procs(procs, timeout=3, callback=on_terminate) - >>> for p in alive: - ... p.kill() - """ - - def check_gone(proc, timeout): - try: - returncode = proc.wait(timeout=timeout) - except (TimeoutExpired, subprocess.TimeoutExpired): - pass - else: - if returncode is not None or not proc.is_running(): - # Set new Process instance attribute. - proc.returncode = returncode - gone.add(proc) - if callback is not None: - callback(proc) - - if timeout is not None and not timeout >= 0: - msg = f"timeout must be a positive integer, got {timeout}" - raise ValueError(msg) - gone = set() - alive = set(procs) - if callback is not None and not callable(callback): - msg = f"callback {callback!r} is not a callable" - raise TypeError(msg) - if timeout is not None: - deadline = _timer() + timeout - - while alive: - if timeout is not None and timeout <= 0: - break - for proc in alive: - # Make sure that every complete iteration (all processes) - # will last max 1 sec. - # We do this because we don't want to wait too long on a - # single process: in case it terminates too late other - # processes may disappear in the meantime and their PID - # reused. - max_timeout = 1.0 / len(alive) - if timeout is not None: - timeout = min((deadline - _timer()), max_timeout) - if timeout <= 0: - break - check_gone(proc, timeout) - else: - check_gone(proc, max_timeout) - alive = alive - gone # noqa: PLR6104 - - if alive: - # Last attempt over processes survived so far. - # timeout == 0 won't make this function wait any further. - for proc in alive: - check_gone(proc, 0) - alive = alive - gone # noqa: PLR6104 - - return (list(gone), list(alive)) - - -# ===================================================================== -# --- CPU related functions -# ===================================================================== - - -def cpu_count(logical=True): - """Return the number of logical CPUs in the system (same as - os.cpu_count()). - - If *logical* is False return the number of physical cores only - (e.g. hyper thread CPUs are excluded). - - Return None if undetermined. - - The return value is cached after first call. - If desired cache can be cleared like this: - - >>> psutil.cpu_count.cache_clear() - """ - if logical: - ret = _psplatform.cpu_count_logical() - else: - ret = _psplatform.cpu_count_cores() - if ret is not None and ret < 1: - ret = None - return ret - - -def cpu_times(percpu=False): - """Return system-wide CPU times as a namedtuple. - Every CPU time represents the seconds the CPU has spent in the - given mode. The namedtuple's fields availability varies depending on the - platform: - - - user - - system - - idle - - nice (UNIX) - - iowait (Linux) - - irq (Linux, FreeBSD) - - softirq (Linux) - - steal (Linux >= 2.6.11) - - guest (Linux >= 2.6.24) - - guest_nice (Linux >= 3.2.0) - - When *percpu* is True return a list of namedtuples for each CPU. - First element of the list refers to first CPU, second element - to second CPU and so on. - The order of the list is consistent across calls. - """ - if not percpu: - return _psplatform.cpu_times() - else: - return _psplatform.per_cpu_times() - - -try: - _last_cpu_times = {threading.current_thread().ident: cpu_times()} -except Exception: # noqa: BLE001 - # Don't want to crash at import time. - _last_cpu_times = {} - -try: - _last_per_cpu_times = { - threading.current_thread().ident: cpu_times(percpu=True) - } -except Exception: # noqa: BLE001 - # Don't want to crash at import time. - _last_per_cpu_times = {} - - -def _cpu_tot_time(times): - """Given a cpu_time() ntuple calculates the total CPU time - (including idle time). - """ - tot = sum(times) - if LINUX: - # On Linux guest times are already accounted in "user" or - # "nice" times, so we subtract them from total. - # Htop does the same. References: - # https://github.com/giampaolo/psutil/pull/940 - # http://unix.stackexchange.com/questions/178045 - # https://github.com/torvalds/linux/blob/ - # 447976ef4fd09b1be88b316d1a81553f1aa7cd07/kernel/sched/ - # cputime.c#L158 - tot -= getattr(times, "guest", 0) # Linux 2.6.24+ - tot -= getattr(times, "guest_nice", 0) # Linux 3.2.0+ - return tot - - -def _cpu_busy_time(times): - """Given a cpu_time() ntuple calculates the busy CPU time. - We do so by subtracting all idle CPU times. - """ - busy = _cpu_tot_time(times) - busy -= times.idle - # Linux: "iowait" is time during which the CPU does not do anything - # (waits for IO to complete). On Linux IO wait is *not* accounted - # in "idle" time so we subtract it. Htop does the same. - # References: - # https://github.com/torvalds/linux/blob/ - # 447976ef4fd09b1be88b316d1a81553f1aa7cd07/kernel/sched/cputime.c#L244 - busy -= getattr(times, "iowait", 0) - return busy - - -def _cpu_times_deltas(t1, t2): - assert t1._fields == t2._fields, (t1, t2) - field_deltas = [] - for field in _psplatform.scputimes._fields: - field_delta = getattr(t2, field) - getattr(t1, field) - # CPU times are always supposed to increase over time - # or at least remain the same and that's because time - # cannot go backwards. - # Surprisingly sometimes this might not be the case (at - # least on Windows and Linux), see: - # https://github.com/giampaolo/psutil/issues/392 - # https://github.com/giampaolo/psutil/issues/645 - # https://github.com/giampaolo/psutil/issues/1210 - # Trim negative deltas to zero to ignore decreasing fields. - # top does the same. Reference: - # https://gitlab.com/procps-ng/procps/blob/v3.3.12/top/top.c#L5063 - field_delta = max(0, field_delta) - field_deltas.append(field_delta) - return _psplatform.scputimes(*field_deltas) - - -def cpu_percent(interval=None, percpu=False): - """Return a float representing the current system-wide CPU - utilization as a percentage. - - When *interval* is > 0.0 compares system CPU times elapsed before - and after the interval (blocking). - - When *interval* is 0.0 or None compares system CPU times elapsed - since last call or module import, returning immediately (non - blocking). That means the first time this is called it will - return a meaningless 0.0 value which you should ignore. - In this case is recommended for accuracy that this function be - called with at least 0.1 seconds between calls. - - When *percpu* is True returns a list of floats representing the - utilization as a percentage for each CPU. - First element of the list refers to first CPU, second element - to second CPU and so on. - The order of the list is consistent across calls. - - Examples: - - >>> # blocking, system-wide - >>> psutil.cpu_percent(interval=1) - 2.0 - >>> - >>> # blocking, per-cpu - >>> psutil.cpu_percent(interval=1, percpu=True) - [2.0, 1.0] - >>> - >>> # non-blocking (percentage since last call) - >>> psutil.cpu_percent(interval=None) - 2.9 - >>> - """ - tid = threading.current_thread().ident - blocking = interval is not None and interval > 0.0 - if interval is not None and interval < 0: - msg = f"interval is not positive (got {interval})" - raise ValueError(msg) - - def calculate(t1, t2): - times_delta = _cpu_times_deltas(t1, t2) - all_delta = _cpu_tot_time(times_delta) - busy_delta = _cpu_busy_time(times_delta) - - try: - busy_perc = (busy_delta / all_delta) * 100 - except ZeroDivisionError: - return 0.0 - else: - return round(busy_perc, 1) - - # system-wide usage - if not percpu: - if blocking: - t1 = cpu_times() - time.sleep(interval) - else: - t1 = _last_cpu_times.get(tid) or cpu_times() - _last_cpu_times[tid] = cpu_times() - return calculate(t1, _last_cpu_times[tid]) - # per-cpu usage - else: - ret = [] - if blocking: - tot1 = cpu_times(percpu=True) - time.sleep(interval) - else: - tot1 = _last_per_cpu_times.get(tid) or cpu_times(percpu=True) - _last_per_cpu_times[tid] = cpu_times(percpu=True) - for t1, t2 in zip(tot1, _last_per_cpu_times[tid]): - ret.append(calculate(t1, t2)) - return ret - - -# Use a separate dict for cpu_times_percent(), so it's independent from -# cpu_percent() and they can both be used within the same program. -_last_cpu_times_2 = _last_cpu_times.copy() -_last_per_cpu_times_2 = _last_per_cpu_times.copy() - - -def cpu_times_percent(interval=None, percpu=False): - """Same as cpu_percent() but provides utilization percentages - for each specific CPU time as is returned by cpu_times(). - For instance, on Linux we'll get: - - >>> cpu_times_percent() - cpupercent(user=4.8, nice=0.0, system=4.8, idle=90.5, iowait=0.0, - irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0) - >>> - - *interval* and *percpu* arguments have the same meaning as in - cpu_percent(). - """ - tid = threading.current_thread().ident - blocking = interval is not None and interval > 0.0 - if interval is not None and interval < 0: - msg = f"interval is not positive (got {interval!r})" - raise ValueError(msg) - - def calculate(t1, t2): - nums = [] - times_delta = _cpu_times_deltas(t1, t2) - all_delta = _cpu_tot_time(times_delta) - # "scale" is the value to multiply each delta with to get percentages. - # We use "max" to avoid division by zero (if all_delta is 0, then all - # fields are 0 so percentages will be 0 too. all_delta cannot be a - # fraction because cpu times are integers) - scale = 100.0 / max(1, all_delta) - for field_delta in times_delta: - field_perc = field_delta * scale - field_perc = round(field_perc, 1) - # make sure we don't return negative values or values over 100% - field_perc = min(max(0.0, field_perc), 100.0) - nums.append(field_perc) - return _psplatform.scputimes(*nums) - - # system-wide usage - if not percpu: - if blocking: - t1 = cpu_times() - time.sleep(interval) - else: - t1 = _last_cpu_times_2.get(tid) or cpu_times() - _last_cpu_times_2[tid] = cpu_times() - return calculate(t1, _last_cpu_times_2[tid]) - # per-cpu usage - else: - ret = [] - if blocking: - tot1 = cpu_times(percpu=True) - time.sleep(interval) - else: - tot1 = _last_per_cpu_times_2.get(tid) or cpu_times(percpu=True) - _last_per_cpu_times_2[tid] = cpu_times(percpu=True) - for t1, t2 in zip(tot1, _last_per_cpu_times_2[tid]): - ret.append(calculate(t1, t2)) - return ret - - -def cpu_stats(): - """Return CPU statistics.""" - return _psplatform.cpu_stats() - - -if hasattr(_psplatform, "cpu_freq"): - - def cpu_freq(percpu=False): - """Return CPU frequency as a namedtuple including current, - min and max frequency expressed in Mhz. - - If *percpu* is True and the system supports per-cpu frequency - retrieval (Linux only) a list of frequencies is returned for - each CPU. If not a list with one element is returned. - """ - ret = _psplatform.cpu_freq() - if percpu: - return ret - else: - num_cpus = float(len(ret)) - if num_cpus == 0: - return None - elif num_cpus == 1: - return ret[0] - else: - currs, mins, maxs = 0.0, 0.0, 0.0 - set_none = False - for cpu in ret: - currs += cpu.current - # On Linux if /proc/cpuinfo is used min/max are set - # to None. - if LINUX and cpu.min is None: - set_none = True - continue - mins += cpu.min - maxs += cpu.max - - current = currs / num_cpus - - if set_none: - min_ = max_ = None - else: - min_ = mins / num_cpus - max_ = maxs / num_cpus - - return _common.scpufreq(current, min_, max_) - - __all__.append("cpu_freq") - - -if hasattr(os, "getloadavg") or hasattr(_psplatform, "getloadavg"): - # Perform this hasattr check once on import time to either use the - # platform based code or proxy straight from the os module. - if hasattr(os, "getloadavg"): - getloadavg = os.getloadavg - else: - getloadavg = _psplatform.getloadavg - - __all__.append("getloadavg") - - -# ===================================================================== -# --- system memory related functions -# ===================================================================== - - -def virtual_memory(): - """Return statistics about system memory usage as a namedtuple - including the following fields, expressed in bytes: - - - total: - total physical memory available. - - - available: - the memory that can be given instantly to processes without the - system going into swap. - This is calculated by summing different memory values depending - on the platform and it is supposed to be used to monitor actual - memory usage in a cross platform fashion. - - - percent: - the percentage usage calculated as (total - available) / total * 100 - - - used: - memory used, calculated differently depending on the platform and - designed for informational purposes only: - macOS: active + wired - BSD: active + wired + cached - Linux: total - free - - - free: - memory not being used at all (zeroed) that is readily available; - note that this doesn't reflect the actual memory available - (use 'available' instead) - - Platform-specific fields: - - - active (UNIX): - memory currently in use or very recently used, and so it is in RAM. - - - inactive (UNIX): - memory that is marked as not used. - - - buffers (BSD, Linux): - cache for things like file system metadata. - - - cached (BSD, macOS): - cache for various things. - - - wired (macOS, BSD): - memory that is marked to always stay in RAM. It is never moved to disk. - - - shared (BSD): - memory that may be simultaneously accessed by multiple processes. - - The sum of 'used' and 'available' does not necessarily equal total. - On Windows 'available' and 'free' are the same. - """ - global _TOTAL_PHYMEM - ret = _psplatform.virtual_memory() - # cached for later use in Process.memory_percent() - _TOTAL_PHYMEM = ret.total - return ret - - -def swap_memory(): - """Return system swap memory statistics as a namedtuple including - the following fields: - - - total: total swap memory in bytes - - used: used swap memory in bytes - - free: free swap memory in bytes - - percent: the percentage usage - - sin: no. of bytes the system has swapped in from disk (cumulative) - - sout: no. of bytes the system has swapped out from disk (cumulative) - - 'sin' and 'sout' on Windows are meaningless and always set to 0. - """ - return _psplatform.swap_memory() - - -# ===================================================================== -# --- disks/partitions related functions -# ===================================================================== - - -def disk_usage(path): - """Return disk usage statistics about the given *path* as a - namedtuple including total, used and free space expressed in bytes - plus the percentage usage. - """ - return _psplatform.disk_usage(path) - - -def disk_partitions(all=False): - """Return mounted partitions as a list of - (device, mountpoint, fstype, opts) namedtuple. - 'opts' field is a raw string separated by commas indicating mount - options which may vary depending on the platform. - - If *all* parameter is False return physical devices only and ignore - all others. - """ - return _psplatform.disk_partitions(all) - - -def disk_io_counters(perdisk=False, nowrap=True): - """Return system disk I/O statistics as a namedtuple including - the following fields: - - - read_count: number of reads - - write_count: number of writes - - read_bytes: number of bytes read - - write_bytes: number of bytes written - - read_time: time spent reading from disk (in ms) - - write_time: time spent writing to disk (in ms) - - Platform specific: - - - busy_time: (Linux, FreeBSD) time spent doing actual I/Os (in ms) - - read_merged_count (Linux): number of merged reads - - write_merged_count (Linux): number of merged writes - - If *perdisk* is True return the same information for every - physical disk installed on the system as a dictionary - with partition names as the keys and the namedtuple - described above as the values. - - If *nowrap* is True it detects and adjust the numbers which overflow - and wrap (restart from 0) and add "old value" to "new value" so that - the returned numbers will always be increasing or remain the same, - but never decrease. - "disk_io_counters.cache_clear()" can be used to invalidate the - cache. - - On recent Windows versions 'diskperf -y' command may need to be - executed first otherwise this function won't find any disk. - """ - kwargs = dict(perdisk=perdisk) if LINUX else {} - rawdict = _psplatform.disk_io_counters(**kwargs) - if not rawdict: - return {} if perdisk else None - if nowrap: - rawdict = _wrap_numbers(rawdict, 'psutil.disk_io_counters') - nt = getattr(_psplatform, "sdiskio", _common.sdiskio) - if perdisk: - for disk, fields in rawdict.items(): - rawdict[disk] = nt(*fields) - return rawdict - else: - return nt(*(sum(x) for x in zip(*rawdict.values()))) - - -disk_io_counters.cache_clear = functools.partial( - _wrap_numbers.cache_clear, 'psutil.disk_io_counters' -) -disk_io_counters.cache_clear.__doc__ = "Clears nowrap argument cache" - - -# ===================================================================== -# --- network related functions -# ===================================================================== - - -def net_io_counters(pernic=False, nowrap=True): - """Return network I/O statistics as a namedtuple including - the following fields: - - - bytes_sent: number of bytes sent - - bytes_recv: number of bytes received - - packets_sent: number of packets sent - - packets_recv: number of packets received - - errin: total number of errors while receiving - - errout: total number of errors while sending - - dropin: total number of incoming packets which were dropped - - dropout: total number of outgoing packets which were dropped - (always 0 on macOS and BSD) - - If *pernic* is True return the same information for every - network interface installed on the system as a dictionary - with network interface names as the keys and the namedtuple - described above as the values. - - If *nowrap* is True it detects and adjust the numbers which overflow - and wrap (restart from 0) and add "old value" to "new value" so that - the returned numbers will always be increasing or remain the same, - but never decrease. - "net_io_counters.cache_clear()" can be used to invalidate the - cache. - """ - rawdict = _psplatform.net_io_counters() - if not rawdict: - return {} if pernic else None - if nowrap: - rawdict = _wrap_numbers(rawdict, 'psutil.net_io_counters') - if pernic: - for nic, fields in rawdict.items(): - rawdict[nic] = _common.snetio(*fields) - return rawdict - else: - return _common.snetio(*[sum(x) for x in zip(*rawdict.values())]) - - -net_io_counters.cache_clear = functools.partial( - _wrap_numbers.cache_clear, 'psutil.net_io_counters' -) -net_io_counters.cache_clear.__doc__ = "Clears nowrap argument cache" - - -def net_connections(kind='inet'): - """Return system-wide socket connections as a list of - (fd, family, type, laddr, raddr, status, pid) namedtuples. - In case of limited privileges 'fd' and 'pid' may be set to -1 - and None respectively. - The *kind* parameter filters for connections that fit the - following criteria: - - +------------+----------------------------------------------------+ - | Kind Value | Connections using | - +------------+----------------------------------------------------+ - | inet | IPv4 and IPv6 | - | inet4 | IPv4 | - | inet6 | IPv6 | - | tcp | TCP | - | tcp4 | TCP over IPv4 | - | tcp6 | TCP over IPv6 | - | udp | UDP | - | udp4 | UDP over IPv4 | - | udp6 | UDP over IPv6 | - | unix | UNIX socket (both UDP and TCP protocols) | - | all | the sum of all the possible families and protocols | - +------------+----------------------------------------------------+ - - On macOS this function requires root privileges. - """ - _check_conn_kind(kind) - return _psplatform.net_connections(kind) - - -def net_if_addrs(): - """Return the addresses associated to each NIC (network interface - card) installed on the system as a dictionary whose keys are the - NIC names and value is a list of namedtuples for each address - assigned to the NIC. Each namedtuple includes 5 fields: - - - family: can be either socket.AF_INET, socket.AF_INET6 or - psutil.AF_LINK, which refers to a MAC address. - - address: is the primary address and it is always set. - - netmask: and 'broadcast' and 'ptp' may be None. - - ptp: stands for "point to point" and references the - destination address on a point to point interface - (typically a VPN). - - broadcast: and *ptp* are mutually exclusive. - - Note: you can have more than one address of the same family - associated with each interface. - """ - rawlist = _psplatform.net_if_addrs() - rawlist.sort(key=lambda x: x[1]) # sort by family - ret = collections.defaultdict(list) - for name, fam, addr, mask, broadcast, ptp in rawlist: - try: - fam = socket.AddressFamily(fam) - except ValueError: - if WINDOWS and fam == -1: - fam = _psplatform.AF_LINK - elif ( - hasattr(_psplatform, "AF_LINK") and fam == _psplatform.AF_LINK - ): - # Linux defines AF_LINK as an alias for AF_PACKET. - # We re-set the family here so that repr(family) - # will show AF_LINK rather than AF_PACKET - fam = _psplatform.AF_LINK - - if fam == _psplatform.AF_LINK: - # The underlying C function may return an incomplete MAC - # address in which case we fill it with null bytes, see: - # https://github.com/giampaolo/psutil/issues/786 - separator = ":" if POSIX else "-" - while addr.count(separator) < 5: - addr += f"{separator}00" - - nt = _common.snicaddr(fam, addr, mask, broadcast, ptp) - - # On Windows broadcast is None, so we determine it via - # ipaddress module. - if WINDOWS and fam in {socket.AF_INET, socket.AF_INET6}: - try: - broadcast = _common.broadcast_addr(nt) - except Exception as err: # noqa: BLE001 - debug(err) - else: - if broadcast is not None: - nt._replace(broadcast=broadcast) - - ret[name].append(nt) - - return dict(ret) - - -def net_if_stats(): - """Return information about each NIC (network interface card) - installed on the system as a dictionary whose keys are the - NIC names and value is a namedtuple with the following fields: - - - isup: whether the interface is up (bool) - - duplex: can be either NIC_DUPLEX_FULL, NIC_DUPLEX_HALF or - NIC_DUPLEX_UNKNOWN - - speed: the NIC speed expressed in mega bits (MB); if it can't - be determined (e.g. 'localhost') it will be set to 0. - - mtu: the maximum transmission unit expressed in bytes. - """ - return _psplatform.net_if_stats() - - -# ===================================================================== -# --- sensors -# ===================================================================== - - -# Linux, macOS -if hasattr(_psplatform, "sensors_temperatures"): - - def sensors_temperatures(fahrenheit=False): - """Return hardware temperatures. Each entry is a namedtuple - representing a certain hardware sensor (it may be a CPU, an - hard disk or something else, depending on the OS and its - configuration). - All temperatures are expressed in celsius unless *fahrenheit* - is set to True. - """ - - def convert(n): - if n is not None: - return (float(n) * 9 / 5) + 32 if fahrenheit else n - - ret = collections.defaultdict(list) - rawdict = _psplatform.sensors_temperatures() - - for name, values in rawdict.items(): - while values: - label, current, high, critical = values.pop(0) - current = convert(current) - high = convert(high) - critical = convert(critical) - - if high and not critical: - critical = high - elif critical and not high: - high = critical - - ret[name].append( - _common.shwtemp(label, current, high, critical) - ) - - return dict(ret) - - __all__.append("sensors_temperatures") - - -# Linux -if hasattr(_psplatform, "sensors_fans"): - - def sensors_fans(): - """Return fans speed. Each entry is a namedtuple - representing a certain hardware sensor. - All speed are expressed in RPM (rounds per minute). - """ - return _psplatform.sensors_fans() - - __all__.append("sensors_fans") - - -# Linux, Windows, FreeBSD, macOS -if hasattr(_psplatform, "sensors_battery"): - - def sensors_battery(): - """Return battery information. If no battery is installed - returns None. - - - percent: battery power left as a percentage. - - secsleft: a rough approximation of how many seconds are left - before the battery runs out of power. May be - POWER_TIME_UNLIMITED or POWER_TIME_UNLIMITED. - - power_plugged: True if the AC power cable is connected. - """ - return _psplatform.sensors_battery() - - __all__.append("sensors_battery") - - -# ===================================================================== -# --- other system related functions -# ===================================================================== - - -def boot_time(): - """Return the system boot time expressed in seconds since the epoch.""" - # Note: we are not caching this because it is subject to - # system clock updates. - return _psplatform.boot_time() - - -def users(): - """Return users currently connected on the system as a list of - namedtuples including the following fields. - - - user: the name of the user - - terminal: the tty or pseudo-tty associated with the user, if any. - - host: the host name associated with the entry, if any. - - started: the creation time as a floating point number expressed in - seconds since the epoch. - """ - return _psplatform.users() - - -# ===================================================================== -# --- Windows services -# ===================================================================== - - -if WINDOWS: - - def win_service_iter(): - """Return a generator yielding a WindowsService instance for all - Windows services installed. - """ - return _psplatform.win_service_iter() - - def win_service_get(name): - """Get a Windows service by *name*. - Raise NoSuchProcess if no service with such name exists. - """ - return _psplatform.win_service_get(name) - - -# ===================================================================== - - -def _set_debug(value): - """Enable or disable PSUTIL_DEBUG option, which prints debugging - messages to stderr. - """ - import psutil._common - - psutil._common.PSUTIL_DEBUG = bool(value) - _psplatform.cext.set_debug(bool(value)) - - -del memoize_when_activated diff --git a/PortablePython/Lib/site-packages/psutil/_common.py b/PortablePython/Lib/site-packages/psutil/_common.py deleted file mode 100644 index 4096c0a..0000000 --- a/PortablePython/Lib/site-packages/psutil/_common.py +++ /dev/null @@ -1,950 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Common objects shared by __init__.py and _ps*.py modules. - -Note: this module is imported by setup.py, so it should not import -psutil or third-party modules. -""" - -import collections -import enum -import functools -import os -import socket -import stat -import sys -import threading -import warnings -from collections import namedtuple -from socket import AF_INET -from socket import SOCK_DGRAM -from socket import SOCK_STREAM - - -try: - from socket import AF_INET6 -except ImportError: - AF_INET6 = None -try: - from socket import AF_UNIX -except ImportError: - AF_UNIX = None - - -PSUTIL_DEBUG = bool(os.getenv('PSUTIL_DEBUG')) -_DEFAULT = object() - -# fmt: off -__all__ = [ - # OS constants - 'FREEBSD', 'BSD', 'LINUX', 'NETBSD', 'OPENBSD', 'MACOS', 'OSX', 'POSIX', - 'SUNOS', 'WINDOWS', - # connection constants - 'CONN_CLOSE', 'CONN_CLOSE_WAIT', 'CONN_CLOSING', 'CONN_ESTABLISHED', - 'CONN_FIN_WAIT1', 'CONN_FIN_WAIT2', 'CONN_LAST_ACK', 'CONN_LISTEN', - 'CONN_NONE', 'CONN_SYN_RECV', 'CONN_SYN_SENT', 'CONN_TIME_WAIT', - # net constants - 'NIC_DUPLEX_FULL', 'NIC_DUPLEX_HALF', 'NIC_DUPLEX_UNKNOWN', # noqa: F822 - # process status constants - 'STATUS_DEAD', 'STATUS_DISK_SLEEP', 'STATUS_IDLE', 'STATUS_LOCKED', - 'STATUS_RUNNING', 'STATUS_SLEEPING', 'STATUS_STOPPED', 'STATUS_SUSPENDED', - 'STATUS_TRACING_STOP', 'STATUS_WAITING', 'STATUS_WAKE_KILL', - 'STATUS_WAKING', 'STATUS_ZOMBIE', 'STATUS_PARKED', - # other constants - 'ENCODING', 'ENCODING_ERRS', 'AF_INET6', - # named tuples - 'pconn', 'pcputimes', 'pctxsw', 'pgids', 'pio', 'pionice', 'popenfile', - 'pthread', 'puids', 'sconn', 'scpustats', 'sdiskio', 'sdiskpart', - 'sdiskusage', 'snetio', 'snicaddr', 'snicstats', 'sswap', 'suser', - # utility functions - 'conn_tmap', 'deprecated_method', 'isfile_strict', 'memoize', - 'parse_environ_block', 'path_exists_strict', 'usage_percent', - 'supports_ipv6', 'sockfam_to_enum', 'socktype_to_enum', "wrap_numbers", - 'open_text', 'open_binary', 'cat', 'bcat', - 'bytes2human', 'conn_to_ntuple', 'debug', - # shell utils - 'hilite', 'term_supports_colors', 'print_color', -] -# fmt: on - - -# =================================================================== -# --- OS constants -# =================================================================== - - -POSIX = os.name == "posix" -WINDOWS = os.name == "nt" -LINUX = sys.platform.startswith("linux") -MACOS = sys.platform.startswith("darwin") -OSX = MACOS # deprecated alias -FREEBSD = sys.platform.startswith(("freebsd", "midnightbsd")) -OPENBSD = sys.platform.startswith("openbsd") -NETBSD = sys.platform.startswith("netbsd") -BSD = FREEBSD or OPENBSD or NETBSD -SUNOS = sys.platform.startswith(("sunos", "solaris")) -AIX = sys.platform.startswith("aix") - - -# =================================================================== -# --- API constants -# =================================================================== - - -# Process.status() -STATUS_RUNNING = "running" -STATUS_SLEEPING = "sleeping" -STATUS_DISK_SLEEP = "disk-sleep" -STATUS_STOPPED = "stopped" -STATUS_TRACING_STOP = "tracing-stop" -STATUS_ZOMBIE = "zombie" -STATUS_DEAD = "dead" -STATUS_WAKE_KILL = "wake-kill" -STATUS_WAKING = "waking" -STATUS_IDLE = "idle" # Linux, macOS, FreeBSD -STATUS_LOCKED = "locked" # FreeBSD -STATUS_WAITING = "waiting" # FreeBSD -STATUS_SUSPENDED = "suspended" # NetBSD -STATUS_PARKED = "parked" # Linux - -# Process.net_connections() and psutil.net_connections() -CONN_ESTABLISHED = "ESTABLISHED" -CONN_SYN_SENT = "SYN_SENT" -CONN_SYN_RECV = "SYN_RECV" -CONN_FIN_WAIT1 = "FIN_WAIT1" -CONN_FIN_WAIT2 = "FIN_WAIT2" -CONN_TIME_WAIT = "TIME_WAIT" -CONN_CLOSE = "CLOSE" -CONN_CLOSE_WAIT = "CLOSE_WAIT" -CONN_LAST_ACK = "LAST_ACK" -CONN_LISTEN = "LISTEN" -CONN_CLOSING = "CLOSING" -CONN_NONE = "NONE" - - -# net_if_stats() -class NicDuplex(enum.IntEnum): - NIC_DUPLEX_FULL = 2 - NIC_DUPLEX_HALF = 1 - NIC_DUPLEX_UNKNOWN = 0 - - -globals().update(NicDuplex.__members__) - - -# sensors_battery() -class BatteryTime(enum.IntEnum): - POWER_TIME_UNKNOWN = -1 - POWER_TIME_UNLIMITED = -2 - - -globals().update(BatteryTime.__members__) - -# --- others - -ENCODING = sys.getfilesystemencoding() -ENCODING_ERRS = sys.getfilesystemencodeerrors() - - -# =================================================================== -# --- namedtuples -# =================================================================== - -# --- for system functions - -# fmt: off -# psutil.swap_memory() -sswap = namedtuple('sswap', ['total', 'used', 'free', 'percent', 'sin', - 'sout']) -# psutil.disk_usage() -sdiskusage = namedtuple('sdiskusage', ['total', 'used', 'free', 'percent']) -# psutil.disk_io_counters() -sdiskio = namedtuple('sdiskio', ['read_count', 'write_count', - 'read_bytes', 'write_bytes', - 'read_time', 'write_time']) -# psutil.disk_partitions() -sdiskpart = namedtuple('sdiskpart', ['device', 'mountpoint', 'fstype', 'opts']) -# psutil.net_io_counters() -snetio = namedtuple('snetio', ['bytes_sent', 'bytes_recv', - 'packets_sent', 'packets_recv', - 'errin', 'errout', - 'dropin', 'dropout']) -# psutil.users() -suser = namedtuple('suser', ['name', 'terminal', 'host', 'started', 'pid']) -# psutil.net_connections() -sconn = namedtuple('sconn', ['fd', 'family', 'type', 'laddr', 'raddr', - 'status', 'pid']) -# psutil.net_if_addrs() -snicaddr = namedtuple('snicaddr', - ['family', 'address', 'netmask', 'broadcast', 'ptp']) -# psutil.net_if_stats() -snicstats = namedtuple('snicstats', - ['isup', 'duplex', 'speed', 'mtu', 'flags']) -# psutil.cpu_stats() -scpustats = namedtuple( - 'scpustats', ['ctx_switches', 'interrupts', 'soft_interrupts', 'syscalls']) -# psutil.cpu_freq() -scpufreq = namedtuple('scpufreq', ['current', 'min', 'max']) -# psutil.sensors_temperatures() -shwtemp = namedtuple( - 'shwtemp', ['label', 'current', 'high', 'critical']) -# psutil.sensors_battery() -sbattery = namedtuple('sbattery', ['percent', 'secsleft', 'power_plugged']) -# psutil.sensors_fans() -sfan = namedtuple('sfan', ['label', 'current']) -# fmt: on - -# --- for Process methods - -# psutil.Process.cpu_times() -pcputimes = namedtuple( - 'pcputimes', ['user', 'system', 'children_user', 'children_system'] -) -# psutil.Process.open_files() -popenfile = namedtuple('popenfile', ['path', 'fd']) -# psutil.Process.threads() -pthread = namedtuple('pthread', ['id', 'user_time', 'system_time']) -# psutil.Process.uids() -puids = namedtuple('puids', ['real', 'effective', 'saved']) -# psutil.Process.gids() -pgids = namedtuple('pgids', ['real', 'effective', 'saved']) -# psutil.Process.io_counters() -pio = namedtuple( - 'pio', ['read_count', 'write_count', 'read_bytes', 'write_bytes'] -) -# psutil.Process.ionice() -pionice = namedtuple('pionice', ['ioclass', 'value']) -# psutil.Process.ctx_switches() -pctxsw = namedtuple('pctxsw', ['voluntary', 'involuntary']) -# psutil.Process.net_connections() -pconn = namedtuple( - 'pconn', ['fd', 'family', 'type', 'laddr', 'raddr', 'status'] -) - -# psutil.net_connections() and psutil.Process.net_connections() -addr = namedtuple('addr', ['ip', 'port']) - - -# =================================================================== -# --- Process.net_connections() 'kind' parameter mapping -# =================================================================== - - -conn_tmap = { - "all": ([AF_INET, AF_INET6, AF_UNIX], [SOCK_STREAM, SOCK_DGRAM]), - "tcp": ([AF_INET, AF_INET6], [SOCK_STREAM]), - "tcp4": ([AF_INET], [SOCK_STREAM]), - "udp": ([AF_INET, AF_INET6], [SOCK_DGRAM]), - "udp4": ([AF_INET], [SOCK_DGRAM]), - "inet": ([AF_INET, AF_INET6], [SOCK_STREAM, SOCK_DGRAM]), - "inet4": ([AF_INET], [SOCK_STREAM, SOCK_DGRAM]), - "inet6": ([AF_INET6], [SOCK_STREAM, SOCK_DGRAM]), -} - -if AF_INET6 is not None: - conn_tmap.update({ - "tcp6": ([AF_INET6], [SOCK_STREAM]), - "udp6": ([AF_INET6], [SOCK_DGRAM]), - }) - -if AF_UNIX is not None and not SUNOS: - conn_tmap.update({"unix": ([AF_UNIX], [SOCK_STREAM, SOCK_DGRAM])}) - - -# ===================================================================== -# --- Exceptions -# ===================================================================== - - -class Error(Exception): - """Base exception class. All other psutil exceptions inherit - from this one. - """ - - __module__ = 'psutil' - - def _infodict(self, attrs): - info = collections.OrderedDict() - for name in attrs: - value = getattr(self, name, None) - if value or (name == "pid" and value == 0): - info[name] = value - return info - - def __str__(self): - # invoked on `raise Error` - info = self._infodict(("pid", "ppid", "name")) - if info: - details = "({})".format( - ", ".join([f"{k}={v!r}" for k, v in info.items()]) - ) - else: - details = None - return " ".join([x for x in (getattr(self, "msg", ""), details) if x]) - - def __repr__(self): - # invoked on `repr(Error)` - info = self._infodict(("pid", "ppid", "name", "seconds", "msg")) - details = ", ".join([f"{k}={v!r}" for k, v in info.items()]) - return f"psutil.{self.__class__.__name__}({details})" - - -class NoSuchProcess(Error): - """Exception raised when a process with a certain PID doesn't - or no longer exists. - """ - - __module__ = 'psutil' - - def __init__(self, pid, name=None, msg=None): - Error.__init__(self) - self.pid = pid - self.name = name - self.msg = msg or "process no longer exists" - - def __reduce__(self): - return (self.__class__, (self.pid, self.name, self.msg)) - - -class ZombieProcess(NoSuchProcess): - """Exception raised when querying a zombie process. This is - raised on macOS, BSD and Solaris only, and not always: depending - on the query the OS may be able to succeed anyway. - On Linux all zombie processes are querable (hence this is never - raised). Windows doesn't have zombie processes. - """ - - __module__ = 'psutil' - - def __init__(self, pid, name=None, ppid=None, msg=None): - NoSuchProcess.__init__(self, pid, name, msg) - self.ppid = ppid - self.msg = msg or "PID still exists but it's a zombie" - - def __reduce__(self): - return (self.__class__, (self.pid, self.name, self.ppid, self.msg)) - - -class AccessDenied(Error): - """Exception raised when permission to perform an action is denied.""" - - __module__ = 'psutil' - - def __init__(self, pid=None, name=None, msg=None): - Error.__init__(self) - self.pid = pid - self.name = name - self.msg = msg or "" - - def __reduce__(self): - return (self.__class__, (self.pid, self.name, self.msg)) - - -class TimeoutExpired(Error): - """Raised on Process.wait(timeout) if timeout expires and process - is still alive. - """ - - __module__ = 'psutil' - - def __init__(self, seconds, pid=None, name=None): - Error.__init__(self) - self.seconds = seconds - self.pid = pid - self.name = name - self.msg = f"timeout after {seconds} seconds" - - def __reduce__(self): - return (self.__class__, (self.seconds, self.pid, self.name)) - - -# =================================================================== -# --- utils -# =================================================================== - - -def usage_percent(used, total, round_=None): - """Calculate percentage usage of 'used' against 'total'.""" - try: - ret = (float(used) / total) * 100 - except ZeroDivisionError: - return 0.0 - else: - if round_ is not None: - ret = round(ret, round_) - return ret - - -def memoize(fun): - """A simple memoize decorator for functions supporting (hashable) - positional arguments. - It also provides a cache_clear() function for clearing the cache: - - >>> @memoize - ... def foo() - ... return 1 - ... - >>> foo() - 1 - >>> foo.cache_clear() - >>> - - It supports: - - functions - - classes (acts as a @singleton) - - staticmethods - - classmethods - - It does NOT support: - - methods - """ - - @functools.wraps(fun) - def wrapper(*args, **kwargs): - key = (args, frozenset(sorted(kwargs.items()))) - try: - return cache[key] - except KeyError: - try: - ret = cache[key] = fun(*args, **kwargs) - except Exception as err: # noqa: BLE001 - raise err from None - return ret - - def cache_clear(): - """Clear cache.""" - cache.clear() - - cache = {} - wrapper.cache_clear = cache_clear - return wrapper - - -def memoize_when_activated(fun): - """A memoize decorator which is disabled by default. It can be - activated and deactivated on request. - For efficiency reasons it can be used only against class methods - accepting no arguments. - - >>> class Foo: - ... @memoize - ... def foo() - ... print(1) - ... - >>> f = Foo() - >>> # deactivated (default) - >>> foo() - 1 - >>> foo() - 1 - >>> - >>> # activated - >>> foo.cache_activate(self) - >>> foo() - 1 - >>> foo() - >>> foo() - >>> - """ - - @functools.wraps(fun) - def wrapper(self): - try: - # case 1: we previously entered oneshot() ctx - ret = self._cache[fun] - except AttributeError: - # case 2: we never entered oneshot() ctx - try: - return fun(self) - except Exception as err: # noqa: BLE001 - raise err from None - except KeyError: - # case 3: we entered oneshot() ctx but there's no cache - # for this entry yet - try: - ret = fun(self) - except Exception as err: # noqa: BLE001 - raise err from None - try: - self._cache[fun] = ret - except AttributeError: - # multi-threading race condition, see: - # https://github.com/giampaolo/psutil/issues/1948 - pass - return ret - - def cache_activate(proc): - """Activate cache. Expects a Process instance. Cache will be - stored as a "_cache" instance attribute. - """ - proc._cache = {} - - def cache_deactivate(proc): - """Deactivate and clear cache.""" - try: - del proc._cache - except AttributeError: - pass - - wrapper.cache_activate = cache_activate - wrapper.cache_deactivate = cache_deactivate - return wrapper - - -def isfile_strict(path): - """Same as os.path.isfile() but does not swallow EACCES / EPERM - exceptions, see: - http://mail.python.org/pipermail/python-dev/2012-June/120787.html. - """ - try: - st = os.stat(path) - except PermissionError: - raise - except OSError: - return False - else: - return stat.S_ISREG(st.st_mode) - - -def path_exists_strict(path): - """Same as os.path.exists() but does not swallow EACCES / EPERM - exceptions. See: - http://mail.python.org/pipermail/python-dev/2012-June/120787.html. - """ - try: - os.stat(path) - except PermissionError: - raise - except OSError: - return False - else: - return True - - -@memoize -def supports_ipv6(): - """Return True if IPv6 is supported on this platform.""" - if not socket.has_ipv6 or AF_INET6 is None: - return False - try: - with socket.socket(AF_INET6, socket.SOCK_STREAM) as sock: - sock.bind(("::1", 0)) - return True - except OSError: - return False - - -def parse_environ_block(data): - """Parse a C environ block of environment variables into a dictionary.""" - # The block is usually raw data from the target process. It might contain - # trailing garbage and lines that do not look like assignments. - ret = {} - pos = 0 - - # localize global variable to speed up access. - WINDOWS_ = WINDOWS - while True: - next_pos = data.find("\0", pos) - # nul byte at the beginning or double nul byte means finish - if next_pos <= pos: - break - # there might not be an equals sign - equal_pos = data.find("=", pos, next_pos) - if equal_pos > pos: - key = data[pos:equal_pos] - value = data[equal_pos + 1 : next_pos] - # Windows expects environment variables to be uppercase only - if WINDOWS_: - key = key.upper() - ret[key] = value - pos = next_pos + 1 - - return ret - - -def sockfam_to_enum(num): - """Convert a numeric socket family value to an IntEnum member. - If it's not a known member, return the numeric value itself. - """ - try: - return socket.AddressFamily(num) - except ValueError: - return num - - -def socktype_to_enum(num): - """Convert a numeric socket type value to an IntEnum member. - If it's not a known member, return the numeric value itself. - """ - try: - return socket.SocketKind(num) - except ValueError: - return num - - -def conn_to_ntuple(fd, fam, type_, laddr, raddr, status, status_map, pid=None): - """Convert a raw connection tuple to a proper ntuple.""" - if fam in {socket.AF_INET, AF_INET6}: - if laddr: - laddr = addr(*laddr) - if raddr: - raddr = addr(*raddr) - if type_ == socket.SOCK_STREAM and fam in {AF_INET, AF_INET6}: - status = status_map.get(status, CONN_NONE) - else: - status = CONN_NONE # ignore whatever C returned to us - fam = sockfam_to_enum(fam) - type_ = socktype_to_enum(type_) - if pid is None: - return pconn(fd, fam, type_, laddr, raddr, status) - else: - return sconn(fd, fam, type_, laddr, raddr, status, pid) - - -def broadcast_addr(addr): - """Given the address ntuple returned by ``net_if_addrs()`` - calculates the broadcast address. - """ - import ipaddress - - if not addr.address or not addr.netmask: - return None - if addr.family == socket.AF_INET: - return str( - ipaddress.IPv4Network( - f"{addr.address}/{addr.netmask}", strict=False - ).broadcast_address - ) - if addr.family == socket.AF_INET6: - return str( - ipaddress.IPv6Network( - f"{addr.address}/{addr.netmask}", strict=False - ).broadcast_address - ) - - -def deprecated_method(replacement): - """A decorator which can be used to mark a method as deprecated - 'replcement' is the method name which will be called instead. - """ - - def outer(fun): - msg = ( - f"{fun.__name__}() is deprecated and will be removed; use" - f" {replacement}() instead" - ) - if fun.__doc__ is None: - fun.__doc__ = msg - - @functools.wraps(fun) - def inner(self, *args, **kwargs): - warnings.warn(msg, category=DeprecationWarning, stacklevel=2) - return getattr(self, replacement)(*args, **kwargs) - - return inner - - return outer - - -class _WrapNumbers: - """Watches numbers so that they don't overflow and wrap - (reset to zero). - """ - - def __init__(self): - self.lock = threading.Lock() - self.cache = {} - self.reminders = {} - self.reminder_keys = {} - - def _add_dict(self, input_dict, name): - assert name not in self.cache - assert name not in self.reminders - assert name not in self.reminder_keys - self.cache[name] = input_dict - self.reminders[name] = collections.defaultdict(int) - self.reminder_keys[name] = collections.defaultdict(set) - - def _remove_dead_reminders(self, input_dict, name): - """In case the number of keys changed between calls (e.g. a - disk disappears) this removes the entry from self.reminders. - """ - old_dict = self.cache[name] - gone_keys = set(old_dict.keys()) - set(input_dict.keys()) - for gone_key in gone_keys: - for remkey in self.reminder_keys[name][gone_key]: - del self.reminders[name][remkey] - del self.reminder_keys[name][gone_key] - - def run(self, input_dict, name): - """Cache dict and sum numbers which overflow and wrap. - Return an updated copy of `input_dict`. - """ - if name not in self.cache: - # This was the first call. - self._add_dict(input_dict, name) - return input_dict - - self._remove_dead_reminders(input_dict, name) - - old_dict = self.cache[name] - new_dict = {} - for key in input_dict: - input_tuple = input_dict[key] - try: - old_tuple = old_dict[key] - except KeyError: - # The input dict has a new key (e.g. a new disk or NIC) - # which didn't exist in the previous call. - new_dict[key] = input_tuple - continue - - bits = [] - for i in range(len(input_tuple)): - input_value = input_tuple[i] - old_value = old_tuple[i] - remkey = (key, i) - if input_value < old_value: - # it wrapped! - self.reminders[name][remkey] += old_value - self.reminder_keys[name][key].add(remkey) - bits.append(input_value + self.reminders[name][remkey]) - - new_dict[key] = tuple(bits) - - self.cache[name] = input_dict - return new_dict - - def cache_clear(self, name=None): - """Clear the internal cache, optionally only for function 'name'.""" - with self.lock: - if name is None: - self.cache.clear() - self.reminders.clear() - self.reminder_keys.clear() - else: - self.cache.pop(name, None) - self.reminders.pop(name, None) - self.reminder_keys.pop(name, None) - - def cache_info(self): - """Return internal cache dicts as a tuple of 3 elements.""" - with self.lock: - return (self.cache, self.reminders, self.reminder_keys) - - -def wrap_numbers(input_dict, name): - """Given an `input_dict` and a function `name`, adjust the numbers - which "wrap" (restart from zero) across different calls by adding - "old value" to "new value" and return an updated dict. - """ - with _wn.lock: - return _wn.run(input_dict, name) - - -_wn = _WrapNumbers() -wrap_numbers.cache_clear = _wn.cache_clear -wrap_numbers.cache_info = _wn.cache_info - - -# The read buffer size for open() builtin. This (also) dictates how -# much data we read(2) when iterating over file lines as in: -# >>> with open(file) as f: -# ... for line in f: -# ... ... -# Default per-line buffer size for binary files is 1K. For text files -# is 8K. We use a bigger buffer (32K) in order to have more consistent -# results when reading /proc pseudo files on Linux, see: -# https://github.com/giampaolo/psutil/issues/2050 -# https://github.com/giampaolo/psutil/issues/708 -FILE_READ_BUFFER_SIZE = 32 * 1024 - - -def open_binary(fname): - return open(fname, "rb", buffering=FILE_READ_BUFFER_SIZE) - - -def open_text(fname): - """Open a file in text mode by using the proper FS encoding and - en/decoding error handlers. - """ - # See: - # https://github.com/giampaolo/psutil/issues/675 - # https://github.com/giampaolo/psutil/pull/733 - fobj = open( # noqa: SIM115 - fname, - buffering=FILE_READ_BUFFER_SIZE, - encoding=ENCODING, - errors=ENCODING_ERRS, - ) - try: - # Dictates per-line read(2) buffer size. Defaults is 8k. See: - # https://github.com/giampaolo/psutil/issues/2050#issuecomment-1013387546 - fobj._CHUNK_SIZE = FILE_READ_BUFFER_SIZE - except AttributeError: - pass - except Exception: - fobj.close() - raise - - return fobj - - -def cat(fname, fallback=_DEFAULT, _open=open_text): - """Read entire file content and return it as a string. File is - opened in text mode. If specified, `fallback` is the value - returned in case of error, either if the file does not exist or - it can't be read(). - """ - if fallback is _DEFAULT: - with _open(fname) as f: - return f.read() - else: - try: - with _open(fname) as f: - return f.read() - except OSError: - return fallback - - -def bcat(fname, fallback=_DEFAULT): - """Same as above but opens file in binary mode.""" - return cat(fname, fallback=fallback, _open=open_binary) - - -def bytes2human(n, format="%(value).1f%(symbol)s"): - """Used by various scripts. See: https://code.activestate.com/recipes/578019-bytes-to-human-human-to-bytes-converter/?in=user-4178764. - - >>> bytes2human(10000) - '9.8K' - >>> bytes2human(100001221) - '95.4M' - """ - symbols = ('B', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y') - prefix = {} - for i, s in enumerate(symbols[1:]): - prefix[s] = 1 << (i + 1) * 10 - for symbol in reversed(symbols[1:]): - if abs(n) >= prefix[symbol]: - value = float(n) / prefix[symbol] - return format % locals() - return format % dict(symbol=symbols[0], value=n) - - -def get_procfs_path(): - """Return updated psutil.PROCFS_PATH constant.""" - return sys.modules['psutil'].PROCFS_PATH - - -def decode(s): - return s.decode(encoding=ENCODING, errors=ENCODING_ERRS) - - -# ===================================================================== -# --- shell utils -# ===================================================================== - - -@memoize -def term_supports_colors(file=sys.stdout): # pragma: no cover - if os.name == 'nt': - return True - try: - import curses - - assert file.isatty() - curses.setupterm() - assert curses.tigetnum("colors") > 0 - except Exception: # noqa: BLE001 - return False - else: - return True - - -def hilite(s, color=None, bold=False): # pragma: no cover - """Return an highlighted version of 'string'.""" - if not term_supports_colors(): - return s - attr = [] - colors = dict( - blue='34', - brown='33', - darkgrey='30', - green='32', - grey='37', - lightblue='36', - red='91', - violet='35', - yellow='93', - ) - colors[None] = '29' - try: - color = colors[color] - except KeyError: - msg = f"invalid color {color!r}; choose amongst {list(colors.keys())}" - raise ValueError(msg) from None - attr.append(color) - if bold: - attr.append('1') - return f"\x1b[{';'.join(attr)}m{s}\x1b[0m" - - -def print_color( - s, color=None, bold=False, file=sys.stdout -): # pragma: no cover - """Print a colorized version of string.""" - if not term_supports_colors(): - print(s, file=file) - elif POSIX: - print(hilite(s, color, bold), file=file) - else: - import ctypes - - DEFAULT_COLOR = 7 - GetStdHandle = ctypes.windll.Kernel32.GetStdHandle - SetConsoleTextAttribute = ( - ctypes.windll.Kernel32.SetConsoleTextAttribute - ) - - colors = dict(green=2, red=4, brown=6, yellow=6) - colors[None] = DEFAULT_COLOR - try: - color = colors[color] - except KeyError: - msg = ( - f"invalid color {color!r}; choose between" - f" {list(colors.keys())!r}" - ) - raise ValueError(msg) from None - if bold and color <= 7: - color += 8 - - handle_id = -12 if file is sys.stderr else -11 - GetStdHandle.restype = ctypes.c_ulong - handle = GetStdHandle(handle_id) - SetConsoleTextAttribute(handle, color) - try: - print(s, file=file) - finally: - SetConsoleTextAttribute(handle, DEFAULT_COLOR) - - -def debug(msg): - """If PSUTIL_DEBUG env var is set, print a debug message to stderr.""" - if PSUTIL_DEBUG: - import inspect - - fname, lineno, _, _lines, _index = inspect.getframeinfo( - inspect.currentframe().f_back - ) - if isinstance(msg, Exception): - if isinstance(msg, OSError): - # ...because str(exc) may contain info about the file name - msg = f"ignoring {msg}" - else: - msg = f"ignoring {msg!r}" - print( # noqa: T201 - f"psutil-debug [{fname}:{lineno}]> {msg}", file=sys.stderr - ) diff --git a/PortablePython/Lib/site-packages/psutil/_psaix.py b/PortablePython/Lib/site-packages/psutil/_psaix.py deleted file mode 100644 index ba2725f..0000000 --- a/PortablePython/Lib/site-packages/psutil/_psaix.py +++ /dev/null @@ -1,565 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola' -# Copyright (c) 2017, Arnon Yaari -# All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""AIX platform implementation.""" - -import functools -import glob -import os -import re -import subprocess -import sys -from collections import namedtuple - -from . import _common -from . import _psposix -from . import _psutil_aix as cext -from . import _psutil_posix as cext_posix -from ._common import NIC_DUPLEX_FULL -from ._common import NIC_DUPLEX_HALF -from ._common import NIC_DUPLEX_UNKNOWN -from ._common import AccessDenied -from ._common import NoSuchProcess -from ._common import ZombieProcess -from ._common import conn_to_ntuple -from ._common import get_procfs_path -from ._common import memoize_when_activated -from ._common import usage_percent - - -__extra__all__ = ["PROCFS_PATH"] - - -# ===================================================================== -# --- globals -# ===================================================================== - - -HAS_THREADS = hasattr(cext, "proc_threads") -HAS_NET_IO_COUNTERS = hasattr(cext, "net_io_counters") -HAS_PROC_IO_COUNTERS = hasattr(cext, "proc_io_counters") - -PAGE_SIZE = cext_posix.getpagesize() -AF_LINK = cext_posix.AF_LINK - -PROC_STATUSES = { - cext.SIDL: _common.STATUS_IDLE, - cext.SZOMB: _common.STATUS_ZOMBIE, - cext.SACTIVE: _common.STATUS_RUNNING, - cext.SSWAP: _common.STATUS_RUNNING, # TODO what status is this? - cext.SSTOP: _common.STATUS_STOPPED, -} - -TCP_STATUSES = { - cext.TCPS_ESTABLISHED: _common.CONN_ESTABLISHED, - cext.TCPS_SYN_SENT: _common.CONN_SYN_SENT, - cext.TCPS_SYN_RCVD: _common.CONN_SYN_RECV, - cext.TCPS_FIN_WAIT_1: _common.CONN_FIN_WAIT1, - cext.TCPS_FIN_WAIT_2: _common.CONN_FIN_WAIT2, - cext.TCPS_TIME_WAIT: _common.CONN_TIME_WAIT, - cext.TCPS_CLOSED: _common.CONN_CLOSE, - cext.TCPS_CLOSE_WAIT: _common.CONN_CLOSE_WAIT, - cext.TCPS_LAST_ACK: _common.CONN_LAST_ACK, - cext.TCPS_LISTEN: _common.CONN_LISTEN, - cext.TCPS_CLOSING: _common.CONN_CLOSING, - cext.PSUTIL_CONN_NONE: _common.CONN_NONE, -} - -proc_info_map = dict( - ppid=0, - rss=1, - vms=2, - create_time=3, - nice=4, - num_threads=5, - status=6, - ttynr=7, -) - - -# ===================================================================== -# --- named tuples -# ===================================================================== - - -# psutil.Process.memory_info() -pmem = namedtuple('pmem', ['rss', 'vms']) -# psutil.Process.memory_full_info() -pfullmem = pmem -# psutil.Process.cpu_times() -scputimes = namedtuple('scputimes', ['user', 'system', 'idle', 'iowait']) -# psutil.virtual_memory() -svmem = namedtuple('svmem', ['total', 'available', 'percent', 'used', 'free']) - - -# ===================================================================== -# --- memory -# ===================================================================== - - -def virtual_memory(): - total, avail, free, _pinned, inuse = cext.virtual_mem() - percent = usage_percent((total - avail), total, round_=1) - return svmem(total, avail, percent, inuse, free) - - -def swap_memory(): - """Swap system memory as a (total, used, free, sin, sout) tuple.""" - total, free, sin, sout = cext.swap_mem() - used = total - free - percent = usage_percent(used, total, round_=1) - return _common.sswap(total, used, free, percent, sin, sout) - - -# ===================================================================== -# --- CPU -# ===================================================================== - - -def cpu_times(): - """Return system-wide CPU times as a named tuple.""" - ret = cext.per_cpu_times() - return scputimes(*[sum(x) for x in zip(*ret)]) - - -def per_cpu_times(): - """Return system per-CPU times as a list of named tuples.""" - ret = cext.per_cpu_times() - return [scputimes(*x) for x in ret] - - -def cpu_count_logical(): - """Return the number of logical CPUs in the system.""" - try: - return os.sysconf("SC_NPROCESSORS_ONLN") - except ValueError: - # mimic os.cpu_count() behavior - return None - - -def cpu_count_cores(): - cmd = ["lsdev", "-Cc", "processor"] - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = p.communicate() - stdout, stderr = (x.decode(sys.stdout.encoding) for x in (stdout, stderr)) - if p.returncode != 0: - msg = f"{cmd!r} command error\n{stderr}" - raise RuntimeError(msg) - processors = stdout.strip().splitlines() - return len(processors) or None - - -def cpu_stats(): - """Return various CPU stats as a named tuple.""" - ctx_switches, interrupts, soft_interrupts, syscalls = cext.cpu_stats() - return _common.scpustats( - ctx_switches, interrupts, soft_interrupts, syscalls - ) - - -# ===================================================================== -# --- disks -# ===================================================================== - - -disk_io_counters = cext.disk_io_counters -disk_usage = _psposix.disk_usage - - -def disk_partitions(all=False): - """Return system disk partitions.""" - # TODO - the filtering logic should be better checked so that - # it tries to reflect 'df' as much as possible - retlist = [] - partitions = cext.disk_partitions() - for partition in partitions: - device, mountpoint, fstype, opts = partition - if device == 'none': - device = '' - if not all: - # Differently from, say, Linux, we don't have a list of - # common fs types so the best we can do, AFAIK, is to - # filter by filesystem having a total size > 0. - if not disk_usage(mountpoint).total: - continue - ntuple = _common.sdiskpart(device, mountpoint, fstype, opts) - retlist.append(ntuple) - return retlist - - -# ===================================================================== -# --- network -# ===================================================================== - - -net_if_addrs = cext_posix.net_if_addrs - -if HAS_NET_IO_COUNTERS: - net_io_counters = cext.net_io_counters - - -def net_connections(kind, _pid=-1): - """Return socket connections. If pid == -1 return system-wide - connections (as opposed to connections opened by one process only). - """ - families, types = _common.conn_tmap[kind] - rawlist = cext.net_connections(_pid) - ret = [] - for item in rawlist: - fd, fam, type_, laddr, raddr, status, pid = item - if fam not in families: - continue - if type_ not in types: - continue - nt = conn_to_ntuple( - fd, - fam, - type_, - laddr, - raddr, - status, - TCP_STATUSES, - pid=pid if _pid == -1 else None, - ) - ret.append(nt) - return ret - - -def net_if_stats(): - """Get NIC stats (isup, duplex, speed, mtu).""" - duplex_map = {"Full": NIC_DUPLEX_FULL, "Half": NIC_DUPLEX_HALF} - names = {x[0] for x in net_if_addrs()} - ret = {} - for name in names: - mtu = cext_posix.net_if_mtu(name) - flags = cext_posix.net_if_flags(name) - - # try to get speed and duplex - # TODO: rewrite this in C (entstat forks, so use truss -f to follow. - # looks like it is using an undocumented ioctl?) - duplex = "" - speed = 0 - p = subprocess.Popen( - ["/usr/bin/entstat", "-d", name], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = p.communicate() - stdout, stderr = ( - x.decode(sys.stdout.encoding) for x in (stdout, stderr) - ) - if p.returncode == 0: - re_result = re.search( - r"Running: (\d+) Mbps.*?(\w+) Duplex", stdout - ) - if re_result is not None: - speed = int(re_result.group(1)) - duplex = re_result.group(2) - - output_flags = ','.join(flags) - isup = 'running' in flags - duplex = duplex_map.get(duplex, NIC_DUPLEX_UNKNOWN) - ret[name] = _common.snicstats(isup, duplex, speed, mtu, output_flags) - return ret - - -# ===================================================================== -# --- other system functions -# ===================================================================== - - -def boot_time(): - """The system boot time expressed in seconds since the epoch.""" - return cext.boot_time() - - -def users(): - """Return currently connected users as a list of namedtuples.""" - retlist = [] - rawlist = cext.users() - localhost = (':0.0', ':0') - for item in rawlist: - user, tty, hostname, tstamp, user_process, pid = item - # note: the underlying C function includes entries about - # system boot, run level and others. We might want - # to use them in the future. - if not user_process: - continue - if hostname in localhost: - hostname = 'localhost' - nt = _common.suser(user, tty, hostname, tstamp, pid) - retlist.append(nt) - return retlist - - -# ===================================================================== -# --- processes -# ===================================================================== - - -def pids(): - """Returns a list of PIDs currently running on the system.""" - return [int(x) for x in os.listdir(get_procfs_path()) if x.isdigit()] - - -def pid_exists(pid): - """Check for the existence of a unix pid.""" - return os.path.exists(os.path.join(get_procfs_path(), str(pid), "psinfo")) - - -def wrap_exceptions(fun): - """Call callable into a try/except clause and translate ENOENT, - EACCES and EPERM in NoSuchProcess or AccessDenied exceptions. - """ - - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - pid, ppid, name = self.pid, self._ppid, self._name - try: - return fun(self, *args, **kwargs) - except (FileNotFoundError, ProcessLookupError) as err: - # ENOENT (no such file or directory) gets raised on open(). - # ESRCH (no such process) can get raised on read() if - # process is gone in meantime. - if not pid_exists(pid): - raise NoSuchProcess(pid, name) from err - raise ZombieProcess(pid, name, ppid) from err - except PermissionError as err: - raise AccessDenied(pid, name) from err - - return wrapper - - -class Process: - """Wrapper class around underlying C implementation.""" - - __slots__ = ["_cache", "_name", "_ppid", "_procfs_path", "pid"] - - def __init__(self, pid): - self.pid = pid - self._name = None - self._ppid = None - self._procfs_path = get_procfs_path() - - def oneshot_enter(self): - self._proc_basic_info.cache_activate(self) - self._proc_cred.cache_activate(self) - - def oneshot_exit(self): - self._proc_basic_info.cache_deactivate(self) - self._proc_cred.cache_deactivate(self) - - @wrap_exceptions - @memoize_when_activated - def _proc_basic_info(self): - return cext.proc_basic_info(self.pid, self._procfs_path) - - @wrap_exceptions - @memoize_when_activated - def _proc_cred(self): - return cext.proc_cred(self.pid, self._procfs_path) - - @wrap_exceptions - def name(self): - if self.pid == 0: - return "swapper" - # note: max 16 characters - return cext.proc_name(self.pid, self._procfs_path).rstrip("\x00") - - @wrap_exceptions - def exe(self): - # there is no way to get executable path in AIX other than to guess, - # and guessing is more complex than what's in the wrapping class - cmdline = self.cmdline() - if not cmdline: - return '' - exe = cmdline[0] - if os.path.sep in exe: - # relative or absolute path - if not os.path.isabs(exe): - # if cwd has changed, we're out of luck - this may be wrong! - exe = os.path.abspath(os.path.join(self.cwd(), exe)) - if ( - os.path.isabs(exe) - and os.path.isfile(exe) - and os.access(exe, os.X_OK) - ): - return exe - # not found, move to search in PATH using basename only - exe = os.path.basename(exe) - # search for exe name PATH - for path in os.environ["PATH"].split(":"): - possible_exe = os.path.abspath(os.path.join(path, exe)) - if os.path.isfile(possible_exe) and os.access( - possible_exe, os.X_OK - ): - return possible_exe - return '' - - @wrap_exceptions - def cmdline(self): - return cext.proc_args(self.pid) - - @wrap_exceptions - def environ(self): - return cext.proc_environ(self.pid) - - @wrap_exceptions - def create_time(self): - return self._proc_basic_info()[proc_info_map['create_time']] - - @wrap_exceptions - def num_threads(self): - return self._proc_basic_info()[proc_info_map['num_threads']] - - if HAS_THREADS: - - @wrap_exceptions - def threads(self): - rawlist = cext.proc_threads(self.pid) - retlist = [] - for thread_id, utime, stime in rawlist: - ntuple = _common.pthread(thread_id, utime, stime) - retlist.append(ntuple) - # The underlying C implementation retrieves all OS threads - # and filters them by PID. At this point we can't tell whether - # an empty list means there were no connections for process or - # process is no longer active so we force NSP in case the PID - # is no longer there. - if not retlist: - # will raise NSP if process is gone - os.stat(f"{self._procfs_path}/{self.pid}") - return retlist - - @wrap_exceptions - def net_connections(self, kind='inet'): - ret = net_connections(kind, _pid=self.pid) - # The underlying C implementation retrieves all OS connections - # and filters them by PID. At this point we can't tell whether - # an empty list means there were no connections for process or - # process is no longer active so we force NSP in case the PID - # is no longer there. - if not ret: - # will raise NSP if process is gone - os.stat(f"{self._procfs_path}/{self.pid}") - return ret - - @wrap_exceptions - def nice_get(self): - return cext_posix.getpriority(self.pid) - - @wrap_exceptions - def nice_set(self, value): - return cext_posix.setpriority(self.pid, value) - - @wrap_exceptions - def ppid(self): - self._ppid = self._proc_basic_info()[proc_info_map['ppid']] - return self._ppid - - @wrap_exceptions - def uids(self): - real, effective, saved, _, _, _ = self._proc_cred() - return _common.puids(real, effective, saved) - - @wrap_exceptions - def gids(self): - _, _, _, real, effective, saved = self._proc_cred() - return _common.puids(real, effective, saved) - - @wrap_exceptions - def cpu_times(self): - t = cext.proc_cpu_times(self.pid, self._procfs_path) - return _common.pcputimes(*t) - - @wrap_exceptions - def terminal(self): - ttydev = self._proc_basic_info()[proc_info_map['ttynr']] - # convert from 64-bit dev_t to 32-bit dev_t and then map the device - ttydev = ((ttydev & 0x0000FFFF00000000) >> 16) | (ttydev & 0xFFFF) - # try to match rdev of /dev/pts/* files ttydev - for dev in glob.glob("/dev/**/*"): - if os.stat(dev).st_rdev == ttydev: - return dev - return None - - @wrap_exceptions - def cwd(self): - procfs_path = self._procfs_path - try: - result = os.readlink(f"{procfs_path}/{self.pid}/cwd") - return result.rstrip('/') - except FileNotFoundError: - os.stat(f"{procfs_path}/{self.pid}") # raise NSP or AD - return "" - - @wrap_exceptions - def memory_info(self): - ret = self._proc_basic_info() - rss = ret[proc_info_map['rss']] * 1024 - vms = ret[proc_info_map['vms']] * 1024 - return pmem(rss, vms) - - memory_full_info = memory_info - - @wrap_exceptions - def status(self): - code = self._proc_basic_info()[proc_info_map['status']] - # XXX is '?' legit? (we're not supposed to return it anyway) - return PROC_STATUSES.get(code, '?') - - def open_files(self): - # TODO rewrite without using procfiles (stat /proc/pid/fd/* and then - # find matching name of the inode) - p = subprocess.Popen( - ["/usr/bin/procfiles", "-n", str(self.pid)], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = p.communicate() - stdout, stderr = ( - x.decode(sys.stdout.encoding) for x in (stdout, stderr) - ) - if "no such process" in stderr.lower(): - raise NoSuchProcess(self.pid, self._name) - procfiles = re.findall(r"(\d+): S_IFREG.*name:(.*)\n", stdout) - retlist = [] - for fd, path in procfiles: - path = path.strip() - if path.startswith("//"): - path = path[1:] - if path.lower() == "cannot be retrieved": - continue - retlist.append(_common.popenfile(path, int(fd))) - return retlist - - @wrap_exceptions - def num_fds(self): - if self.pid == 0: # no /proc/0/fd - return 0 - return len(os.listdir(f"{self._procfs_path}/{self.pid}/fd")) - - @wrap_exceptions - def num_ctx_switches(self): - return _common.pctxsw(*cext.proc_num_ctx_switches(self.pid)) - - @wrap_exceptions - def wait(self, timeout=None): - return _psposix.wait_pid(self.pid, timeout, self._name) - - if HAS_PROC_IO_COUNTERS: - - @wrap_exceptions - def io_counters(self): - try: - rc, wc, rb, wb = cext.proc_io_counters(self.pid) - except OSError as err: - # if process is terminated, proc_io_counters returns OSError - # instead of NSP - if not pid_exists(self.pid): - raise NoSuchProcess(self.pid, self._name) from err - raise - return _common.pio(rc, wc, rb, wb) diff --git a/PortablePython/Lib/site-packages/psutil/_psbsd.py b/PortablePython/Lib/site-packages/psutil/_psbsd.py deleted file mode 100644 index 13bd926..0000000 --- a/PortablePython/Lib/site-packages/psutil/_psbsd.py +++ /dev/null @@ -1,971 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""FreeBSD, OpenBSD and NetBSD platforms implementation.""" - -import contextlib -import errno -import functools -import os -from collections import defaultdict -from collections import namedtuple -from xml.etree import ElementTree # noqa: ICN001 - -from . import _common -from . import _psposix -from . import _psutil_bsd as cext -from . import _psutil_posix as cext_posix -from ._common import FREEBSD -from ._common import NETBSD -from ._common import OPENBSD -from ._common import AccessDenied -from ._common import NoSuchProcess -from ._common import ZombieProcess -from ._common import conn_tmap -from ._common import conn_to_ntuple -from ._common import debug -from ._common import memoize -from ._common import memoize_when_activated -from ._common import usage_percent - - -__extra__all__ = [] - - -# ===================================================================== -# --- globals -# ===================================================================== - - -if FREEBSD: - PROC_STATUSES = { - cext.SIDL: _common.STATUS_IDLE, - cext.SRUN: _common.STATUS_RUNNING, - cext.SSLEEP: _common.STATUS_SLEEPING, - cext.SSTOP: _common.STATUS_STOPPED, - cext.SZOMB: _common.STATUS_ZOMBIE, - cext.SWAIT: _common.STATUS_WAITING, - cext.SLOCK: _common.STATUS_LOCKED, - } -elif OPENBSD: - PROC_STATUSES = { - cext.SIDL: _common.STATUS_IDLE, - cext.SSLEEP: _common.STATUS_SLEEPING, - cext.SSTOP: _common.STATUS_STOPPED, - # According to /usr/include/sys/proc.h SZOMB is unused. - # test_zombie_process() shows that SDEAD is the right - # equivalent. Also it appears there's no equivalent of - # psutil.STATUS_DEAD. SDEAD really means STATUS_ZOMBIE. - # cext.SZOMB: _common.STATUS_ZOMBIE, - cext.SDEAD: _common.STATUS_ZOMBIE, - cext.SZOMB: _common.STATUS_ZOMBIE, - # From http://www.eecs.harvard.edu/~margo/cs161/videos/proc.h.txt - # OpenBSD has SRUN and SONPROC: SRUN indicates that a process - # is runnable but *not* yet running, i.e. is on a run queue. - # SONPROC indicates that the process is actually executing on - # a CPU, i.e. it is no longer on a run queue. - # As such we'll map SRUN to STATUS_WAKING and SONPROC to - # STATUS_RUNNING - cext.SRUN: _common.STATUS_WAKING, - cext.SONPROC: _common.STATUS_RUNNING, - } -elif NETBSD: - PROC_STATUSES = { - cext.SIDL: _common.STATUS_IDLE, - cext.SSLEEP: _common.STATUS_SLEEPING, - cext.SSTOP: _common.STATUS_STOPPED, - cext.SZOMB: _common.STATUS_ZOMBIE, - cext.SRUN: _common.STATUS_WAKING, - cext.SONPROC: _common.STATUS_RUNNING, - } - -TCP_STATUSES = { - cext.TCPS_ESTABLISHED: _common.CONN_ESTABLISHED, - cext.TCPS_SYN_SENT: _common.CONN_SYN_SENT, - cext.TCPS_SYN_RECEIVED: _common.CONN_SYN_RECV, - cext.TCPS_FIN_WAIT_1: _common.CONN_FIN_WAIT1, - cext.TCPS_FIN_WAIT_2: _common.CONN_FIN_WAIT2, - cext.TCPS_TIME_WAIT: _common.CONN_TIME_WAIT, - cext.TCPS_CLOSED: _common.CONN_CLOSE, - cext.TCPS_CLOSE_WAIT: _common.CONN_CLOSE_WAIT, - cext.TCPS_LAST_ACK: _common.CONN_LAST_ACK, - cext.TCPS_LISTEN: _common.CONN_LISTEN, - cext.TCPS_CLOSING: _common.CONN_CLOSING, - cext.PSUTIL_CONN_NONE: _common.CONN_NONE, -} - -PAGESIZE = cext_posix.getpagesize() -AF_LINK = cext_posix.AF_LINK - -HAS_PER_CPU_TIMES = hasattr(cext, "per_cpu_times") -HAS_PROC_NUM_THREADS = hasattr(cext, "proc_num_threads") -HAS_PROC_OPEN_FILES = hasattr(cext, 'proc_open_files') -HAS_PROC_NUM_FDS = hasattr(cext, 'proc_num_fds') - -kinfo_proc_map = dict( - ppid=0, - status=1, - real_uid=2, - effective_uid=3, - saved_uid=4, - real_gid=5, - effective_gid=6, - saved_gid=7, - ttynr=8, - create_time=9, - ctx_switches_vol=10, - ctx_switches_unvol=11, - read_io_count=12, - write_io_count=13, - user_time=14, - sys_time=15, - ch_user_time=16, - ch_sys_time=17, - rss=18, - vms=19, - memtext=20, - memdata=21, - memstack=22, - cpunum=23, - name=24, -) - - -# ===================================================================== -# --- named tuples -# ===================================================================== - - -# fmt: off -# psutil.virtual_memory() -svmem = namedtuple( - 'svmem', ['total', 'available', 'percent', 'used', 'free', - 'active', 'inactive', 'buffers', 'cached', 'shared', 'wired']) -# psutil.cpu_times() -scputimes = namedtuple( - 'scputimes', ['user', 'nice', 'system', 'idle', 'irq']) -# psutil.Process.memory_info() -pmem = namedtuple('pmem', ['rss', 'vms', 'text', 'data', 'stack']) -# psutil.Process.memory_full_info() -pfullmem = pmem -# psutil.Process.cpu_times() -pcputimes = namedtuple('pcputimes', - ['user', 'system', 'children_user', 'children_system']) -# psutil.Process.memory_maps(grouped=True) -pmmap_grouped = namedtuple( - 'pmmap_grouped', 'path rss, private, ref_count, shadow_count') -# psutil.Process.memory_maps(grouped=False) -pmmap_ext = namedtuple( - 'pmmap_ext', 'addr, perms path rss, private, ref_count, shadow_count') -# psutil.disk_io_counters() -if FREEBSD: - sdiskio = namedtuple('sdiskio', ['read_count', 'write_count', - 'read_bytes', 'write_bytes', - 'read_time', 'write_time', - 'busy_time']) -else: - sdiskio = namedtuple('sdiskio', ['read_count', 'write_count', - 'read_bytes', 'write_bytes']) -# fmt: on - - -# ===================================================================== -# --- memory -# ===================================================================== - - -def virtual_memory(): - mem = cext.virtual_mem() - if NETBSD: - total, free, active, inactive, wired, cached = mem - # On NetBSD buffers and shared mem is determined via /proc. - # The C ext set them to 0. - with open('/proc/meminfo', 'rb') as f: - for line in f: - if line.startswith(b'Buffers:'): - buffers = int(line.split()[1]) * 1024 - elif line.startswith(b'MemShared:'): - shared = int(line.split()[1]) * 1024 - # Before avail was calculated as (inactive + cached + free), - # same as zabbix, but it turned out it could exceed total (see - # #2233), so zabbix seems to be wrong. Htop calculates it - # differently, and the used value seem more realistic, so let's - # match htop. - # https://github.com/htop-dev/htop/blob/e7f447b/netbsd/NetBSDProcessList.c#L162 - # https://github.com/zabbix/zabbix/blob/af5e0f8/src/libs/zbxsysinfo/netbsd/memory.c#L135 - used = active + wired - avail = total - used - else: - total, free, active, inactive, wired, cached, buffers, shared = mem - # matches freebsd-memory CLI: - # * https://people.freebsd.org/~rse/dist/freebsd-memory - # * https://www.cyberciti.biz/files/scripts/freebsd-memory.pl.txt - # matches zabbix: - # * https://github.com/zabbix/zabbix/blob/af5e0f8/src/libs/zbxsysinfo/freebsd/memory.c#L143 - avail = inactive + cached + free - used = active + wired + cached - - percent = usage_percent((total - avail), total, round_=1) - return svmem( - total, - avail, - percent, - used, - free, - active, - inactive, - buffers, - cached, - shared, - wired, - ) - - -def swap_memory(): - """System swap memory as (total, used, free, sin, sout) namedtuple.""" - total, used, free, sin, sout = cext.swap_mem() - percent = usage_percent(used, total, round_=1) - return _common.sswap(total, used, free, percent, sin, sout) - - -# ===================================================================== -# --- CPU -# ===================================================================== - - -def cpu_times(): - """Return system per-CPU times as a namedtuple.""" - user, nice, system, idle, irq = cext.cpu_times() - return scputimes(user, nice, system, idle, irq) - - -if HAS_PER_CPU_TIMES: - - def per_cpu_times(): - """Return system CPU times as a namedtuple.""" - ret = [] - for cpu_t in cext.per_cpu_times(): - user, nice, system, idle, irq = cpu_t - item = scputimes(user, nice, system, idle, irq) - ret.append(item) - return ret - -else: - # XXX - # Ok, this is very dirty. - # On FreeBSD < 8 we cannot gather per-cpu information, see: - # https://github.com/giampaolo/psutil/issues/226 - # If num cpus > 1, on first call we return single cpu times to avoid a - # crash at psutil import time. - # Next calls will fail with NotImplementedError - def per_cpu_times(): - """Return system CPU times as a namedtuple.""" - if cpu_count_logical() == 1: - return [cpu_times()] - if per_cpu_times.__called__: - msg = "supported only starting from FreeBSD 8" - raise NotImplementedError(msg) - per_cpu_times.__called__ = True - return [cpu_times()] - - per_cpu_times.__called__ = False - - -def cpu_count_logical(): - """Return the number of logical CPUs in the system.""" - return cext.cpu_count_logical() - - -if OPENBSD or NETBSD: - - def cpu_count_cores(): - # OpenBSD and NetBSD do not implement this. - return 1 if cpu_count_logical() == 1 else None - -else: - - def cpu_count_cores(): - """Return the number of CPU cores in the system.""" - # From the C module we'll get an XML string similar to this: - # http://manpages.ubuntu.com/manpages/precise/man4/smp.4freebsd.html - # We may get None in case "sysctl kern.sched.topology_spec" - # is not supported on this BSD version, in which case we'll mimic - # os.cpu_count() and return None. - ret = None - s = cext.cpu_topology() - if s is not None: - # get rid of padding chars appended at the end of the string - index = s.rfind("") - if index != -1: - s = s[: index + 9] - root = ElementTree.fromstring(s) - try: - ret = len(root.findall('group/children/group/cpu')) or None - finally: - # needed otherwise it will memleak - root.clear() - if not ret: - # If logical CPUs == 1 it's obvious we' have only 1 core. - if cpu_count_logical() == 1: - return 1 - return ret - - -def cpu_stats(): - """Return various CPU stats as a named tuple.""" - if FREEBSD: - # Note: the C ext is returning some metrics we are not exposing: - # traps. - ctxsw, intrs, soft_intrs, syscalls, _traps = cext.cpu_stats() - elif NETBSD: - # XXX - # Note about intrs: the C extension returns 0. intrs - # can be determined via /proc/stat; it has the same value as - # soft_intrs thought so the kernel is faking it (?). - # - # Note about syscalls: the C extension always sets it to 0 (?). - # - # Note: the C ext is returning some metrics we are not exposing: - # traps, faults and forks. - ctxsw, intrs, soft_intrs, syscalls, _traps, _faults, _forks = ( - cext.cpu_stats() - ) - with open('/proc/stat', 'rb') as f: - for line in f: - if line.startswith(b'intr'): - intrs = int(line.split()[1]) - elif OPENBSD: - # Note: the C ext is returning some metrics we are not exposing: - # traps, faults and forks. - ctxsw, intrs, soft_intrs, syscalls, _traps, _faults, _forks = ( - cext.cpu_stats() - ) - return _common.scpustats(ctxsw, intrs, soft_intrs, syscalls) - - -if FREEBSD: - - def cpu_freq(): - """Return frequency metrics for CPUs. As of Dec 2018 only - CPU 0 appears to be supported by FreeBSD and all other cores - match the frequency of CPU 0. - """ - ret = [] - num_cpus = cpu_count_logical() - for cpu in range(num_cpus): - try: - current, available_freq = cext.cpu_freq(cpu) - except NotImplementedError: - continue - if available_freq: - try: - min_freq = int(available_freq.split(" ")[-1].split("/")[0]) - except (IndexError, ValueError): - min_freq = None - try: - max_freq = int(available_freq.split(" ")[0].split("/")[0]) - except (IndexError, ValueError): - max_freq = None - ret.append(_common.scpufreq(current, min_freq, max_freq)) - return ret - -elif OPENBSD: - - def cpu_freq(): - curr = float(cext.cpu_freq()) - return [_common.scpufreq(curr, 0.0, 0.0)] - - -# ===================================================================== -# --- disks -# ===================================================================== - - -def disk_partitions(all=False): - """Return mounted disk partitions as a list of namedtuples. - 'all' argument is ignored, see: - https://github.com/giampaolo/psutil/issues/906. - """ - retlist = [] - partitions = cext.disk_partitions() - for partition in partitions: - device, mountpoint, fstype, opts = partition - ntuple = _common.sdiskpart(device, mountpoint, fstype, opts) - retlist.append(ntuple) - return retlist - - -disk_usage = _psposix.disk_usage -disk_io_counters = cext.disk_io_counters - - -# ===================================================================== -# --- network -# ===================================================================== - - -net_io_counters = cext.net_io_counters -net_if_addrs = cext_posix.net_if_addrs - - -def net_if_stats(): - """Get NIC stats (isup, duplex, speed, mtu).""" - names = net_io_counters().keys() - ret = {} - for name in names: - try: - mtu = cext_posix.net_if_mtu(name) - flags = cext_posix.net_if_flags(name) - duplex, speed = cext_posix.net_if_duplex_speed(name) - except OSError as err: - # https://github.com/giampaolo/psutil/issues/1279 - if err.errno != errno.ENODEV: - raise - else: - if hasattr(_common, 'NicDuplex'): - duplex = _common.NicDuplex(duplex) - output_flags = ','.join(flags) - isup = 'running' in flags - ret[name] = _common.snicstats( - isup, duplex, speed, mtu, output_flags - ) - return ret - - -def net_connections(kind): - """System-wide network connections.""" - families, types = conn_tmap[kind] - ret = set() - if OPENBSD: - rawlist = cext.net_connections(-1, families, types) - elif NETBSD: - rawlist = cext.net_connections(-1, kind) - else: # FreeBSD - rawlist = cext.net_connections(families, types) - - for item in rawlist: - fd, fam, type, laddr, raddr, status, pid = item - nt = conn_to_ntuple( - fd, fam, type, laddr, raddr, status, TCP_STATUSES, pid - ) - ret.add(nt) - return list(ret) - - -# ===================================================================== -# --- sensors -# ===================================================================== - - -if FREEBSD: - - def sensors_battery(): - """Return battery info.""" - try: - percent, minsleft, power_plugged = cext.sensors_battery() - except NotImplementedError: - # See: https://github.com/giampaolo/psutil/issues/1074 - return None - power_plugged = power_plugged == 1 - if power_plugged: - secsleft = _common.POWER_TIME_UNLIMITED - elif minsleft == -1: - secsleft = _common.POWER_TIME_UNKNOWN - else: - secsleft = minsleft * 60 - return _common.sbattery(percent, secsleft, power_plugged) - - def sensors_temperatures(): - """Return CPU cores temperatures if available, else an empty dict.""" - ret = defaultdict(list) - num_cpus = cpu_count_logical() - for cpu in range(num_cpus): - try: - current, high = cext.sensors_cpu_temperature(cpu) - if high <= 0: - high = None - name = f"Core {cpu}" - ret["coretemp"].append( - _common.shwtemp(name, current, high, high) - ) - except NotImplementedError: - pass - - return ret - - -# ===================================================================== -# --- other system functions -# ===================================================================== - - -def boot_time(): - """The system boot time expressed in seconds since the epoch.""" - return cext.boot_time() - - -def users(): - """Return currently connected users as a list of namedtuples.""" - retlist = [] - rawlist = cext.users() - for item in rawlist: - user, tty, hostname, tstamp, pid = item - if pid == -1: - assert OPENBSD - pid = None - if tty == '~': - continue # reboot or shutdown - nt = _common.suser(user, tty or None, hostname, tstamp, pid) - retlist.append(nt) - return retlist - - -# ===================================================================== -# --- processes -# ===================================================================== - - -@memoize -def _pid_0_exists(): - try: - Process(0).name() - except NoSuchProcess: - return False - except AccessDenied: - return True - else: - return True - - -def pids(): - """Returns a list of PIDs currently running on the system.""" - ret = cext.pids() - if OPENBSD and (0 not in ret) and _pid_0_exists(): - # On OpenBSD the kernel does not return PID 0 (neither does - # ps) but it's actually querable (Process(0) will succeed). - ret.insert(0, 0) - return ret - - -if NETBSD: - - def pid_exists(pid): - exists = _psposix.pid_exists(pid) - if not exists: - # We do this because _psposix.pid_exists() lies in case of - # zombie processes. - return pid in pids() - else: - return True - -elif OPENBSD: - - def pid_exists(pid): - exists = _psposix.pid_exists(pid) - if not exists: - return False - else: - # OpenBSD seems to be the only BSD platform where - # _psposix.pid_exists() returns True for thread IDs (tids), - # so we can't use it. - return pid in pids() - -else: # FreeBSD - pid_exists = _psposix.pid_exists - - -def is_zombie(pid): - try: - st = cext.proc_oneshot_info(pid)[kinfo_proc_map['status']] - return PROC_STATUSES.get(st) == _common.STATUS_ZOMBIE - except OSError: - return False - - -def wrap_exceptions(fun): - """Decorator which translates bare OSError exceptions into - NoSuchProcess and AccessDenied. - """ - - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - pid, ppid, name = self.pid, self._ppid, self._name - try: - return fun(self, *args, **kwargs) - except ProcessLookupError as err: - if is_zombie(pid): - raise ZombieProcess(pid, name, ppid) from err - raise NoSuchProcess(pid, name) from err - except PermissionError as err: - raise AccessDenied(pid, name) from err - except OSError as err: - if pid == 0 and 0 in pids(): - raise AccessDenied(pid, name) from err - raise - - return wrapper - - -@contextlib.contextmanager -def wrap_exceptions_procfs(inst): - """Same as above, for routines relying on reading /proc fs.""" - pid, name, ppid = inst.pid, inst._name, inst._ppid - try: - yield - except (ProcessLookupError, FileNotFoundError) as err: - # ENOENT (no such file or directory) gets raised on open(). - # ESRCH (no such process) can get raised on read() if - # process is gone in meantime. - if is_zombie(inst.pid): - raise ZombieProcess(pid, name, ppid) from err - else: - raise NoSuchProcess(pid, name) from err - except PermissionError as err: - raise AccessDenied(pid, name) from err - - -class Process: - """Wrapper class around underlying C implementation.""" - - __slots__ = ["_cache", "_name", "_ppid", "pid"] - - def __init__(self, pid): - self.pid = pid - self._name = None - self._ppid = None - - def _assert_alive(self): - """Raise NSP if the process disappeared on us.""" - # For those C function who do not raise NSP, possibly returning - # incorrect or incomplete result. - cext.proc_name(self.pid) - - @wrap_exceptions - @memoize_when_activated - def oneshot(self): - """Retrieves multiple process info in one shot as a raw tuple.""" - ret = cext.proc_oneshot_info(self.pid) - assert len(ret) == len(kinfo_proc_map) - return ret - - def oneshot_enter(self): - self.oneshot.cache_activate(self) - - def oneshot_exit(self): - self.oneshot.cache_deactivate(self) - - @wrap_exceptions - def name(self): - name = self.oneshot()[kinfo_proc_map['name']] - return name if name is not None else cext.proc_name(self.pid) - - @wrap_exceptions - def exe(self): - if FREEBSD: - if self.pid == 0: - return '' # else NSP - return cext.proc_exe(self.pid) - elif NETBSD: - if self.pid == 0: - # /proc/0 dir exists but /proc/0/exe doesn't - return "" - with wrap_exceptions_procfs(self): - return os.readlink(f"/proc/{self.pid}/exe") - else: - # OpenBSD: exe cannot be determined; references: - # https://chromium.googlesource.com/chromium/src/base/+/ - # master/base_paths_posix.cc - # We try our best guess by using which against the first - # cmdline arg (may return None). - import shutil - - cmdline = self.cmdline() - if cmdline: - return shutil.which(cmdline[0]) or "" - else: - return "" - - @wrap_exceptions - def cmdline(self): - if OPENBSD and self.pid == 0: - return [] # ...else it crashes - elif NETBSD: - # XXX - most of the times the underlying sysctl() call on - # NetBSD and OpenBSD returns a truncated string. Also - # /proc/pid/cmdline behaves the same so it looks like this - # is a kernel bug. - try: - return cext.proc_cmdline(self.pid) - except OSError as err: - if err.errno == errno.EINVAL: - pid, name, ppid = self.pid, self._name, self._ppid - if is_zombie(self.pid): - raise ZombieProcess(pid, name, ppid) from err - if not pid_exists(self.pid): - raise NoSuchProcess(pid, name, ppid) from err - # XXX: this happens with unicode tests. It means the C - # routine is unable to decode invalid unicode chars. - debug(f"ignoring {err!r} and returning an empty list") - return [] - else: - raise - else: - return cext.proc_cmdline(self.pid) - - @wrap_exceptions - def environ(self): - return cext.proc_environ(self.pid) - - @wrap_exceptions - def terminal(self): - tty_nr = self.oneshot()[kinfo_proc_map['ttynr']] - tmap = _psposix.get_terminal_map() - try: - return tmap[tty_nr] - except KeyError: - return None - - @wrap_exceptions - def ppid(self): - self._ppid = self.oneshot()[kinfo_proc_map['ppid']] - return self._ppid - - @wrap_exceptions - def uids(self): - rawtuple = self.oneshot() - return _common.puids( - rawtuple[kinfo_proc_map['real_uid']], - rawtuple[kinfo_proc_map['effective_uid']], - rawtuple[kinfo_proc_map['saved_uid']], - ) - - @wrap_exceptions - def gids(self): - rawtuple = self.oneshot() - return _common.pgids( - rawtuple[kinfo_proc_map['real_gid']], - rawtuple[kinfo_proc_map['effective_gid']], - rawtuple[kinfo_proc_map['saved_gid']], - ) - - @wrap_exceptions - def cpu_times(self): - rawtuple = self.oneshot() - return _common.pcputimes( - rawtuple[kinfo_proc_map['user_time']], - rawtuple[kinfo_proc_map['sys_time']], - rawtuple[kinfo_proc_map['ch_user_time']], - rawtuple[kinfo_proc_map['ch_sys_time']], - ) - - if FREEBSD: - - @wrap_exceptions - def cpu_num(self): - return self.oneshot()[kinfo_proc_map['cpunum']] - - @wrap_exceptions - def memory_info(self): - rawtuple = self.oneshot() - return pmem( - rawtuple[kinfo_proc_map['rss']], - rawtuple[kinfo_proc_map['vms']], - rawtuple[kinfo_proc_map['memtext']], - rawtuple[kinfo_proc_map['memdata']], - rawtuple[kinfo_proc_map['memstack']], - ) - - memory_full_info = memory_info - - @wrap_exceptions - def create_time(self): - return self.oneshot()[kinfo_proc_map['create_time']] - - @wrap_exceptions - def num_threads(self): - if HAS_PROC_NUM_THREADS: - # FreeBSD - return cext.proc_num_threads(self.pid) - else: - return len(self.threads()) - - @wrap_exceptions - def num_ctx_switches(self): - rawtuple = self.oneshot() - return _common.pctxsw( - rawtuple[kinfo_proc_map['ctx_switches_vol']], - rawtuple[kinfo_proc_map['ctx_switches_unvol']], - ) - - @wrap_exceptions - def threads(self): - # Note: on OpenSBD this (/dev/mem) requires root access. - rawlist = cext.proc_threads(self.pid) - retlist = [] - for thread_id, utime, stime in rawlist: - ntuple = _common.pthread(thread_id, utime, stime) - retlist.append(ntuple) - if OPENBSD: - self._assert_alive() - return retlist - - @wrap_exceptions - def net_connections(self, kind='inet'): - families, types = conn_tmap[kind] - ret = [] - - if NETBSD: - rawlist = cext.net_connections(self.pid, kind) - elif OPENBSD: - rawlist = cext.net_connections(self.pid, families, types) - else: - rawlist = cext.proc_net_connections(self.pid, families, types) - - for item in rawlist: - fd, fam, type, laddr, raddr, status = item[:6] - if FREEBSD: - if (fam not in families) or (type not in types): - continue - nt = conn_to_ntuple( - fd, fam, type, laddr, raddr, status, TCP_STATUSES - ) - ret.append(nt) - - self._assert_alive() - return ret - - @wrap_exceptions - def wait(self, timeout=None): - return _psposix.wait_pid(self.pid, timeout, self._name) - - @wrap_exceptions - def nice_get(self): - return cext_posix.getpriority(self.pid) - - @wrap_exceptions - def nice_set(self, value): - return cext_posix.setpriority(self.pid, value) - - @wrap_exceptions - def status(self): - code = self.oneshot()[kinfo_proc_map['status']] - # XXX is '?' legit? (we're not supposed to return it anyway) - return PROC_STATUSES.get(code, '?') - - @wrap_exceptions - def io_counters(self): - rawtuple = self.oneshot() - return _common.pio( - rawtuple[kinfo_proc_map['read_io_count']], - rawtuple[kinfo_proc_map['write_io_count']], - -1, - -1, - ) - - @wrap_exceptions - def cwd(self): - """Return process current working directory.""" - # sometimes we get an empty string, in which case we turn - # it into None - if OPENBSD and self.pid == 0: - return "" # ...else it would raise EINVAL - elif NETBSD or HAS_PROC_OPEN_FILES: - # FreeBSD < 8 does not support functions based on - # kinfo_getfile() and kinfo_getvmmap() - return cext.proc_cwd(self.pid) - else: - raise NotImplementedError( - "supported only starting from FreeBSD 8" if FREEBSD else "" - ) - - nt_mmap_grouped = namedtuple( - 'mmap', 'path rss, private, ref_count, shadow_count' - ) - nt_mmap_ext = namedtuple( - 'mmap', 'addr, perms path rss, private, ref_count, shadow_count' - ) - - def _not_implemented(self): - raise NotImplementedError - - # FreeBSD < 8 does not support functions based on kinfo_getfile() - # and kinfo_getvmmap() - if HAS_PROC_OPEN_FILES: - - @wrap_exceptions - def open_files(self): - """Return files opened by process as a list of namedtuples.""" - rawlist = cext.proc_open_files(self.pid) - return [_common.popenfile(path, fd) for path, fd in rawlist] - - else: - open_files = _not_implemented - - # FreeBSD < 8 does not support functions based on kinfo_getfile() - # and kinfo_getvmmap() - if HAS_PROC_NUM_FDS: - - @wrap_exceptions - def num_fds(self): - """Return the number of file descriptors opened by this process.""" - ret = cext.proc_num_fds(self.pid) - if NETBSD: - self._assert_alive() - return ret - - else: - num_fds = _not_implemented - - # --- FreeBSD only APIs - - if FREEBSD: - - @wrap_exceptions - def cpu_affinity_get(self): - return cext.proc_cpu_affinity_get(self.pid) - - @wrap_exceptions - def cpu_affinity_set(self, cpus): - # Pre-emptively check if CPUs are valid because the C - # function has a weird behavior in case of invalid CPUs, - # see: https://github.com/giampaolo/psutil/issues/586 - allcpus = set(range(len(per_cpu_times()))) - for cpu in cpus: - if cpu not in allcpus: - msg = f"invalid CPU {cpu!r} (choose between {allcpus})" - raise ValueError(msg) - try: - cext.proc_cpu_affinity_set(self.pid, cpus) - except OSError as err: - # 'man cpuset_setaffinity' about EDEADLK: - # <> - if err.errno in {errno.EINVAL, errno.EDEADLK}: - for cpu in cpus: - if cpu not in allcpus: - msg = ( - f"invalid CPU {cpu!r} (choose between" - f" {allcpus})" - ) - raise ValueError(msg) from err - raise - - @wrap_exceptions - def memory_maps(self): - return cext.proc_memory_maps(self.pid) - - @wrap_exceptions - def rlimit(self, resource, limits=None): - if limits is None: - return cext.proc_getrlimit(self.pid, resource) - else: - if len(limits) != 2: - msg = ( - "second argument must be a (soft, hard) tuple, got" - f" {limits!r}" - ) - raise ValueError(msg) - soft, hard = limits - return cext.proc_setrlimit(self.pid, resource, soft, hard) diff --git a/PortablePython/Lib/site-packages/psutil/_pslinux.py b/PortablePython/Lib/site-packages/psutil/_pslinux.py deleted file mode 100644 index 8cc64e9..0000000 --- a/PortablePython/Lib/site-packages/psutil/_pslinux.py +++ /dev/null @@ -1,2295 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Linux platform implementation.""" - - -import base64 -import collections -import enum -import errno -import functools -import glob -import os -import re -import resource -import socket -import struct -import sys -import warnings -from collections import defaultdict -from collections import namedtuple - -from . import _common -from . import _psposix -from . import _psutil_linux as cext -from . import _psutil_posix as cext_posix -from ._common import ENCODING -from ._common import NIC_DUPLEX_FULL -from ._common import NIC_DUPLEX_HALF -from ._common import NIC_DUPLEX_UNKNOWN -from ._common import AccessDenied -from ._common import NoSuchProcess -from ._common import ZombieProcess -from ._common import bcat -from ._common import cat -from ._common import debug -from ._common import decode -from ._common import get_procfs_path -from ._common import isfile_strict -from ._common import memoize -from ._common import memoize_when_activated -from ._common import open_binary -from ._common import open_text -from ._common import parse_environ_block -from ._common import path_exists_strict -from ._common import supports_ipv6 -from ._common import usage_percent - - -# fmt: off -__extra__all__ = [ - 'PROCFS_PATH', - # io prio constants - "IOPRIO_CLASS_NONE", "IOPRIO_CLASS_RT", "IOPRIO_CLASS_BE", - "IOPRIO_CLASS_IDLE", - # connection status constants - "CONN_ESTABLISHED", "CONN_SYN_SENT", "CONN_SYN_RECV", "CONN_FIN_WAIT1", - "CONN_FIN_WAIT2", "CONN_TIME_WAIT", "CONN_CLOSE", "CONN_CLOSE_WAIT", - "CONN_LAST_ACK", "CONN_LISTEN", "CONN_CLOSING", -] - -if hasattr(resource, "prlimit"): - __extra__all__.extend( - [x for x in dir(cext) if x.startswith('RLIM') and x.isupper()] - ) -# fmt: on - - -# ===================================================================== -# --- globals -# ===================================================================== - - -POWER_SUPPLY_PATH = "/sys/class/power_supply" -HAS_PROC_SMAPS = os.path.exists(f"/proc/{os.getpid()}/smaps") -HAS_PROC_SMAPS_ROLLUP = os.path.exists(f"/proc/{os.getpid()}/smaps_rollup") -HAS_PROC_IO_PRIORITY = hasattr(cext, "proc_ioprio_get") -HAS_CPU_AFFINITY = hasattr(cext, "proc_cpu_affinity_get") - -# Number of clock ticks per second -CLOCK_TICKS = os.sysconf("SC_CLK_TCK") -PAGESIZE = cext_posix.getpagesize() -BOOT_TIME = None # set later -LITTLE_ENDIAN = sys.byteorder == 'little' - -# "man iostat" states that sectors are equivalent with blocks and have -# a size of 512 bytes. Despite this value can be queried at runtime -# via /sys/block/{DISK}/queue/hw_sector_size and results may vary -# between 1k, 2k, or 4k... 512 appears to be a magic constant used -# throughout Linux source code: -# * https://stackoverflow.com/a/38136179/376587 -# * https://lists.gt.net/linux/kernel/2241060 -# * https://github.com/giampaolo/psutil/issues/1305 -# * https://github.com/torvalds/linux/blob/ -# 4f671fe2f9523a1ea206f63fe60a7c7b3a56d5c7/include/linux/bio.h#L99 -# * https://lkml.org/lkml/2015/8/17/234 -DISK_SECTOR_SIZE = 512 - -AddressFamily = enum.IntEnum( - 'AddressFamily', {'AF_LINK': int(socket.AF_PACKET)} -) -AF_LINK = AddressFamily.AF_LINK - - -# ioprio_* constants http://linux.die.net/man/2/ioprio_get -class IOPriority(enum.IntEnum): - IOPRIO_CLASS_NONE = 0 - IOPRIO_CLASS_RT = 1 - IOPRIO_CLASS_BE = 2 - IOPRIO_CLASS_IDLE = 3 - - -globals().update(IOPriority.__members__) - -# See: -# https://github.com/torvalds/linux/blame/master/fs/proc/array.c -# ...and (TASK_* constants): -# https://github.com/torvalds/linux/blob/master/include/linux/sched.h -PROC_STATUSES = { - "R": _common.STATUS_RUNNING, - "S": _common.STATUS_SLEEPING, - "D": _common.STATUS_DISK_SLEEP, - "T": _common.STATUS_STOPPED, - "t": _common.STATUS_TRACING_STOP, - "Z": _common.STATUS_ZOMBIE, - "X": _common.STATUS_DEAD, - "x": _common.STATUS_DEAD, - "K": _common.STATUS_WAKE_KILL, - "W": _common.STATUS_WAKING, - "I": _common.STATUS_IDLE, - "P": _common.STATUS_PARKED, -} - -# https://github.com/torvalds/linux/blob/master/include/net/tcp_states.h -TCP_STATUSES = { - "01": _common.CONN_ESTABLISHED, - "02": _common.CONN_SYN_SENT, - "03": _common.CONN_SYN_RECV, - "04": _common.CONN_FIN_WAIT1, - "05": _common.CONN_FIN_WAIT2, - "06": _common.CONN_TIME_WAIT, - "07": _common.CONN_CLOSE, - "08": _common.CONN_CLOSE_WAIT, - "09": _common.CONN_LAST_ACK, - "0A": _common.CONN_LISTEN, - "0B": _common.CONN_CLOSING, -} - - -# ===================================================================== -# --- named tuples -# ===================================================================== - - -# fmt: off -# psutil.virtual_memory() -svmem = namedtuple( - 'svmem', ['total', 'available', 'percent', 'used', 'free', - 'active', 'inactive', 'buffers', 'cached', 'shared', 'slab']) -# psutil.disk_io_counters() -sdiskio = namedtuple( - 'sdiskio', ['read_count', 'write_count', - 'read_bytes', 'write_bytes', - 'read_time', 'write_time', - 'read_merged_count', 'write_merged_count', - 'busy_time']) -# psutil.Process().open_files() -popenfile = namedtuple( - 'popenfile', ['path', 'fd', 'position', 'mode', 'flags']) -# psutil.Process().memory_info() -pmem = namedtuple('pmem', 'rss vms shared text lib data dirty') -# psutil.Process().memory_full_info() -pfullmem = namedtuple('pfullmem', pmem._fields + ('uss', 'pss', 'swap')) -# psutil.Process().memory_maps(grouped=True) -pmmap_grouped = namedtuple( - 'pmmap_grouped', - ['path', 'rss', 'size', 'pss', 'shared_clean', 'shared_dirty', - 'private_clean', 'private_dirty', 'referenced', 'anonymous', 'swap']) -# psutil.Process().memory_maps(grouped=False) -pmmap_ext = namedtuple( - 'pmmap_ext', 'addr perms ' + ' '.join(pmmap_grouped._fields)) -# psutil.Process.io_counters() -pio = namedtuple('pio', ['read_count', 'write_count', - 'read_bytes', 'write_bytes', - 'read_chars', 'write_chars']) -# psutil.Process.cpu_times() -pcputimes = namedtuple('pcputimes', - ['user', 'system', 'children_user', 'children_system', - 'iowait']) -# fmt: on - - -# ===================================================================== -# --- utils -# ===================================================================== - - -def readlink(path): - """Wrapper around os.readlink().""" - assert isinstance(path, str), path - path = os.readlink(path) - # readlink() might return paths containing null bytes ('\x00') - # resulting in "TypeError: must be encoded string without NULL - # bytes, not str" errors when the string is passed to other - # fs-related functions (os.*, open(), ...). - # Apparently everything after '\x00' is garbage (we can have - # ' (deleted)', 'new' and possibly others), see: - # https://github.com/giampaolo/psutil/issues/717 - path = path.split('\x00')[0] - # Certain paths have ' (deleted)' appended. Usually this is - # bogus as the file actually exists. Even if it doesn't we - # don't care. - if path.endswith(' (deleted)') and not path_exists_strict(path): - path = path[:-10] - return path - - -def file_flags_to_mode(flags): - """Convert file's open() flags into a readable string. - Used by Process.open_files(). - """ - modes_map = {os.O_RDONLY: 'r', os.O_WRONLY: 'w', os.O_RDWR: 'w+'} - mode = modes_map[flags & (os.O_RDONLY | os.O_WRONLY | os.O_RDWR)] - if flags & os.O_APPEND: - mode = mode.replace('w', 'a', 1) - mode = mode.replace('w+', 'r+') - # possible values: r, w, a, r+, a+ - return mode - - -def is_storage_device(name): - """Return True if the given name refers to a root device (e.g. - "sda", "nvme0n1") as opposed to a logical partition (e.g. "sda1", - "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram") - return True. - """ - # Re-adapted from iostat source code, see: - # https://github.com/sysstat/sysstat/blob/ - # 97912938cd476645b267280069e83b1c8dc0e1c7/common.c#L208 - # Some devices may have a slash in their name (e.g. cciss/c0d0...). - name = name.replace('/', '!') - including_virtual = True - if including_virtual: - path = f"/sys/block/{name}" - else: - path = f"/sys/block/{name}/device" - return os.access(path, os.F_OK) - - -@memoize -def set_scputimes_ntuple(procfs_path): - """Set a namedtuple of variable fields depending on the CPU times - available on this Linux kernel version which may be: - (user, nice, system, idle, iowait, irq, softirq, [steal, [guest, - [guest_nice]]]) - Used by cpu_times() function. - """ - global scputimes - with open_binary(f"{procfs_path}/stat") as f: - values = f.readline().split()[1:] - fields = ['user', 'nice', 'system', 'idle', 'iowait', 'irq', 'softirq'] - vlen = len(values) - if vlen >= 8: - # Linux >= 2.6.11 - fields.append('steal') - if vlen >= 9: - # Linux >= 2.6.24 - fields.append('guest') - if vlen >= 10: - # Linux >= 3.2.0 - fields.append('guest_nice') - scputimes = namedtuple('scputimes', fields) - - -try: - set_scputimes_ntuple("/proc") -except Exception as err: # noqa: BLE001 - # Don't want to crash at import time. - debug(f"ignoring exception on import: {err!r}") - scputimes = namedtuple('scputimes', 'user system idle')(0.0, 0.0, 0.0) - - -# ===================================================================== -# --- system memory -# ===================================================================== - - -def calculate_avail_vmem(mems): - """Fallback for kernels < 3.14 where /proc/meminfo does not provide - "MemAvailable", see: - https://blog.famzah.net/2014/09/24/. - - This code reimplements the algorithm outlined here: - https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/ - commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 - - We use this function also when "MemAvailable" returns 0 (possibly a - kernel bug, see: https://github.com/giampaolo/psutil/issues/1915). - In that case this routine matches "free" CLI tool result ("available" - column). - - XXX: on recent kernels this calculation may differ by ~1.5% compared - to "MemAvailable:", as it's calculated slightly differently. - It is still way more realistic than doing (free + cached) though. - See: - * https://gitlab.com/procps-ng/procps/issues/42 - * https://github.com/famzah/linux-memavailable-procfs/issues/2 - """ - # Note about "fallback" value. According to: - # https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/ - # commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773 - # ...long ago "available" memory was calculated as (free + cached), - # We use fallback when one of these is missing from /proc/meminfo: - # "Active(file)": introduced in 2.6.28 / Dec 2008 - # "Inactive(file)": introduced in 2.6.28 / Dec 2008 - # "SReclaimable": introduced in 2.6.19 / Nov 2006 - # /proc/zoneinfo: introduced in 2.6.13 / Aug 2005 - free = mems[b'MemFree:'] - fallback = free + mems.get(b"Cached:", 0) - try: - lru_active_file = mems[b'Active(file):'] - lru_inactive_file = mems[b'Inactive(file):'] - slab_reclaimable = mems[b'SReclaimable:'] - except KeyError as err: - debug( - f"{err.args[0]} is missing from /proc/meminfo; using an" - " approximation for calculating available memory" - ) - return fallback - try: - f = open_binary(f"{get_procfs_path()}/zoneinfo") - except OSError: - return fallback # kernel 2.6.13 - - watermark_low = 0 - with f: - for line in f: - line = line.strip() - if line.startswith(b'low'): - watermark_low += int(line.split()[1]) - watermark_low *= PAGESIZE - - avail = free - watermark_low - pagecache = lru_active_file + lru_inactive_file - pagecache -= min(pagecache / 2, watermark_low) - avail += pagecache - avail += slab_reclaimable - min(slab_reclaimable / 2.0, watermark_low) - return int(avail) - - -def virtual_memory(): - """Report virtual memory stats. - This implementation mimics procps-ng-3.3.12, aka "free" CLI tool: - https://gitlab.com/procps-ng/procps/blob/ - 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791 - The returned values are supposed to match both "free" and "vmstat -s" - CLI tools. - """ - missing_fields = [] - mems = {} - with open_binary(f"{get_procfs_path()}/meminfo") as f: - for line in f: - fields = line.split() - mems[fields[0]] = int(fields[1]) * 1024 - - # /proc doc states that the available fields in /proc/meminfo vary - # by architecture and compile options, but these 3 values are also - # returned by sysinfo(2); as such we assume they are always there. - total = mems[b'MemTotal:'] - free = mems[b'MemFree:'] - try: - buffers = mems[b'Buffers:'] - except KeyError: - # https://github.com/giampaolo/psutil/issues/1010 - buffers = 0 - missing_fields.append('buffers') - try: - cached = mems[b"Cached:"] - except KeyError: - cached = 0 - missing_fields.append('cached') - else: - # "free" cmdline utility sums reclaimable to cached. - # Older versions of procps used to add slab memory instead. - # This got changed in: - # https://gitlab.com/procps-ng/procps/commit/ - # 05d751c4f076a2f0118b914c5e51cfbb4762ad8e - cached += mems.get(b"SReclaimable:", 0) # since kernel 2.6.19 - - try: - shared = mems[b'Shmem:'] # since kernel 2.6.32 - except KeyError: - try: - shared = mems[b'MemShared:'] # kernels 2.4 - except KeyError: - shared = 0 - missing_fields.append('shared') - - try: - active = mems[b"Active:"] - except KeyError: - active = 0 - missing_fields.append('active') - - try: - inactive = mems[b"Inactive:"] - except KeyError: - try: - inactive = ( - mems[b"Inact_dirty:"] - + mems[b"Inact_clean:"] - + mems[b"Inact_laundry:"] - ) - except KeyError: - inactive = 0 - missing_fields.append('inactive') - - try: - slab = mems[b"Slab:"] - except KeyError: - slab = 0 - - used = total - free - cached - buffers - if used < 0: - # May be symptomatic of running within a LCX container where such - # values will be dramatically distorted over those of the host. - used = total - free - - # - starting from 4.4.0 we match free's "available" column. - # Before 4.4.0 we calculated it as (free + buffers + cached) - # which matched htop. - # - free and htop available memory differs as per: - # http://askubuntu.com/a/369589 - # http://unix.stackexchange.com/a/65852/168884 - # - MemAvailable has been introduced in kernel 3.14 - try: - avail = mems[b'MemAvailable:'] - except KeyError: - avail = calculate_avail_vmem(mems) - else: - if avail == 0: - # Yes, it can happen (probably a kernel bug): - # https://github.com/giampaolo/psutil/issues/1915 - # In this case "free" CLI tool makes an estimate. We do the same, - # and it matches "free" CLI tool. - avail = calculate_avail_vmem(mems) - - if avail < 0: - avail = 0 - missing_fields.append('available') - elif avail > total: - # If avail is greater than total or our calculation overflows, - # that's symptomatic of running within a LCX container where such - # values will be dramatically distorted over those of the host. - # https://gitlab.com/procps-ng/procps/blob/ - # 24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L764 - avail = free - - percent = usage_percent((total - avail), total, round_=1) - - # Warn about missing metrics which are set to 0. - if missing_fields: - msg = "{} memory stats couldn't be determined and {} set to 0".format( - ", ".join(missing_fields), - "was" if len(missing_fields) == 1 else "were", - ) - warnings.warn(msg, RuntimeWarning, stacklevel=2) - - return svmem( - total, - avail, - percent, - used, - free, - active, - inactive, - buffers, - cached, - shared, - slab, - ) - - -def swap_memory(): - """Return swap memory metrics.""" - mems = {} - with open_binary(f"{get_procfs_path()}/meminfo") as f: - for line in f: - fields = line.split() - mems[fields[0]] = int(fields[1]) * 1024 - # We prefer /proc/meminfo over sysinfo() syscall so that - # psutil.PROCFS_PATH can be used in order to allow retrieval - # for linux containers, see: - # https://github.com/giampaolo/psutil/issues/1015 - try: - total = mems[b'SwapTotal:'] - free = mems[b'SwapFree:'] - except KeyError: - _, _, _, _, total, free, unit_multiplier = cext.linux_sysinfo() - total *= unit_multiplier - free *= unit_multiplier - - used = total - free - percent = usage_percent(used, total, round_=1) - # get pgin/pgouts - try: - f = open_binary(f"{get_procfs_path()}/vmstat") - except OSError as err: - # see https://github.com/giampaolo/psutil/issues/722 - msg = ( - "'sin' and 'sout' swap memory stats couldn't " - f"be determined and were set to 0 ({err})" - ) - warnings.warn(msg, RuntimeWarning, stacklevel=2) - sin = sout = 0 - else: - with f: - sin = sout = None - for line in f: - # values are expressed in 4 kilo bytes, we want - # bytes instead - if line.startswith(b'pswpin'): - sin = int(line.split(b' ')[1]) * 4 * 1024 - elif line.startswith(b'pswpout'): - sout = int(line.split(b' ')[1]) * 4 * 1024 - if sin is not None and sout is not None: - break - else: - # we might get here when dealing with exotic Linux - # flavors, see: - # https://github.com/giampaolo/psutil/issues/313 - msg = "'sin' and 'sout' swap memory stats couldn't " - msg += "be determined and were set to 0" - warnings.warn(msg, RuntimeWarning, stacklevel=2) - sin = sout = 0 - return _common.sswap(total, used, free, percent, sin, sout) - - -# ===================================================================== -# --- CPU -# ===================================================================== - - -def cpu_times(): - """Return a named tuple representing the following system-wide - CPU times: - (user, nice, system, idle, iowait, irq, softirq [steal, [guest, - [guest_nice]]]) - Last 3 fields may not be available on all Linux kernel versions. - """ - procfs_path = get_procfs_path() - set_scputimes_ntuple(procfs_path) - with open_binary(f"{procfs_path}/stat") as f: - values = f.readline().split() - fields = values[1 : len(scputimes._fields) + 1] - fields = [float(x) / CLOCK_TICKS for x in fields] - return scputimes(*fields) - - -def per_cpu_times(): - """Return a list of namedtuple representing the CPU times - for every CPU available on the system. - """ - procfs_path = get_procfs_path() - set_scputimes_ntuple(procfs_path) - cpus = [] - with open_binary(f"{procfs_path}/stat") as f: - # get rid of the first line which refers to system wide CPU stats - f.readline() - for line in f: - if line.startswith(b'cpu'): - values = line.split() - fields = values[1 : len(scputimes._fields) + 1] - fields = [float(x) / CLOCK_TICKS for x in fields] - entry = scputimes(*fields) - cpus.append(entry) - return cpus - - -def cpu_count_logical(): - """Return the number of logical CPUs in the system.""" - try: - return os.sysconf("SC_NPROCESSORS_ONLN") - except ValueError: - # as a second fallback we try to parse /proc/cpuinfo - num = 0 - with open_binary(f"{get_procfs_path()}/cpuinfo") as f: - for line in f: - if line.lower().startswith(b'processor'): - num += 1 - - # unknown format (e.g. amrel/sparc architectures), see: - # https://github.com/giampaolo/psutil/issues/200 - # try to parse /proc/stat as a last resort - if num == 0: - search = re.compile(r'cpu\d') - with open_text(f"{get_procfs_path()}/stat") as f: - for line in f: - line = line.split(' ')[0] - if search.match(line): - num += 1 - - if num == 0: - # mimic os.cpu_count() - return None - return num - - -def cpu_count_cores(): - """Return the number of CPU cores in the system.""" - # Method #1 - ls = set() - # These 2 files are the same but */core_cpus_list is newer while - # */thread_siblings_list is deprecated and may disappear in the future. - # https://www.kernel.org/doc/Documentation/admin-guide/cputopology.rst - # https://github.com/giampaolo/psutil/pull/1727#issuecomment-707624964 - # https://lkml.org/lkml/2019/2/26/41 - p1 = "/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_list" - p2 = "/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_list" - for path in glob.glob(p1) or glob.glob(p2): - with open_binary(path) as f: - ls.add(f.read().strip()) - result = len(ls) - if result != 0: - return result - - # Method #2 - mapping = {} - current_info = {} - with open_binary(f"{get_procfs_path()}/cpuinfo") as f: - for line in f: - line = line.strip().lower() - if not line: - # new section - try: - mapping[current_info[b'physical id']] = current_info[ - b'cpu cores' - ] - except KeyError: - pass - current_info = {} - elif line.startswith((b'physical id', b'cpu cores')): - # ongoing section - key, value = line.split(b'\t:', 1) - current_info[key] = int(value) - - result = sum(mapping.values()) - return result or None # mimic os.cpu_count() - - -def cpu_stats(): - """Return various CPU stats as a named tuple.""" - with open_binary(f"{get_procfs_path()}/stat") as f: - ctx_switches = None - interrupts = None - soft_interrupts = None - for line in f: - if line.startswith(b'ctxt'): - ctx_switches = int(line.split()[1]) - elif line.startswith(b'intr'): - interrupts = int(line.split()[1]) - elif line.startswith(b'softirq'): - soft_interrupts = int(line.split()[1]) - if ( - ctx_switches is not None - and soft_interrupts is not None - and interrupts is not None - ): - break - syscalls = 0 - return _common.scpustats( - ctx_switches, interrupts, soft_interrupts, syscalls - ) - - -def _cpu_get_cpuinfo_freq(): - """Return current CPU frequency from cpuinfo if available.""" - with open_binary(f"{get_procfs_path()}/cpuinfo") as f: - return [ - float(line.split(b':', 1)[1]) - for line in f - if line.lower().startswith(b'cpu mhz') - ] - - -if os.path.exists("/sys/devices/system/cpu/cpufreq/policy0") or os.path.exists( - "/sys/devices/system/cpu/cpu0/cpufreq" -): - - def cpu_freq(): - """Return frequency metrics for all CPUs. - Contrarily to other OSes, Linux updates these values in - real-time. - """ - cpuinfo_freqs = _cpu_get_cpuinfo_freq() - paths = glob.glob( - "/sys/devices/system/cpu/cpufreq/policy[0-9]*" - ) or glob.glob("/sys/devices/system/cpu/cpu[0-9]*/cpufreq") - paths.sort(key=lambda x: int(re.search(r"[0-9]+", x).group())) - ret = [] - pjoin = os.path.join - for i, path in enumerate(paths): - if len(paths) == len(cpuinfo_freqs): - # take cached value from cpuinfo if available, see: - # https://github.com/giampaolo/psutil/issues/1851 - curr = cpuinfo_freqs[i] * 1000 - else: - curr = bcat(pjoin(path, "scaling_cur_freq"), fallback=None) - if curr is None: - # Likely an old RedHat, see: - # https://github.com/giampaolo/psutil/issues/1071 - curr = bcat(pjoin(path, "cpuinfo_cur_freq"), fallback=None) - if curr is None: - online_path = f"/sys/devices/system/cpu/cpu{i}/online" - # if cpu core is offline, set to all zeroes - if cat(online_path, fallback=None) == "0\n": - ret.append(_common.scpufreq(0.0, 0.0, 0.0)) - continue - msg = "can't find current frequency file" - raise NotImplementedError(msg) - curr = int(curr) / 1000 - max_ = int(bcat(pjoin(path, "scaling_max_freq"))) / 1000 - min_ = int(bcat(pjoin(path, "scaling_min_freq"))) / 1000 - ret.append(_common.scpufreq(curr, min_, max_)) - return ret - -else: - - def cpu_freq(): - """Alternate implementation using /proc/cpuinfo. - min and max frequencies are not available and are set to None. - """ - return [_common.scpufreq(x, 0.0, 0.0) for x in _cpu_get_cpuinfo_freq()] - - -# ===================================================================== -# --- network -# ===================================================================== - - -net_if_addrs = cext_posix.net_if_addrs - - -class _Ipv6UnsupportedError(Exception): - pass - - -class NetConnections: - """A wrapper on top of /proc/net/* files, retrieving per-process - and system-wide open connections (TCP, UDP, UNIX) similarly to - "netstat -an". - - Note: in case of UNIX sockets we're only able to determine the - local endpoint/path, not the one it's connected to. - According to [1] it would be possible but not easily. - - [1] http://serverfault.com/a/417946 - """ - - def __init__(self): - # The string represents the basename of the corresponding - # /proc/net/{proto_name} file. - tcp4 = ("tcp", socket.AF_INET, socket.SOCK_STREAM) - tcp6 = ("tcp6", socket.AF_INET6, socket.SOCK_STREAM) - udp4 = ("udp", socket.AF_INET, socket.SOCK_DGRAM) - udp6 = ("udp6", socket.AF_INET6, socket.SOCK_DGRAM) - unix = ("unix", socket.AF_UNIX, None) - self.tmap = { - "all": (tcp4, tcp6, udp4, udp6, unix), - "tcp": (tcp4, tcp6), - "tcp4": (tcp4,), - "tcp6": (tcp6,), - "udp": (udp4, udp6), - "udp4": (udp4,), - "udp6": (udp6,), - "unix": (unix,), - "inet": (tcp4, tcp6, udp4, udp6), - "inet4": (tcp4, udp4), - "inet6": (tcp6, udp6), - } - self._procfs_path = None - - def get_proc_inodes(self, pid): - inodes = defaultdict(list) - for fd in os.listdir(f"{self._procfs_path}/{pid}/fd"): - try: - inode = readlink(f"{self._procfs_path}/{pid}/fd/{fd}") - except (FileNotFoundError, ProcessLookupError): - # ENOENT == file which is gone in the meantime; - # os.stat(f"/proc/{self.pid}") will be done later - # to force NSP (if it's the case) - continue - except OSError as err: - if err.errno == errno.EINVAL: - # not a link - continue - if err.errno == errno.ENAMETOOLONG: - # file name too long - debug(err) - continue - raise - else: - if inode.startswith('socket:['): - # the process is using a socket - inode = inode[8:][:-1] - inodes[inode].append((pid, int(fd))) - return inodes - - def get_all_inodes(self): - inodes = {} - for pid in pids(): - try: - inodes.update(self.get_proc_inodes(pid)) - except (FileNotFoundError, ProcessLookupError, PermissionError): - # os.listdir() is gonna raise a lot of access denied - # exceptions in case of unprivileged user; that's fine - # as we'll just end up returning a connection with PID - # and fd set to None anyway. - # Both netstat -an and lsof does the same so it's - # unlikely we can do any better. - # ENOENT just means a PID disappeared on us. - continue - return inodes - - @staticmethod - def decode_address(addr, family): - """Accept an "ip:port" address as displayed in /proc/net/* - and convert it into a human readable form, like: - - "0500000A:0016" -> ("10.0.0.5", 22) - "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521) - - The IP address portion is a little or big endian four-byte - hexadecimal number; that is, the least significant byte is listed - first, so we need to reverse the order of the bytes to convert it - to an IP address. - The port is represented as a two-byte hexadecimal number. - - Reference: - http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html - """ - ip, port = addr.split(':') - port = int(port, 16) - # this usually refers to a local socket in listen mode with - # no end-points connected - if not port: - return () - ip = ip.encode('ascii') - if family == socket.AF_INET: - # see: https://github.com/giampaolo/psutil/issues/201 - if LITTLE_ENDIAN: - ip = socket.inet_ntop(family, base64.b16decode(ip)[::-1]) - else: - ip = socket.inet_ntop(family, base64.b16decode(ip)) - else: # IPv6 - ip = base64.b16decode(ip) - try: - # see: https://github.com/giampaolo/psutil/issues/201 - if LITTLE_ENDIAN: - ip = socket.inet_ntop( - socket.AF_INET6, - struct.pack('>4I', *struct.unpack('<4I', ip)), - ) - else: - ip = socket.inet_ntop( - socket.AF_INET6, - struct.pack('<4I', *struct.unpack('<4I', ip)), - ) - except ValueError: - # see: https://github.com/giampaolo/psutil/issues/623 - if not supports_ipv6(): - raise _Ipv6UnsupportedError from None - raise - return _common.addr(ip, port) - - @staticmethod - def process_inet(file, family, type_, inodes, filter_pid=None): - """Parse /proc/net/tcp* and /proc/net/udp* files.""" - if file.endswith('6') and not os.path.exists(file): - # IPv6 not supported - return - with open_text(file) as f: - f.readline() # skip the first line - for lineno, line in enumerate(f, 1): - try: - _, laddr, raddr, status, _, _, _, _, _, inode = ( - line.split()[:10] - ) - except ValueError: - msg = ( - f"error while parsing {file}; malformed line" - f" {lineno} {line!r}" - ) - raise RuntimeError(msg) from None - if inode in inodes: - # # We assume inet sockets are unique, so we error - # # out if there are multiple references to the - # # same inode. We won't do this for UNIX sockets. - # if len(inodes[inode]) > 1 and family != socket.AF_UNIX: - # raise ValueError("ambiguous inode with multiple " - # "PIDs references") - pid, fd = inodes[inode][0] - else: - pid, fd = None, -1 - if filter_pid is not None and filter_pid != pid: - continue - else: - if type_ == socket.SOCK_STREAM: - status = TCP_STATUSES[status] - else: - status = _common.CONN_NONE - try: - laddr = NetConnections.decode_address(laddr, family) - raddr = NetConnections.decode_address(raddr, family) - except _Ipv6UnsupportedError: - continue - yield (fd, family, type_, laddr, raddr, status, pid) - - @staticmethod - def process_unix(file, family, inodes, filter_pid=None): - """Parse /proc/net/unix files.""" - with open_text(file) as f: - f.readline() # skip the first line - for line in f: - tokens = line.split() - try: - _, _, _, _, type_, _, inode = tokens[0:7] - except ValueError: - if ' ' not in line: - # see: https://github.com/giampaolo/psutil/issues/766 - continue - msg = ( - f"error while parsing {file}; malformed line {line!r}" - ) - raise RuntimeError(msg) # noqa: B904 - if inode in inodes: # noqa: SIM108 - # With UNIX sockets we can have a single inode - # referencing many file descriptors. - pairs = inodes[inode] - else: - pairs = [(None, -1)] - for pid, fd in pairs: - if filter_pid is not None and filter_pid != pid: - continue - else: - path = tokens[-1] if len(tokens) == 8 else '' - type_ = _common.socktype_to_enum(int(type_)) - # XXX: determining the remote endpoint of a - # UNIX socket on Linux is not possible, see: - # https://serverfault.com/questions/252723/ - raddr = "" - status = _common.CONN_NONE - yield (fd, family, type_, path, raddr, status, pid) - - def retrieve(self, kind, pid=None): - self._procfs_path = get_procfs_path() - if pid is not None: - inodes = self.get_proc_inodes(pid) - if not inodes: - # no connections for this process - return [] - else: - inodes = self.get_all_inodes() - ret = set() - for proto_name, family, type_ in self.tmap[kind]: - path = f"{self._procfs_path}/net/{proto_name}" - if family in {socket.AF_INET, socket.AF_INET6}: - ls = self.process_inet( - path, family, type_, inodes, filter_pid=pid - ) - else: - ls = self.process_unix(path, family, inodes, filter_pid=pid) - for fd, family, type_, laddr, raddr, status, bound_pid in ls: - if pid: - conn = _common.pconn( - fd, family, type_, laddr, raddr, status - ) - else: - conn = _common.sconn( - fd, family, type_, laddr, raddr, status, bound_pid - ) - ret.add(conn) - return list(ret) - - -_net_connections = NetConnections() - - -def net_connections(kind='inet'): - """Return system-wide open connections.""" - return _net_connections.retrieve(kind) - - -def net_io_counters(): - """Return network I/O statistics for every network interface - installed on the system as a dict of raw tuples. - """ - with open_text(f"{get_procfs_path()}/net/dev") as f: - lines = f.readlines() - retdict = {} - for line in lines[2:]: - colon = line.rfind(':') - assert colon > 0, repr(line) - name = line[:colon].strip() - fields = line[colon + 1 :].strip().split() - - ( - # in - bytes_recv, - packets_recv, - errin, - dropin, - _fifoin, # unused - _framein, # unused - _compressedin, # unused - _multicastin, # unused - # out - bytes_sent, - packets_sent, - errout, - dropout, - _fifoout, # unused - _collisionsout, # unused - _carrierout, # unused - _compressedout, # unused - ) = map(int, fields) - - retdict[name] = ( - bytes_sent, - bytes_recv, - packets_sent, - packets_recv, - errin, - errout, - dropin, - dropout, - ) - return retdict - - -def net_if_stats(): - """Get NIC stats (isup, duplex, speed, mtu).""" - duplex_map = { - cext.DUPLEX_FULL: NIC_DUPLEX_FULL, - cext.DUPLEX_HALF: NIC_DUPLEX_HALF, - cext.DUPLEX_UNKNOWN: NIC_DUPLEX_UNKNOWN, - } - names = net_io_counters().keys() - ret = {} - for name in names: - try: - mtu = cext_posix.net_if_mtu(name) - flags = cext_posix.net_if_flags(name) - duplex, speed = cext.net_if_duplex_speed(name) - except OSError as err: - # https://github.com/giampaolo/psutil/issues/1279 - if err.errno != errno.ENODEV: - raise - debug(err) - else: - output_flags = ','.join(flags) - isup = 'running' in flags - ret[name] = _common.snicstats( - isup, duplex_map[duplex], speed, mtu, output_flags - ) - return ret - - -# ===================================================================== -# --- disks -# ===================================================================== - - -disk_usage = _psposix.disk_usage - - -def disk_io_counters(perdisk=False): - """Return disk I/O statistics for every disk installed on the - system as a dict of raw tuples. - """ - - def read_procfs(): - # OK, this is a bit confusing. The format of /proc/diskstats can - # have 3 variations. - # On Linux 2.4 each line has always 15 fields, e.g.: - # "3 0 8 hda 8 8 8 8 8 8 8 8 8 8 8" - # On Linux 2.6+ each line *usually* has 14 fields, and the disk - # name is in another position, like this: - # "3 0 hda 8 8 8 8 8 8 8 8 8 8 8" - # ...unless (Linux 2.6) the line refers to a partition instead - # of a disk, in which case the line has less fields (7): - # "3 1 hda1 8 8 8 8" - # 4.18+ has 4 fields added: - # "3 0 hda 8 8 8 8 8 8 8 8 8 8 8 0 0 0 0" - # 5.5 has 2 more fields. - # See: - # https://www.kernel.org/doc/Documentation/iostats.txt - # https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats - with open_text(f"{get_procfs_path()}/diskstats") as f: - lines = f.readlines() - for line in lines: - fields = line.split() - flen = len(fields) - # fmt: off - if flen == 15: - # Linux 2.4 - name = fields[3] - reads = int(fields[2]) - (reads_merged, rbytes, rtime, writes, writes_merged, - wbytes, wtime, _, busy_time, _) = map(int, fields[4:14]) - elif flen == 14 or flen >= 18: - # Linux 2.6+, line referring to a disk - name = fields[2] - (reads, reads_merged, rbytes, rtime, writes, writes_merged, - wbytes, wtime, _, busy_time, _) = map(int, fields[3:14]) - elif flen == 7: - # Linux 2.6+, line referring to a partition - name = fields[2] - reads, rbytes, writes, wbytes = map(int, fields[3:]) - rtime = wtime = reads_merged = writes_merged = busy_time = 0 - else: - msg = f"not sure how to interpret line {line!r}" - raise ValueError(msg) - yield (name, reads, writes, rbytes, wbytes, rtime, wtime, - reads_merged, writes_merged, busy_time) - # fmt: on - - def read_sysfs(): - for block in os.listdir('/sys/block'): - for root, _, files in os.walk(os.path.join('/sys/block', block)): - if 'stat' not in files: - continue - with open_text(os.path.join(root, 'stat')) as f: - fields = f.read().strip().split() - name = os.path.basename(root) - # fmt: off - (reads, reads_merged, rbytes, rtime, writes, writes_merged, - wbytes, wtime, _, busy_time) = map(int, fields[:10]) - yield (name, reads, writes, rbytes, wbytes, rtime, - wtime, reads_merged, writes_merged, busy_time) - # fmt: on - - if os.path.exists(f"{get_procfs_path()}/diskstats"): - gen = read_procfs() - elif os.path.exists('/sys/block'): - gen = read_sysfs() - else: - msg = ( - f"{get_procfs_path()}/diskstats nor /sys/block are available on" - " this system" - ) - raise NotImplementedError(msg) - - retdict = {} - for entry in gen: - # fmt: off - (name, reads, writes, rbytes, wbytes, rtime, wtime, reads_merged, - writes_merged, busy_time) = entry - if not perdisk and not is_storage_device(name): - # perdisk=False means we want to calculate totals so we skip - # partitions (e.g. 'sda1', 'nvme0n1p1') and only include - # base disk devices (e.g. 'sda', 'nvme0n1'). Base disks - # include a total of all their partitions + some extra size - # of their own: - # $ cat /proc/diskstats - # 259 0 sda 10485760 ... - # 259 1 sda1 5186039 ... - # 259 1 sda2 5082039 ... - # See: - # https://github.com/giampaolo/psutil/pull/1313 - continue - - rbytes *= DISK_SECTOR_SIZE - wbytes *= DISK_SECTOR_SIZE - retdict[name] = (reads, writes, rbytes, wbytes, rtime, wtime, - reads_merged, writes_merged, busy_time) - # fmt: on - - return retdict - - -class RootFsDeviceFinder: - """disk_partitions() may return partitions with device == "/dev/root" - or "rootfs". This container class uses different strategies to try to - obtain the real device path. Resources: - https://bootlin.com/blog/find-root-device/ - https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/. - """ - - __slots__ = ['major', 'minor'] - - def __init__(self): - dev = os.stat("/").st_dev - self.major = os.major(dev) - self.minor = os.minor(dev) - - def ask_proc_partitions(self): - with open_text(f"{get_procfs_path()}/partitions") as f: - for line in f.readlines()[2:]: - fields = line.split() - if len(fields) < 4: # just for extra safety - continue - major = int(fields[0]) if fields[0].isdigit() else None - minor = int(fields[1]) if fields[1].isdigit() else None - name = fields[3] - if major == self.major and minor == self.minor: - if name: # just for extra safety - return f"/dev/{name}" - - def ask_sys_dev_block(self): - path = f"/sys/dev/block/{self.major}:{self.minor}/uevent" - with open_text(path) as f: - for line in f: - if line.startswith("DEVNAME="): - name = line.strip().rpartition("DEVNAME=")[2] - if name: # just for extra safety - return f"/dev/{name}" - - def ask_sys_class_block(self): - needle = f"{self.major}:{self.minor}" - files = glob.iglob("/sys/class/block/*/dev") - for file in files: - try: - f = open_text(file) - except FileNotFoundError: # race condition - continue - else: - with f: - data = f.read().strip() - if data == needle: - name = os.path.basename(os.path.dirname(file)) - return f"/dev/{name}" - - def find(self): - path = None - if path is None: - try: - path = self.ask_proc_partitions() - except OSError as err: - debug(err) - if path is None: - try: - path = self.ask_sys_dev_block() - except OSError as err: - debug(err) - if path is None: - try: - path = self.ask_sys_class_block() - except OSError as err: - debug(err) - # We use exists() because the "/dev/*" part of the path is hard - # coded, so we want to be sure. - if path is not None and os.path.exists(path): - return path - - -def disk_partitions(all=False): - """Return mounted disk partitions as a list of namedtuples.""" - fstypes = set() - procfs_path = get_procfs_path() - if not all: - with open_text(f"{procfs_path}/filesystems") as f: - for line in f: - line = line.strip() - if not line.startswith("nodev"): - fstypes.add(line.strip()) - else: - # ignore all lines starting with "nodev" except "nodev zfs" - fstype = line.split("\t")[1] - if fstype == "zfs": - fstypes.add("zfs") - - # See: https://github.com/giampaolo/psutil/issues/1307 - if procfs_path == "/proc" and os.path.isfile('/etc/mtab'): - mounts_path = os.path.realpath("/etc/mtab") - else: - mounts_path = os.path.realpath(f"{procfs_path}/self/mounts") - - retlist = [] - partitions = cext.disk_partitions(mounts_path) - for partition in partitions: - device, mountpoint, fstype, opts = partition - if device == 'none': - device = '' - if device in {"/dev/root", "rootfs"}: - device = RootFsDeviceFinder().find() or device - if not all: - if not device or fstype not in fstypes: - continue - ntuple = _common.sdiskpart(device, mountpoint, fstype, opts) - retlist.append(ntuple) - - return retlist - - -# ===================================================================== -# --- sensors -# ===================================================================== - - -def sensors_temperatures(): - """Return hardware (CPU and others) temperatures as a dict - including hardware name, label, current, max and critical - temperatures. - - Implementation notes: - - /sys/class/hwmon looks like the most recent interface to - retrieve this info, and this implementation relies on it - only (old distros will probably use something else) - - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon - - /sys/class/thermal/thermal_zone* is another one but it's more - difficult to parse - """ - ret = collections.defaultdict(list) - basenames = glob.glob('/sys/class/hwmon/hwmon*/temp*_*') - # CentOS has an intermediate /device directory: - # https://github.com/giampaolo/psutil/issues/971 - # https://github.com/nicolargo/glances/issues/1060 - basenames.extend(glob.glob('/sys/class/hwmon/hwmon*/device/temp*_*')) - basenames = sorted({x.split('_')[0] for x in basenames}) - - # Only add the coretemp hwmon entries if they're not already in - # /sys/class/hwmon/ - # https://github.com/giampaolo/psutil/issues/1708 - # https://github.com/giampaolo/psutil/pull/1648 - basenames2 = glob.glob( - '/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*' - ) - repl = re.compile(r"/sys/devices/platform/coretemp.*/hwmon/") - for name in basenames2: - altname = repl.sub('/sys/class/hwmon/', name) - if altname not in basenames: - basenames.append(name) - - for base in basenames: - try: - path = base + '_input' - current = float(bcat(path)) / 1000.0 - path = os.path.join(os.path.dirname(base), 'name') - unit_name = cat(path).strip() - except (OSError, ValueError): - # A lot of things can go wrong here, so let's just skip the - # whole entry. Sure thing is Linux's /sys/class/hwmon really - # is a stinky broken mess. - # https://github.com/giampaolo/psutil/issues/1009 - # https://github.com/giampaolo/psutil/issues/1101 - # https://github.com/giampaolo/psutil/issues/1129 - # https://github.com/giampaolo/psutil/issues/1245 - # https://github.com/giampaolo/psutil/issues/1323 - continue - - high = bcat(base + '_max', fallback=None) - critical = bcat(base + '_crit', fallback=None) - label = cat(base + '_label', fallback='').strip() - - if high is not None: - try: - high = float(high) / 1000.0 - except ValueError: - high = None - if critical is not None: - try: - critical = float(critical) / 1000.0 - except ValueError: - critical = None - - ret[unit_name].append((label, current, high, critical)) - - # Indication that no sensors were detected in /sys/class/hwmon/ - if not basenames: - basenames = glob.glob('/sys/class/thermal/thermal_zone*') - basenames = sorted(set(basenames)) - - for base in basenames: - try: - path = os.path.join(base, 'temp') - current = float(bcat(path)) / 1000.0 - path = os.path.join(base, 'type') - unit_name = cat(path).strip() - except (OSError, ValueError) as err: - debug(err) - continue - - trip_paths = glob.glob(base + '/trip_point*') - trip_points = { - '_'.join(os.path.basename(p).split('_')[0:3]) - for p in trip_paths - } - critical = None - high = None - for trip_point in trip_points: - path = os.path.join(base, trip_point + "_type") - trip_type = cat(path, fallback='').strip() - if trip_type == 'critical': - critical = bcat( - os.path.join(base, trip_point + "_temp"), fallback=None - ) - elif trip_type == 'high': - high = bcat( - os.path.join(base, trip_point + "_temp"), fallback=None - ) - - if high is not None: - try: - high = float(high) / 1000.0 - except ValueError: - high = None - if critical is not None: - try: - critical = float(critical) / 1000.0 - except ValueError: - critical = None - - ret[unit_name].append(('', current, high, critical)) - - return dict(ret) - - -def sensors_fans(): - """Return hardware fans info (for CPU and other peripherals) as a - dict including hardware label and current speed. - - Implementation notes: - - /sys/class/hwmon looks like the most recent interface to - retrieve this info, and this implementation relies on it - only (old distros will probably use something else) - - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon - """ - ret = collections.defaultdict(list) - basenames = glob.glob('/sys/class/hwmon/hwmon*/fan*_*') - if not basenames: - # CentOS has an intermediate /device directory: - # https://github.com/giampaolo/psutil/issues/971 - basenames = glob.glob('/sys/class/hwmon/hwmon*/device/fan*_*') - - basenames = sorted({x.split("_")[0] for x in basenames}) - for base in basenames: - try: - current = int(bcat(base + '_input')) - except OSError as err: - debug(err) - continue - unit_name = cat(os.path.join(os.path.dirname(base), 'name')).strip() - label = cat(base + '_label', fallback='').strip() - ret[unit_name].append(_common.sfan(label, current)) - - return dict(ret) - - -def sensors_battery(): - """Return battery information. - Implementation note: it appears /sys/class/power_supply/BAT0/ - directory structure may vary and provide files with the same - meaning but under different names, see: - https://github.com/giampaolo/psutil/issues/966. - """ - null = object() - - def multi_bcat(*paths): - """Attempt to read the content of multiple files which may - not exist. If none of them exist return None. - """ - for path in paths: - ret = bcat(path, fallback=null) - if ret != null: - try: - return int(ret) - except ValueError: - return ret.strip() - return None - - bats = [ - x - for x in os.listdir(POWER_SUPPLY_PATH) - if x.startswith('BAT') or 'battery' in x.lower() - ] - if not bats: - return None - # Get the first available battery. Usually this is "BAT0", except - # some rare exceptions: - # https://github.com/giampaolo/psutil/issues/1238 - root = os.path.join(POWER_SUPPLY_PATH, min(bats)) - - # Base metrics. - energy_now = multi_bcat(root + "/energy_now", root + "/charge_now") - power_now = multi_bcat(root + "/power_now", root + "/current_now") - energy_full = multi_bcat(root + "/energy_full", root + "/charge_full") - time_to_empty = multi_bcat(root + "/time_to_empty_now") - - # Percent. If we have energy_full the percentage will be more - # accurate compared to reading /capacity file (float vs. int). - if energy_full is not None and energy_now is not None: - try: - percent = 100.0 * energy_now / energy_full - except ZeroDivisionError: - percent = 0.0 - else: - percent = int(cat(root + "/capacity", fallback=-1)) - if percent == -1: - return None - - # Is AC power cable plugged in? - # Note: AC0 is not always available and sometimes (e.g. CentOS7) - # it's called "AC". - power_plugged = None - online = multi_bcat( - os.path.join(POWER_SUPPLY_PATH, "AC0/online"), - os.path.join(POWER_SUPPLY_PATH, "AC/online"), - ) - if online is not None: - power_plugged = online == 1 - else: - status = cat(root + "/status", fallback="").strip().lower() - if status == "discharging": - power_plugged = False - elif status in {"charging", "full"}: - power_plugged = True - - # Seconds left. - # Note to self: we may also calculate the charging ETA as per: - # https://github.com/thialfihar/dotfiles/blob/ - # 013937745fd9050c30146290e8f963d65c0179e6/bin/battery.py#L55 - if power_plugged: - secsleft = _common.POWER_TIME_UNLIMITED - elif energy_now is not None and power_now is not None: - try: - secsleft = int(energy_now / power_now * 3600) - except ZeroDivisionError: - secsleft = _common.POWER_TIME_UNKNOWN - elif time_to_empty is not None: - secsleft = int(time_to_empty * 60) - if secsleft < 0: - secsleft = _common.POWER_TIME_UNKNOWN - else: - secsleft = _common.POWER_TIME_UNKNOWN - - return _common.sbattery(percent, secsleft, power_plugged) - - -# ===================================================================== -# --- other system functions -# ===================================================================== - - -def users(): - """Return currently connected users as a list of namedtuples.""" - retlist = [] - rawlist = cext.users() - for item in rawlist: - user, tty, hostname, tstamp, pid = item - nt = _common.suser(user, tty or None, hostname, tstamp, pid) - retlist.append(nt) - return retlist - - -def boot_time(): - """Return the system boot time expressed in seconds since the epoch.""" - global BOOT_TIME - path = f"{get_procfs_path()}/stat" - with open_binary(path) as f: - for line in f: - if line.startswith(b'btime'): - ret = float(line.strip().split()[1]) - BOOT_TIME = ret - return ret - msg = f"line 'btime' not found in {path}" - raise RuntimeError(msg) - - -# ===================================================================== -# --- processes -# ===================================================================== - - -def pids(): - """Returns a list of PIDs currently running on the system.""" - path = get_procfs_path().encode(ENCODING) - return [int(x) for x in os.listdir(path) if x.isdigit()] - - -def pid_exists(pid): - """Check for the existence of a unix PID. Linux TIDs are not - supported (always return False). - """ - if not _psposix.pid_exists(pid): - return False - else: - # Linux's apparently does not distinguish between PIDs and TIDs - # (thread IDs). - # listdir("/proc") won't show any TID (only PIDs) but - # os.stat("/proc/{tid}") will succeed if {tid} exists. - # os.kill() can also be passed a TID. This is quite confusing. - # In here we want to enforce this distinction and support PIDs - # only, see: - # https://github.com/giampaolo/psutil/issues/687 - try: - # Note: already checked that this is faster than using a - # regular expr. Also (a lot) faster than doing - # 'return pid in pids()' - path = f"{get_procfs_path()}/{pid}/status" - with open_binary(path) as f: - for line in f: - if line.startswith(b"Tgid:"): - tgid = int(line.split()[1]) - # If tgid and pid are the same then we're - # dealing with a process PID. - return tgid == pid - msg = f"'Tgid' line not found in {path}" - raise ValueError(msg) - except (OSError, ValueError): - return pid in pids() - - -def ppid_map(): - """Obtain a {pid: ppid, ...} dict for all running processes in - one shot. Used to speed up Process.children(). - """ - ret = {} - procfs_path = get_procfs_path() - for pid in pids(): - try: - with open_binary(f"{procfs_path}/{pid}/stat") as f: - data = f.read() - except (FileNotFoundError, ProcessLookupError): - # Note: we should be able to access /stat for all processes - # aka it's unlikely we'll bump into EPERM, which is good. - pass - else: - rpar = data.rfind(b')') - dset = data[rpar + 2 :].split() - ppid = int(dset[1]) - ret[pid] = ppid - return ret - - -def wrap_exceptions(fun): - """Decorator which translates bare OSError and OSError exceptions - into NoSuchProcess and AccessDenied. - """ - - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - pid, name = self.pid, self._name - try: - return fun(self, *args, **kwargs) - except PermissionError as err: - raise AccessDenied(pid, name) from err - except ProcessLookupError as err: - self._raise_if_zombie() - raise NoSuchProcess(pid, name) from err - except FileNotFoundError as err: - self._raise_if_zombie() - # /proc/PID directory may still exist, but the files within - # it may not, indicating the process is gone, see: - # https://github.com/giampaolo/psutil/issues/2418 - if not os.path.exists(f"{self._procfs_path}/{pid}/stat"): - raise NoSuchProcess(pid, name) from err - raise - - return wrapper - - -class Process: - """Linux process implementation.""" - - __slots__ = ["_cache", "_name", "_ppid", "_procfs_path", "pid"] - - def __init__(self, pid): - self.pid = pid - self._name = None - self._ppid = None - self._procfs_path = get_procfs_path() - - def _is_zombie(self): - # Note: most of the times Linux is able to return info about the - # process even if it's a zombie, and /proc/{pid} will exist. - # There are some exceptions though, like exe(), cmdline() and - # memory_maps(). In these cases /proc/{pid}/{file} exists but - # it's empty. Instead of returning a "null" value we'll raise an - # exception. - try: - data = bcat(f"{self._procfs_path}/{self.pid}/stat") - except OSError: - return False - else: - rpar = data.rfind(b')') - status = data[rpar + 2 : rpar + 3] - return status == b"Z" - - def _raise_if_zombie(self): - if self._is_zombie(): - raise ZombieProcess(self.pid, self._name, self._ppid) - - def _raise_if_not_alive(self): - """Raise NSP if the process disappeared on us.""" - # For those C function who do not raise NSP, possibly returning - # incorrect or incomplete result. - os.stat(f"{self._procfs_path}/{self.pid}") - - @wrap_exceptions - @memoize_when_activated - def _parse_stat_file(self): - """Parse /proc/{pid}/stat file and return a dict with various - process info. - Using "man proc" as a reference: where "man proc" refers to - position N always subtract 3 (e.g ppid position 4 in - 'man proc' == position 1 in here). - The return value is cached in case oneshot() ctx manager is - in use. - """ - data = bcat(f"{self._procfs_path}/{self.pid}/stat") - # Process name is between parentheses. It can contain spaces and - # other parentheses. This is taken into account by looking for - # the first occurrence of "(" and the last occurrence of ")". - rpar = data.rfind(b')') - name = data[data.find(b'(') + 1 : rpar] - fields = data[rpar + 2 :].split() - - ret = {} - ret['name'] = name - ret['status'] = fields[0] - ret['ppid'] = fields[1] - ret['ttynr'] = fields[4] - ret['utime'] = fields[11] - ret['stime'] = fields[12] - ret['children_utime'] = fields[13] - ret['children_stime'] = fields[14] - ret['create_time'] = fields[19] - ret['cpu_num'] = fields[36] - try: - ret['blkio_ticks'] = fields[39] # aka 'delayacct_blkio_ticks' - except IndexError: - # https://github.com/giampaolo/psutil/issues/2455 - debug("can't get blkio_ticks, set iowait to 0") - ret['blkio_ticks'] = 0 - - return ret - - @wrap_exceptions - @memoize_when_activated - def _read_status_file(self): - """Read /proc/{pid}/stat file and return its content. - The return value is cached in case oneshot() ctx manager is - in use. - """ - with open_binary(f"{self._procfs_path}/{self.pid}/status") as f: - return f.read() - - @wrap_exceptions - @memoize_when_activated - def _read_smaps_file(self): - with open_binary(f"{self._procfs_path}/{self.pid}/smaps") as f: - return f.read().strip() - - def oneshot_enter(self): - self._parse_stat_file.cache_activate(self) - self._read_status_file.cache_activate(self) - self._read_smaps_file.cache_activate(self) - - def oneshot_exit(self): - self._parse_stat_file.cache_deactivate(self) - self._read_status_file.cache_deactivate(self) - self._read_smaps_file.cache_deactivate(self) - - @wrap_exceptions - def name(self): - # XXX - gets changed later and probably needs refactoring - return decode(self._parse_stat_file()['name']) - - @wrap_exceptions - def exe(self): - try: - return readlink(f"{self._procfs_path}/{self.pid}/exe") - except (FileNotFoundError, ProcessLookupError): - self._raise_if_zombie() - # no such file error; might be raised also if the - # path actually exists for system processes with - # low pids (about 0-20) - if os.path.lexists(f"{self._procfs_path}/{self.pid}"): - return "" - raise - - @wrap_exceptions - def cmdline(self): - with open_text(f"{self._procfs_path}/{self.pid}/cmdline") as f: - data = f.read() - if not data: - # may happen in case of zombie process - self._raise_if_zombie() - return [] - # 'man proc' states that args are separated by null bytes '\0' - # and last char is supposed to be a null byte. Nevertheless - # some processes may change their cmdline after being started - # (via setproctitle() or similar), they are usually not - # compliant with this rule and use spaces instead. Google - # Chrome process is an example. See: - # https://github.com/giampaolo/psutil/issues/1179 - sep = '\x00' if data.endswith('\x00') else ' ' - if data.endswith(sep): - data = data[:-1] - cmdline = data.split(sep) - # Sometimes last char is a null byte '\0' but the args are - # separated by spaces, see: https://github.com/giampaolo/psutil/ - # issues/1179#issuecomment-552984549 - if sep == '\x00' and len(cmdline) == 1 and ' ' in data: - cmdline = data.split(' ') - return cmdline - - @wrap_exceptions - def environ(self): - with open_text(f"{self._procfs_path}/{self.pid}/environ") as f: - data = f.read() - return parse_environ_block(data) - - @wrap_exceptions - def terminal(self): - tty_nr = int(self._parse_stat_file()['ttynr']) - tmap = _psposix.get_terminal_map() - try: - return tmap[tty_nr] - except KeyError: - return None - - # May not be available on old kernels. - if os.path.exists(f"/proc/{os.getpid()}/io"): - - @wrap_exceptions - def io_counters(self): - fname = f"{self._procfs_path}/{self.pid}/io" - fields = {} - with open_binary(fname) as f: - for line in f: - # https://github.com/giampaolo/psutil/issues/1004 - line = line.strip() - if line: - try: - name, value = line.split(b': ') - except ValueError: - # https://github.com/giampaolo/psutil/issues/1004 - continue - else: - fields[name] = int(value) - if not fields: - msg = f"{fname} file was empty" - raise RuntimeError(msg) - try: - return pio( - fields[b'syscr'], # read syscalls - fields[b'syscw'], # write syscalls - fields[b'read_bytes'], # read bytes - fields[b'write_bytes'], # write bytes - fields[b'rchar'], # read chars - fields[b'wchar'], # write chars - ) - except KeyError as err: - msg = ( - f"{err.args[0]!r} field was not found in {fname}; found" - f" fields are {fields!r}" - ) - raise ValueError(msg) from None - - @wrap_exceptions - def cpu_times(self): - values = self._parse_stat_file() - utime = float(values['utime']) / CLOCK_TICKS - stime = float(values['stime']) / CLOCK_TICKS - children_utime = float(values['children_utime']) / CLOCK_TICKS - children_stime = float(values['children_stime']) / CLOCK_TICKS - iowait = float(values['blkio_ticks']) / CLOCK_TICKS - return pcputimes(utime, stime, children_utime, children_stime, iowait) - - @wrap_exceptions - def cpu_num(self): - """What CPU the process is on.""" - return int(self._parse_stat_file()['cpu_num']) - - @wrap_exceptions - def wait(self, timeout=None): - return _psposix.wait_pid(self.pid, timeout, self._name) - - @wrap_exceptions - def create_time(self): - ctime = float(self._parse_stat_file()['create_time']) - # According to documentation, starttime is in field 21 and the - # unit is jiffies (clock ticks). - # We first divide it for clock ticks and then add uptime returning - # seconds since the epoch. - # Also use cached value if available. - bt = BOOT_TIME or boot_time() - return (ctime / CLOCK_TICKS) + bt - - @wrap_exceptions - def memory_info(self): - # ============================================================ - # | FIELD | DESCRIPTION | AKA | TOP | - # ============================================================ - # | rss | resident set size | | RES | - # | vms | total program size | size | VIRT | - # | shared | shared pages (from shared mappings) | | SHR | - # | text | text ('code') | trs | CODE | - # | lib | library (unused in Linux 2.6) | lrs | | - # | data | data + stack | drs | DATA | - # | dirty | dirty pages (unused in Linux 2.6) | dt | | - # ============================================================ - with open_binary(f"{self._procfs_path}/{self.pid}/statm") as f: - vms, rss, shared, text, lib, data, dirty = ( - int(x) * PAGESIZE for x in f.readline().split()[:7] - ) - return pmem(rss, vms, shared, text, lib, data, dirty) - - if HAS_PROC_SMAPS_ROLLUP or HAS_PROC_SMAPS: - - def _parse_smaps_rollup(self): - # /proc/pid/smaps_rollup was added to Linux in 2017. Faster - # than /proc/pid/smaps. It reports higher PSS than */smaps - # (from 1k up to 200k higher; tested against all processes). - # IMPORTANT: /proc/pid/smaps_rollup is weird, because it - # raises ESRCH / ENOENT for many PIDs, even if they're alive - # (also as root). In that case we'll use /proc/pid/smaps as - # fallback, which is slower but has a +50% success rate - # compared to /proc/pid/smaps_rollup. - uss = pss = swap = 0 - with open_binary( - f"{self._procfs_path}/{self.pid}/smaps_rollup" - ) as f: - for line in f: - if line.startswith(b"Private_"): - # Private_Clean, Private_Dirty, Private_Hugetlb - uss += int(line.split()[1]) * 1024 - elif line.startswith(b"Pss:"): - pss = int(line.split()[1]) * 1024 - elif line.startswith(b"Swap:"): - swap = int(line.split()[1]) * 1024 - return (uss, pss, swap) - - @wrap_exceptions - def _parse_smaps( - self, - # Gets Private_Clean, Private_Dirty, Private_Hugetlb. - _private_re=re.compile(br"\nPrivate.*:\s+(\d+)"), - _pss_re=re.compile(br"\nPss\:\s+(\d+)"), - _swap_re=re.compile(br"\nSwap\:\s+(\d+)"), - ): - # /proc/pid/smaps does not exist on kernels < 2.6.14 or if - # CONFIG_MMU kernel configuration option is not enabled. - - # Note: using 3 regexes is faster than reading the file - # line by line. - # - # You might be tempted to calculate USS by subtracting - # the "shared" value from the "resident" value in - # /proc//statm. But at least on Linux, statm's "shared" - # value actually counts pages backed by files, which has - # little to do with whether the pages are actually shared. - # /proc/self/smaps on the other hand appears to give us the - # correct information. - smaps_data = self._read_smaps_file() - # Note: smaps file can be empty for certain processes. - # The code below will not crash though and will result to 0. - uss = sum(map(int, _private_re.findall(smaps_data))) * 1024 - pss = sum(map(int, _pss_re.findall(smaps_data))) * 1024 - swap = sum(map(int, _swap_re.findall(smaps_data))) * 1024 - return (uss, pss, swap) - - @wrap_exceptions - def memory_full_info(self): - if HAS_PROC_SMAPS_ROLLUP: # faster - try: - uss, pss, swap = self._parse_smaps_rollup() - except (ProcessLookupError, FileNotFoundError): - uss, pss, swap = self._parse_smaps() - else: - uss, pss, swap = self._parse_smaps() - basic_mem = self.memory_info() - return pfullmem(*basic_mem + (uss, pss, swap)) - - else: - memory_full_info = memory_info - - if HAS_PROC_SMAPS: - - @wrap_exceptions - def memory_maps(self): - """Return process's mapped memory regions as a list of named - tuples. Fields are explained in 'man proc'; here is an updated - (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0. - - /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if - CONFIG_MMU kernel configuration option is not enabled. - """ - - def get_blocks(lines, current_block): - data = {} - for line in lines: - fields = line.split(None, 5) - if not fields[0].endswith(b':'): - # new block section - yield (current_block.pop(), data) - current_block.append(line) - else: - try: - data[fields[0]] = int(fields[1]) * 1024 - except ValueError: - if fields[0].startswith(b'VmFlags:'): - # see issue #369 - continue - msg = f"don't know how to interpret line {line!r}" - raise ValueError(msg) from None - yield (current_block.pop(), data) - - data = self._read_smaps_file() - # Note: smaps file can be empty for certain processes or for - # zombies. - if not data: - self._raise_if_zombie() - return [] - lines = data.split(b'\n') - ls = [] - first_line = lines.pop(0) - current_block = [first_line] - for header, data in get_blocks(lines, current_block): - hfields = header.split(None, 5) - try: - addr, perms, _offset, _dev, _inode, path = hfields - except ValueError: - addr, perms, _offset, _dev, _inode, path = hfields + [''] - if not path: - path = '[anon]' - else: - path = decode(path) - path = path.strip() - if path.endswith(' (deleted)') and not path_exists_strict( - path - ): - path = path[:-10] - item = ( - decode(addr), - decode(perms), - path, - data.get(b'Rss:', 0), - data.get(b'Size:', 0), - data.get(b'Pss:', 0), - data.get(b'Shared_Clean:', 0), - data.get(b'Shared_Dirty:', 0), - data.get(b'Private_Clean:', 0), - data.get(b'Private_Dirty:', 0), - data.get(b'Referenced:', 0), - data.get(b'Anonymous:', 0), - data.get(b'Swap:', 0), - ) - ls.append(item) - return ls - - @wrap_exceptions - def cwd(self): - return readlink(f"{self._procfs_path}/{self.pid}/cwd") - - @wrap_exceptions - def num_ctx_switches( - self, _ctxsw_re=re.compile(br'ctxt_switches:\t(\d+)') - ): - data = self._read_status_file() - ctxsw = _ctxsw_re.findall(data) - if not ctxsw: - msg = ( - "'voluntary_ctxt_switches' and" - " 'nonvoluntary_ctxt_switches'lines were not found in" - f" {self._procfs_path}/{self.pid}/status; the kernel is" - " probably older than 2.6.23" - ) - raise NotImplementedError(msg) - return _common.pctxsw(int(ctxsw[0]), int(ctxsw[1])) - - @wrap_exceptions - def num_threads(self, _num_threads_re=re.compile(br'Threads:\t(\d+)')): - # Using a re is faster than iterating over file line by line. - data = self._read_status_file() - return int(_num_threads_re.findall(data)[0]) - - @wrap_exceptions - def threads(self): - thread_ids = os.listdir(f"{self._procfs_path}/{self.pid}/task") - thread_ids.sort() - retlist = [] - hit_enoent = False - for thread_id in thread_ids: - fname = f"{self._procfs_path}/{self.pid}/task/{thread_id}/stat" - try: - with open_binary(fname) as f: - st = f.read().strip() - except (FileNotFoundError, ProcessLookupError): - # no such file or directory or no such process; - # it means thread disappeared on us - hit_enoent = True - continue - # ignore the first two values ("pid (exe)") - st = st[st.find(b')') + 2 :] - values = st.split(b' ') - utime = float(values[11]) / CLOCK_TICKS - stime = float(values[12]) / CLOCK_TICKS - ntuple = _common.pthread(int(thread_id), utime, stime) - retlist.append(ntuple) - if hit_enoent: - self._raise_if_not_alive() - return retlist - - @wrap_exceptions - def nice_get(self): - # with open_text(f"{self._procfs_path}/{self.pid}/stat") as f: - # data = f.read() - # return int(data.split()[18]) - - # Use C implementation - return cext_posix.getpriority(self.pid) - - @wrap_exceptions - def nice_set(self, value): - return cext_posix.setpriority(self.pid, value) - - # starting from CentOS 6. - if HAS_CPU_AFFINITY: - - @wrap_exceptions - def cpu_affinity_get(self): - return cext.proc_cpu_affinity_get(self.pid) - - def _get_eligible_cpus( - self, _re=re.compile(br"Cpus_allowed_list:\t(\d+)-(\d+)") - ): - # See: https://github.com/giampaolo/psutil/issues/956 - data = self._read_status_file() - match = _re.findall(data) - if match: - return list(range(int(match[0][0]), int(match[0][1]) + 1)) - else: - return list(range(len(per_cpu_times()))) - - @wrap_exceptions - def cpu_affinity_set(self, cpus): - try: - cext.proc_cpu_affinity_set(self.pid, cpus) - except (OSError, ValueError) as err: - if isinstance(err, ValueError) or err.errno == errno.EINVAL: - eligible_cpus = self._get_eligible_cpus() - all_cpus = tuple(range(len(per_cpu_times()))) - for cpu in cpus: - if cpu not in all_cpus: - msg = ( - f"invalid CPU {cpu!r}; choose between" - f" {eligible_cpus!r}" - ) - raise ValueError(msg) from None - if cpu not in eligible_cpus: - msg = ( - f"CPU number {cpu} is not eligible; choose" - f" between {eligible_cpus}" - ) - raise ValueError(msg) from err - raise - - # only starting from kernel 2.6.13 - if HAS_PROC_IO_PRIORITY: - - @wrap_exceptions - def ionice_get(self): - ioclass, value = cext.proc_ioprio_get(self.pid) - ioclass = IOPriority(ioclass) - return _common.pionice(ioclass, value) - - @wrap_exceptions - def ionice_set(self, ioclass, value): - if value is None: - value = 0 - if value and ioclass in { - IOPriority.IOPRIO_CLASS_IDLE, - IOPriority.IOPRIO_CLASS_NONE, - }: - msg = f"{ioclass!r} ioclass accepts no value" - raise ValueError(msg) - if value < 0 or value > 7: - msg = "value not in 0-7 range" - raise ValueError(msg) - return cext.proc_ioprio_set(self.pid, ioclass, value) - - if hasattr(resource, "prlimit"): - - @wrap_exceptions - def rlimit(self, resource_, limits=None): - # If pid is 0 prlimit() applies to the calling process and - # we don't want that. We should never get here though as - # PID 0 is not supported on Linux. - if self.pid == 0: - msg = "can't use prlimit() against PID 0 process" - raise ValueError(msg) - try: - if limits is None: - # get - return resource.prlimit(self.pid, resource_) - else: - # set - if len(limits) != 2: - msg = ( - "second argument must be a (soft, hard) " - f"tuple, got {limits!r}" - ) - raise ValueError(msg) - resource.prlimit(self.pid, resource_, limits) - except OSError as err: - if err.errno == errno.ENOSYS: - # I saw this happening on Travis: - # https://travis-ci.org/giampaolo/psutil/jobs/51368273 - self._raise_if_zombie() - raise - - @wrap_exceptions - def status(self): - letter = self._parse_stat_file()['status'] - letter = letter.decode() - # XXX is '?' legit? (we're not supposed to return it anyway) - return PROC_STATUSES.get(letter, '?') - - @wrap_exceptions - def open_files(self): - retlist = [] - files = os.listdir(f"{self._procfs_path}/{self.pid}/fd") - hit_enoent = False - for fd in files: - file = f"{self._procfs_path}/{self.pid}/fd/{fd}" - try: - path = readlink(file) - except (FileNotFoundError, ProcessLookupError): - # ENOENT == file which is gone in the meantime - hit_enoent = True - continue - except OSError as err: - if err.errno == errno.EINVAL: - # not a link - continue - if err.errno == errno.ENAMETOOLONG: - # file name too long - debug(err) - continue - raise - else: - # If path is not an absolute there's no way to tell - # whether it's a regular file or not, so we skip it. - # A regular file is always supposed to be have an - # absolute path though. - if path.startswith('/') and isfile_strict(path): - # Get file position and flags. - file = f"{self._procfs_path}/{self.pid}/fdinfo/{fd}" - try: - with open_binary(file) as f: - pos = int(f.readline().split()[1]) - flags = int(f.readline().split()[1], 8) - except (FileNotFoundError, ProcessLookupError): - # fd gone in the meantime; process may - # still be alive - hit_enoent = True - else: - mode = file_flags_to_mode(flags) - ntuple = popenfile( - path, int(fd), int(pos), mode, flags - ) - retlist.append(ntuple) - if hit_enoent: - self._raise_if_not_alive() - return retlist - - @wrap_exceptions - def net_connections(self, kind='inet'): - ret = _net_connections.retrieve(kind, self.pid) - self._raise_if_not_alive() - return ret - - @wrap_exceptions - def num_fds(self): - return len(os.listdir(f"{self._procfs_path}/{self.pid}/fd")) - - @wrap_exceptions - def ppid(self): - return int(self._parse_stat_file()['ppid']) - - @wrap_exceptions - def uids(self, _uids_re=re.compile(br'Uid:\t(\d+)\t(\d+)\t(\d+)')): - data = self._read_status_file() - real, effective, saved = _uids_re.findall(data)[0] - return _common.puids(int(real), int(effective), int(saved)) - - @wrap_exceptions - def gids(self, _gids_re=re.compile(br'Gid:\t(\d+)\t(\d+)\t(\d+)')): - data = self._read_status_file() - real, effective, saved = _gids_re.findall(data)[0] - return _common.pgids(int(real), int(effective), int(saved)) diff --git a/PortablePython/Lib/site-packages/psutil/_psosx.py b/PortablePython/Lib/site-packages/psutil/_psosx.py deleted file mode 100644 index 620497b..0000000 --- a/PortablePython/Lib/site-packages/psutil/_psosx.py +++ /dev/null @@ -1,544 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""macOS platform implementation.""" - -import errno -import functools -import os -from collections import namedtuple - -from . import _common -from . import _psposix -from . import _psutil_osx as cext -from . import _psutil_posix as cext_posix -from ._common import AccessDenied -from ._common import NoSuchProcess -from ._common import ZombieProcess -from ._common import conn_tmap -from ._common import conn_to_ntuple -from ._common import isfile_strict -from ._common import memoize_when_activated -from ._common import parse_environ_block -from ._common import usage_percent - - -__extra__all__ = [] - - -# ===================================================================== -# --- globals -# ===================================================================== - - -PAGESIZE = cext_posix.getpagesize() -AF_LINK = cext_posix.AF_LINK - -TCP_STATUSES = { - cext.TCPS_ESTABLISHED: _common.CONN_ESTABLISHED, - cext.TCPS_SYN_SENT: _common.CONN_SYN_SENT, - cext.TCPS_SYN_RECEIVED: _common.CONN_SYN_RECV, - cext.TCPS_FIN_WAIT_1: _common.CONN_FIN_WAIT1, - cext.TCPS_FIN_WAIT_2: _common.CONN_FIN_WAIT2, - cext.TCPS_TIME_WAIT: _common.CONN_TIME_WAIT, - cext.TCPS_CLOSED: _common.CONN_CLOSE, - cext.TCPS_CLOSE_WAIT: _common.CONN_CLOSE_WAIT, - cext.TCPS_LAST_ACK: _common.CONN_LAST_ACK, - cext.TCPS_LISTEN: _common.CONN_LISTEN, - cext.TCPS_CLOSING: _common.CONN_CLOSING, - cext.PSUTIL_CONN_NONE: _common.CONN_NONE, -} - -PROC_STATUSES = { - cext.SIDL: _common.STATUS_IDLE, - cext.SRUN: _common.STATUS_RUNNING, - cext.SSLEEP: _common.STATUS_SLEEPING, - cext.SSTOP: _common.STATUS_STOPPED, - cext.SZOMB: _common.STATUS_ZOMBIE, -} - -kinfo_proc_map = dict( - ppid=0, - ruid=1, - euid=2, - suid=3, - rgid=4, - egid=5, - sgid=6, - ttynr=7, - ctime=8, - status=9, - name=10, -) - -pidtaskinfo_map = dict( - cpuutime=0, - cpustime=1, - rss=2, - vms=3, - pfaults=4, - pageins=5, - numthreads=6, - volctxsw=7, -) - - -# ===================================================================== -# --- named tuples -# ===================================================================== - - -# fmt: off -# psutil.cpu_times() -scputimes = namedtuple('scputimes', ['user', 'nice', 'system', 'idle']) -# psutil.virtual_memory() -svmem = namedtuple( - 'svmem', ['total', 'available', 'percent', 'used', 'free', - 'active', 'inactive', 'wired']) -# psutil.Process.memory_info() -pmem = namedtuple('pmem', ['rss', 'vms', 'pfaults', 'pageins']) -# psutil.Process.memory_full_info() -pfullmem = namedtuple('pfullmem', pmem._fields + ('uss', )) -# fmt: on - - -# ===================================================================== -# --- memory -# ===================================================================== - - -def virtual_memory(): - """System virtual memory as a namedtuple.""" - total, active, inactive, wired, free, speculative = cext.virtual_mem() - # This is how Zabbix calculate avail and used mem: - # https://github.com/zabbix/zabbix/blob/master/src/libs/zbxsysinfo/osx/memory.c - # Also see: https://github.com/giampaolo/psutil/issues/1277 - avail = inactive + free - used = active + wired - # This is NOT how Zabbix calculates free mem but it matches "free" - # cmdline utility. - free -= speculative - percent = usage_percent((total - avail), total, round_=1) - return svmem(total, avail, percent, used, free, active, inactive, wired) - - -def swap_memory(): - """Swap system memory as a (total, used, free, sin, sout) tuple.""" - total, used, free, sin, sout = cext.swap_mem() - percent = usage_percent(used, total, round_=1) - return _common.sswap(total, used, free, percent, sin, sout) - - -# ===================================================================== -# --- CPU -# ===================================================================== - - -def cpu_times(): - """Return system CPU times as a namedtuple.""" - user, nice, system, idle = cext.cpu_times() - return scputimes(user, nice, system, idle) - - -def per_cpu_times(): - """Return system CPU times as a named tuple.""" - ret = [] - for cpu_t in cext.per_cpu_times(): - user, nice, system, idle = cpu_t - item = scputimes(user, nice, system, idle) - ret.append(item) - return ret - - -def cpu_count_logical(): - """Return the number of logical CPUs in the system.""" - return cext.cpu_count_logical() - - -def cpu_count_cores(): - """Return the number of CPU cores in the system.""" - return cext.cpu_count_cores() - - -def cpu_stats(): - ctx_switches, interrupts, soft_interrupts, syscalls, _traps = ( - cext.cpu_stats() - ) - return _common.scpustats( - ctx_switches, interrupts, soft_interrupts, syscalls - ) - - -def cpu_freq(): - """Return CPU frequency. - On macOS per-cpu frequency is not supported. - Also, the returned frequency never changes, see: - https://arstechnica.com/civis/viewtopic.php?f=19&t=465002. - """ - curr, min_, max_ = cext.cpu_freq() - return [_common.scpufreq(curr, min_, max_)] - - -# ===================================================================== -# --- disks -# ===================================================================== - - -disk_usage = _psposix.disk_usage -disk_io_counters = cext.disk_io_counters - - -def disk_partitions(all=False): - """Return mounted disk partitions as a list of namedtuples.""" - retlist = [] - partitions = cext.disk_partitions() - for partition in partitions: - device, mountpoint, fstype, opts = partition - if device == 'none': - device = '' - if not all: - if not os.path.isabs(device) or not os.path.exists(device): - continue - ntuple = _common.sdiskpart(device, mountpoint, fstype, opts) - retlist.append(ntuple) - return retlist - - -# ===================================================================== -# --- sensors -# ===================================================================== - - -def sensors_battery(): - """Return battery information.""" - try: - percent, minsleft, power_plugged = cext.sensors_battery() - except NotImplementedError: - # no power source - return None according to interface - return None - power_plugged = power_plugged == 1 - if power_plugged: - secsleft = _common.POWER_TIME_UNLIMITED - elif minsleft == -1: - secsleft = _common.POWER_TIME_UNKNOWN - else: - secsleft = minsleft * 60 - return _common.sbattery(percent, secsleft, power_plugged) - - -# ===================================================================== -# --- network -# ===================================================================== - - -net_io_counters = cext.net_io_counters -net_if_addrs = cext_posix.net_if_addrs - - -def net_connections(kind='inet'): - """System-wide network connections.""" - # Note: on macOS this will fail with AccessDenied unless - # the process is owned by root. - ret = [] - for pid in pids(): - try: - cons = Process(pid).net_connections(kind) - except NoSuchProcess: - continue - else: - if cons: - for c in cons: - c = list(c) + [pid] - ret.append(_common.sconn(*c)) - return ret - - -def net_if_stats(): - """Get NIC stats (isup, duplex, speed, mtu).""" - names = net_io_counters().keys() - ret = {} - for name in names: - try: - mtu = cext_posix.net_if_mtu(name) - flags = cext_posix.net_if_flags(name) - duplex, speed = cext_posix.net_if_duplex_speed(name) - except OSError as err: - # https://github.com/giampaolo/psutil/issues/1279 - if err.errno != errno.ENODEV: - raise - else: - if hasattr(_common, 'NicDuplex'): - duplex = _common.NicDuplex(duplex) - output_flags = ','.join(flags) - isup = 'running' in flags - ret[name] = _common.snicstats( - isup, duplex, speed, mtu, output_flags - ) - return ret - - -# ===================================================================== -# --- other system functions -# ===================================================================== - - -def boot_time(): - """The system boot time expressed in seconds since the epoch.""" - return cext.boot_time() - - -def users(): - """Return currently connected users as a list of namedtuples.""" - retlist = [] - rawlist = cext.users() - for item in rawlist: - user, tty, hostname, tstamp, pid = item - if tty == '~': - continue # reboot or shutdown - if not tstamp: - continue - nt = _common.suser(user, tty or None, hostname or None, tstamp, pid) - retlist.append(nt) - return retlist - - -# ===================================================================== -# --- processes -# ===================================================================== - - -def pids(): - ls = cext.pids() - if 0 not in ls: - # On certain macOS versions pids() C doesn't return PID 0 but - # "ps" does and the process is querable via sysctl(): - # https://travis-ci.org/giampaolo/psutil/jobs/309619941 - try: - Process(0).create_time() - ls.insert(0, 0) - except NoSuchProcess: - pass - except AccessDenied: - ls.insert(0, 0) - return ls - - -pid_exists = _psposix.pid_exists - - -def is_zombie(pid): - try: - st = cext.proc_kinfo_oneshot(pid)[kinfo_proc_map['status']] - return st == cext.SZOMB - except OSError: - return False - - -def wrap_exceptions(fun): - """Decorator which translates bare OSError exceptions into - NoSuchProcess and AccessDenied. - """ - - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - pid, ppid, name = self.pid, self._ppid, self._name - try: - return fun(self, *args, **kwargs) - except ProcessLookupError as err: - if is_zombie(pid): - raise ZombieProcess(pid, name, ppid) from err - raise NoSuchProcess(pid, name) from err - except PermissionError as err: - raise AccessDenied(pid, name) from err - - return wrapper - - -class Process: - """Wrapper class around underlying C implementation.""" - - __slots__ = ["_cache", "_name", "_ppid", "pid"] - - def __init__(self, pid): - self.pid = pid - self._name = None - self._ppid = None - - @wrap_exceptions - @memoize_when_activated - def _get_kinfo_proc(self): - # Note: should work with all PIDs without permission issues. - ret = cext.proc_kinfo_oneshot(self.pid) - assert len(ret) == len(kinfo_proc_map) - return ret - - @wrap_exceptions - @memoize_when_activated - def _get_pidtaskinfo(self): - # Note: should work for PIDs owned by user only. - ret = cext.proc_pidtaskinfo_oneshot(self.pid) - assert len(ret) == len(pidtaskinfo_map) - return ret - - def oneshot_enter(self): - self._get_kinfo_proc.cache_activate(self) - self._get_pidtaskinfo.cache_activate(self) - - def oneshot_exit(self): - self._get_kinfo_proc.cache_deactivate(self) - self._get_pidtaskinfo.cache_deactivate(self) - - @wrap_exceptions - def name(self): - name = self._get_kinfo_proc()[kinfo_proc_map['name']] - return name if name is not None else cext.proc_name(self.pid) - - @wrap_exceptions - def exe(self): - return cext.proc_exe(self.pid) - - @wrap_exceptions - def cmdline(self): - return cext.proc_cmdline(self.pid) - - @wrap_exceptions - def environ(self): - return parse_environ_block(cext.proc_environ(self.pid)) - - @wrap_exceptions - def ppid(self): - self._ppid = self._get_kinfo_proc()[kinfo_proc_map['ppid']] - return self._ppid - - @wrap_exceptions - def cwd(self): - return cext.proc_cwd(self.pid) - - @wrap_exceptions - def uids(self): - rawtuple = self._get_kinfo_proc() - return _common.puids( - rawtuple[kinfo_proc_map['ruid']], - rawtuple[kinfo_proc_map['euid']], - rawtuple[kinfo_proc_map['suid']], - ) - - @wrap_exceptions - def gids(self): - rawtuple = self._get_kinfo_proc() - return _common.puids( - rawtuple[kinfo_proc_map['rgid']], - rawtuple[kinfo_proc_map['egid']], - rawtuple[kinfo_proc_map['sgid']], - ) - - @wrap_exceptions - def terminal(self): - tty_nr = self._get_kinfo_proc()[kinfo_proc_map['ttynr']] - tmap = _psposix.get_terminal_map() - try: - return tmap[tty_nr] - except KeyError: - return None - - @wrap_exceptions - def memory_info(self): - rawtuple = self._get_pidtaskinfo() - return pmem( - rawtuple[pidtaskinfo_map['rss']], - rawtuple[pidtaskinfo_map['vms']], - rawtuple[pidtaskinfo_map['pfaults']], - rawtuple[pidtaskinfo_map['pageins']], - ) - - @wrap_exceptions - def memory_full_info(self): - basic_mem = self.memory_info() - uss = cext.proc_memory_uss(self.pid) - return pfullmem(*basic_mem + (uss,)) - - @wrap_exceptions - def cpu_times(self): - rawtuple = self._get_pidtaskinfo() - return _common.pcputimes( - rawtuple[pidtaskinfo_map['cpuutime']], - rawtuple[pidtaskinfo_map['cpustime']], - # children user / system times are not retrievable (set to 0) - 0.0, - 0.0, - ) - - @wrap_exceptions - def create_time(self): - return self._get_kinfo_proc()[kinfo_proc_map['ctime']] - - @wrap_exceptions - def num_ctx_switches(self): - # Unvoluntary value seems not to be available; - # getrusage() numbers seems to confirm this theory. - # We set it to 0. - vol = self._get_pidtaskinfo()[pidtaskinfo_map['volctxsw']] - return _common.pctxsw(vol, 0) - - @wrap_exceptions - def num_threads(self): - return self._get_pidtaskinfo()[pidtaskinfo_map['numthreads']] - - @wrap_exceptions - def open_files(self): - if self.pid == 0: - return [] - files = [] - rawlist = cext.proc_open_files(self.pid) - for path, fd in rawlist: - if isfile_strict(path): - ntuple = _common.popenfile(path, fd) - files.append(ntuple) - return files - - @wrap_exceptions - def net_connections(self, kind='inet'): - families, types = conn_tmap[kind] - rawlist = cext.proc_net_connections(self.pid, families, types) - ret = [] - for item in rawlist: - fd, fam, type, laddr, raddr, status = item - nt = conn_to_ntuple( - fd, fam, type, laddr, raddr, status, TCP_STATUSES - ) - ret.append(nt) - return ret - - @wrap_exceptions - def num_fds(self): - if self.pid == 0: - return 0 - return cext.proc_num_fds(self.pid) - - @wrap_exceptions - def wait(self, timeout=None): - return _psposix.wait_pid(self.pid, timeout, self._name) - - @wrap_exceptions - def nice_get(self): - return cext_posix.getpriority(self.pid) - - @wrap_exceptions - def nice_set(self, value): - return cext_posix.setpriority(self.pid, value) - - @wrap_exceptions - def status(self): - code = self._get_kinfo_proc()[kinfo_proc_map['status']] - # XXX is '?' legit? (we're not supposed to return it anyway) - return PROC_STATUSES.get(code, '?') - - @wrap_exceptions - def threads(self): - rawlist = cext.proc_threads(self.pid) - retlist = [] - for thread_id, utime, stime in rawlist: - ntuple = _common.pthread(thread_id, utime, stime) - retlist.append(ntuple) - return retlist diff --git a/PortablePython/Lib/site-packages/psutil/_psposix.py b/PortablePython/Lib/site-packages/psutil/_psposix.py deleted file mode 100644 index 88703fd..0000000 --- a/PortablePython/Lib/site-packages/psutil/_psposix.py +++ /dev/null @@ -1,207 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Routines common to all posix systems.""" - -import enum -import glob -import os -import signal -import time - -from ._common import MACOS -from ._common import TimeoutExpired -from ._common import memoize -from ._common import sdiskusage -from ._common import usage_percent - - -if MACOS: - from . import _psutil_osx - - -__all__ = ['pid_exists', 'wait_pid', 'disk_usage', 'get_terminal_map'] - - -def pid_exists(pid): - """Check whether pid exists in the current process table.""" - if pid == 0: - # According to "man 2 kill" PID 0 has a special meaning: - # it refers to <> so we don't want to go any further. - # If we get here it means this UNIX platform *does* have - # a process with id 0. - return True - try: - os.kill(pid, 0) - except ProcessLookupError: - return False - except PermissionError: - # EPERM clearly means there's a process to deny access to - return True - # According to "man 2 kill" possible error values are - # (EINVAL, EPERM, ESRCH) - else: - return True - - -Negsignal = enum.IntEnum( - 'Negsignal', {x.name: -x.value for x in signal.Signals} -) - - -def negsig_to_enum(num): - """Convert a negative signal value to an enum.""" - try: - return Negsignal(num) - except ValueError: - return num - - -def wait_pid( - pid, - timeout=None, - proc_name=None, - _waitpid=os.waitpid, - _timer=getattr(time, 'monotonic', time.time), # noqa: B008 - _min=min, - _sleep=time.sleep, - _pid_exists=pid_exists, -): - """Wait for a process PID to terminate. - - If the process terminated normally by calling exit(3) or _exit(2), - or by returning from main(), the return value is the positive integer - passed to *exit(). - - If it was terminated by a signal it returns the negated value of the - signal which caused the termination (e.g. -SIGTERM). - - If PID is not a children of os.getpid() (current process) just - wait until the process disappears and return None. - - If PID does not exist at all return None immediately. - - If *timeout* != None and process is still alive raise TimeoutExpired. - timeout=0 is also possible (either return immediately or raise). - """ - if pid <= 0: - # see "man waitpid" - msg = "can't wait for PID 0" - raise ValueError(msg) - interval = 0.0001 - flags = 0 - if timeout is not None: - flags |= os.WNOHANG - stop_at = _timer() + timeout - - def sleep(interval): - # Sleep for some time and return a new increased interval. - if timeout is not None: - if _timer() >= stop_at: - raise TimeoutExpired(timeout, pid=pid, name=proc_name) - _sleep(interval) - return _min(interval * 2, 0.04) - - # See: https://linux.die.net/man/2/waitpid - while True: - try: - retpid, status = os.waitpid(pid, flags) - except InterruptedError: - interval = sleep(interval) - except ChildProcessError: - # This has two meanings: - # - PID is not a child of os.getpid() in which case - # we keep polling until it's gone - # - PID never existed in the first place - # In both cases we'll eventually return None as we - # can't determine its exit status code. - while _pid_exists(pid): - interval = sleep(interval) - return None - else: - if retpid == 0: - # WNOHANG flag was used and PID is still running. - interval = sleep(interval) - continue - - if os.WIFEXITED(status): - # Process terminated normally by calling exit(3) or _exit(2), - # or by returning from main(). The return value is the - # positive integer passed to *exit(). - return os.WEXITSTATUS(status) - elif os.WIFSIGNALED(status): - # Process exited due to a signal. Return the negative value - # of that signal. - return negsig_to_enum(-os.WTERMSIG(status)) - # elif os.WIFSTOPPED(status): - # # Process was stopped via SIGSTOP or is being traced, and - # # waitpid() was called with WUNTRACED flag. PID is still - # # alive. From now on waitpid() will keep returning (0, 0) - # # until the process state doesn't change. - # # It may make sense to catch/enable this since stopped PIDs - # # ignore SIGTERM. - # interval = sleep(interval) - # continue - # elif os.WIFCONTINUED(status): - # # Process was resumed via SIGCONT and waitpid() was called - # # with WCONTINUED flag. - # interval = sleep(interval) - # continue - else: - # Should never happen. - msg = f"unknown process exit status {status!r}" - raise ValueError(msg) - - -def disk_usage(path): - """Return disk usage associated with path. - Note: UNIX usually reserves 5% disk space which is not accessible - by user. In this function "total" and "used" values reflect the - total and used disk space whereas "free" and "percent" represent - the "free" and "used percent" user disk space. - """ - st = os.statvfs(path) - # Total space which is only available to root (unless changed - # at system level). - total = st.f_blocks * st.f_frsize - # Remaining free space usable by root. - avail_to_root = st.f_bfree * st.f_frsize - # Remaining free space usable by user. - avail_to_user = st.f_bavail * st.f_frsize - # Total space being used in general. - used = total - avail_to_root - if MACOS: - # see: https://github.com/giampaolo/psutil/pull/2152 - used = _psutil_osx.disk_usage_used(path, used) - # Total space which is available to user (same as 'total' but - # for the user). - total_user = used + avail_to_user - # User usage percent compared to the total amount of space - # the user can use. This number would be higher if compared - # to root's because the user has less space (usually -5%). - usage_percent_user = usage_percent(used, total_user, round_=1) - - # NB: the percentage is -5% than what shown by df due to - # reserved blocks that we are currently not considering: - # https://github.com/giampaolo/psutil/issues/829#issuecomment-223750462 - return sdiskusage( - total=total, used=used, free=avail_to_user, percent=usage_percent_user - ) - - -@memoize -def get_terminal_map(): - """Get a map of device-id -> path as a dict. - Used by Process.terminal(). - """ - ret = {} - ls = glob.glob('/dev/tty*') + glob.glob('/dev/pts/*') - for name in ls: - assert name not in ret, name - try: - ret[os.stat(name).st_rdev] = name - except FileNotFoundError: - pass - return ret diff --git a/PortablePython/Lib/site-packages/psutil/_pssunos.py b/PortablePython/Lib/site-packages/psutil/_pssunos.py deleted file mode 100644 index 78d941c..0000000 --- a/PortablePython/Lib/site-packages/psutil/_pssunos.py +++ /dev/null @@ -1,734 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Sun OS Solaris platform implementation.""" - -import errno -import functools -import os -import socket -import subprocess -import sys -from collections import namedtuple -from socket import AF_INET - -from . import _common -from . import _psposix -from . import _psutil_posix as cext_posix -from . import _psutil_sunos as cext -from ._common import AF_INET6 -from ._common import ENCODING -from ._common import AccessDenied -from ._common import NoSuchProcess -from ._common import ZombieProcess -from ._common import debug -from ._common import get_procfs_path -from ._common import isfile_strict -from ._common import memoize_when_activated -from ._common import sockfam_to_enum -from ._common import socktype_to_enum -from ._common import usage_percent - - -__extra__all__ = ["CONN_IDLE", "CONN_BOUND", "PROCFS_PATH"] - - -# ===================================================================== -# --- globals -# ===================================================================== - - -PAGE_SIZE = cext_posix.getpagesize() -AF_LINK = cext_posix.AF_LINK -IS_64_BIT = sys.maxsize > 2**32 - -CONN_IDLE = "IDLE" -CONN_BOUND = "BOUND" - -PROC_STATUSES = { - cext.SSLEEP: _common.STATUS_SLEEPING, - cext.SRUN: _common.STATUS_RUNNING, - cext.SZOMB: _common.STATUS_ZOMBIE, - cext.SSTOP: _common.STATUS_STOPPED, - cext.SIDL: _common.STATUS_IDLE, - cext.SONPROC: _common.STATUS_RUNNING, # same as run - cext.SWAIT: _common.STATUS_WAITING, -} - -TCP_STATUSES = { - cext.TCPS_ESTABLISHED: _common.CONN_ESTABLISHED, - cext.TCPS_SYN_SENT: _common.CONN_SYN_SENT, - cext.TCPS_SYN_RCVD: _common.CONN_SYN_RECV, - cext.TCPS_FIN_WAIT_1: _common.CONN_FIN_WAIT1, - cext.TCPS_FIN_WAIT_2: _common.CONN_FIN_WAIT2, - cext.TCPS_TIME_WAIT: _common.CONN_TIME_WAIT, - cext.TCPS_CLOSED: _common.CONN_CLOSE, - cext.TCPS_CLOSE_WAIT: _common.CONN_CLOSE_WAIT, - cext.TCPS_LAST_ACK: _common.CONN_LAST_ACK, - cext.TCPS_LISTEN: _common.CONN_LISTEN, - cext.TCPS_CLOSING: _common.CONN_CLOSING, - cext.PSUTIL_CONN_NONE: _common.CONN_NONE, - cext.TCPS_IDLE: CONN_IDLE, # sunos specific - cext.TCPS_BOUND: CONN_BOUND, # sunos specific -} - -proc_info_map = dict( - ppid=0, - rss=1, - vms=2, - create_time=3, - nice=4, - num_threads=5, - status=6, - ttynr=7, - uid=8, - euid=9, - gid=10, - egid=11, -) - - -# ===================================================================== -# --- named tuples -# ===================================================================== - - -# psutil.cpu_times() -scputimes = namedtuple('scputimes', ['user', 'system', 'idle', 'iowait']) -# psutil.cpu_times(percpu=True) -pcputimes = namedtuple( - 'pcputimes', ['user', 'system', 'children_user', 'children_system'] -) -# psutil.virtual_memory() -svmem = namedtuple('svmem', ['total', 'available', 'percent', 'used', 'free']) -# psutil.Process.memory_info() -pmem = namedtuple('pmem', ['rss', 'vms']) -pfullmem = pmem -# psutil.Process.memory_maps(grouped=True) -pmmap_grouped = namedtuple( - 'pmmap_grouped', ['path', 'rss', 'anonymous', 'locked'] -) -# psutil.Process.memory_maps(grouped=False) -pmmap_ext = namedtuple( - 'pmmap_ext', 'addr perms ' + ' '.join(pmmap_grouped._fields) -) - - -# ===================================================================== -# --- memory -# ===================================================================== - - -def virtual_memory(): - """Report virtual memory metrics.""" - # we could have done this with kstat, but IMHO this is good enough - total = os.sysconf('SC_PHYS_PAGES') * PAGE_SIZE - # note: there's no difference on Solaris - free = avail = os.sysconf('SC_AVPHYS_PAGES') * PAGE_SIZE - used = total - free - percent = usage_percent(used, total, round_=1) - return svmem(total, avail, percent, used, free) - - -def swap_memory(): - """Report swap memory metrics.""" - sin, sout = cext.swap_mem() - # XXX - # we are supposed to get total/free by doing so: - # http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/ - # usr/src/cmd/swap/swap.c - # ...nevertheless I can't manage to obtain the same numbers as 'swap' - # cmdline utility, so let's parse its output (sigh!) - p = subprocess.Popen( - [ - '/usr/bin/env', - f"PATH=/usr/sbin:/sbin:{os.environ['PATH']}", - 'swap', - '-l', - ], - stdout=subprocess.PIPE, - ) - stdout, _ = p.communicate() - stdout = stdout.decode(sys.stdout.encoding) - if p.returncode != 0: - msg = f"'swap -l' failed (retcode={p.returncode})" - raise RuntimeError(msg) - - lines = stdout.strip().split('\n')[1:] - if not lines: - msg = 'no swap device(s) configured' - raise RuntimeError(msg) - total = free = 0 - for line in lines: - line = line.split() - t, f = line[3:5] - total += int(int(t) * 512) - free += int(int(f) * 512) - used = total - free - percent = usage_percent(used, total, round_=1) - return _common.sswap( - total, used, free, percent, sin * PAGE_SIZE, sout * PAGE_SIZE - ) - - -# ===================================================================== -# --- CPU -# ===================================================================== - - -def cpu_times(): - """Return system-wide CPU times as a named tuple.""" - ret = cext.per_cpu_times() - return scputimes(*[sum(x) for x in zip(*ret)]) - - -def per_cpu_times(): - """Return system per-CPU times as a list of named tuples.""" - ret = cext.per_cpu_times() - return [scputimes(*x) for x in ret] - - -def cpu_count_logical(): - """Return the number of logical CPUs in the system.""" - try: - return os.sysconf("SC_NPROCESSORS_ONLN") - except ValueError: - # mimic os.cpu_count() behavior - return None - - -def cpu_count_cores(): - """Return the number of CPU cores in the system.""" - return cext.cpu_count_cores() - - -def cpu_stats(): - """Return various CPU stats as a named tuple.""" - ctx_switches, interrupts, syscalls, _traps = cext.cpu_stats() - soft_interrupts = 0 - return _common.scpustats( - ctx_switches, interrupts, soft_interrupts, syscalls - ) - - -# ===================================================================== -# --- disks -# ===================================================================== - - -disk_io_counters = cext.disk_io_counters -disk_usage = _psposix.disk_usage - - -def disk_partitions(all=False): - """Return system disk partitions.""" - # TODO - the filtering logic should be better checked so that - # it tries to reflect 'df' as much as possible - retlist = [] - partitions = cext.disk_partitions() - for partition in partitions: - device, mountpoint, fstype, opts = partition - if device == 'none': - device = '' - if not all: - # Differently from, say, Linux, we don't have a list of - # common fs types so the best we can do, AFAIK, is to - # filter by filesystem having a total size > 0. - try: - if not disk_usage(mountpoint).total: - continue - except OSError as err: - # https://github.com/giampaolo/psutil/issues/1674 - debug(f"skipping {mountpoint!r}: {err}") - continue - ntuple = _common.sdiskpart(device, mountpoint, fstype, opts) - retlist.append(ntuple) - return retlist - - -# ===================================================================== -# --- network -# ===================================================================== - - -net_io_counters = cext.net_io_counters -net_if_addrs = cext_posix.net_if_addrs - - -def net_connections(kind, _pid=-1): - """Return socket connections. If pid == -1 return system-wide - connections (as opposed to connections opened by one process only). - Only INET sockets are returned (UNIX are not). - """ - families, types = _common.conn_tmap[kind] - rawlist = cext.net_connections(_pid) - ret = set() - for item in rawlist: - fd, fam, type_, laddr, raddr, status, pid = item - if fam not in families: - continue - if type_ not in types: - continue - # TODO: refactor and use _common.conn_to_ntuple. - if fam in {AF_INET, AF_INET6}: - if laddr: - laddr = _common.addr(*laddr) - if raddr: - raddr = _common.addr(*raddr) - status = TCP_STATUSES[status] - fam = sockfam_to_enum(fam) - type_ = socktype_to_enum(type_) - if _pid == -1: - nt = _common.sconn(fd, fam, type_, laddr, raddr, status, pid) - else: - nt = _common.pconn(fd, fam, type_, laddr, raddr, status) - ret.add(nt) - return list(ret) - - -def net_if_stats(): - """Get NIC stats (isup, duplex, speed, mtu).""" - ret = cext.net_if_stats() - for name, items in ret.items(): - isup, duplex, speed, mtu = items - if hasattr(_common, 'NicDuplex'): - duplex = _common.NicDuplex(duplex) - ret[name] = _common.snicstats(isup, duplex, speed, mtu, '') - return ret - - -# ===================================================================== -# --- other system functions -# ===================================================================== - - -def boot_time(): - """The system boot time expressed in seconds since the epoch.""" - return cext.boot_time() - - -def users(): - """Return currently connected users as a list of namedtuples.""" - retlist = [] - rawlist = cext.users() - localhost = (':0.0', ':0') - for item in rawlist: - user, tty, hostname, tstamp, user_process, pid = item - # note: the underlying C function includes entries about - # system boot, run level and others. We might want - # to use them in the future. - if not user_process: - continue - if hostname in localhost: - hostname = 'localhost' - nt = _common.suser(user, tty, hostname, tstamp, pid) - retlist.append(nt) - return retlist - - -# ===================================================================== -# --- processes -# ===================================================================== - - -def pids(): - """Returns a list of PIDs currently running on the system.""" - path = get_procfs_path().encode(ENCODING) - return [int(x) for x in os.listdir(path) if x.isdigit()] - - -def pid_exists(pid): - """Check for the existence of a unix pid.""" - return _psposix.pid_exists(pid) - - -def wrap_exceptions(fun): - """Call callable into a try/except clause and translate ENOENT, - EACCES and EPERM in NoSuchProcess or AccessDenied exceptions. - """ - - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - pid, ppid, name = self.pid, self._ppid, self._name - try: - return fun(self, *args, **kwargs) - except (FileNotFoundError, ProcessLookupError) as err: - # ENOENT (no such file or directory) gets raised on open(). - # ESRCH (no such process) can get raised on read() if - # process is gone in meantime. - if not pid_exists(pid): - raise NoSuchProcess(pid, name) from err - raise ZombieProcess(pid, name, ppid) from err - except PermissionError as err: - raise AccessDenied(pid, name) from err - except OSError as err: - if pid == 0: - if 0 in pids(): - raise AccessDenied(pid, name) from err - raise - raise - - return wrapper - - -class Process: - """Wrapper class around underlying C implementation.""" - - __slots__ = ["_cache", "_name", "_ppid", "_procfs_path", "pid"] - - def __init__(self, pid): - self.pid = pid - self._name = None - self._ppid = None - self._procfs_path = get_procfs_path() - - def _assert_alive(self): - """Raise NSP if the process disappeared on us.""" - # For those C function who do not raise NSP, possibly returning - # incorrect or incomplete result. - os.stat(f"{self._procfs_path}/{self.pid}") - - def oneshot_enter(self): - self._proc_name_and_args.cache_activate(self) - self._proc_basic_info.cache_activate(self) - self._proc_cred.cache_activate(self) - - def oneshot_exit(self): - self._proc_name_and_args.cache_deactivate(self) - self._proc_basic_info.cache_deactivate(self) - self._proc_cred.cache_deactivate(self) - - @wrap_exceptions - @memoize_when_activated - def _proc_name_and_args(self): - return cext.proc_name_and_args(self.pid, self._procfs_path) - - @wrap_exceptions - @memoize_when_activated - def _proc_basic_info(self): - if self.pid == 0 and not os.path.exists( - f"{self._procfs_path}/{self.pid}/psinfo" - ): - raise AccessDenied(self.pid) - ret = cext.proc_basic_info(self.pid, self._procfs_path) - assert len(ret) == len(proc_info_map) - return ret - - @wrap_exceptions - @memoize_when_activated - def _proc_cred(self): - return cext.proc_cred(self.pid, self._procfs_path) - - @wrap_exceptions - def name(self): - # note: max len == 15 - return self._proc_name_and_args()[0] - - @wrap_exceptions - def exe(self): - try: - return os.readlink(f"{self._procfs_path}/{self.pid}/path/a.out") - except OSError: - pass # continue and guess the exe name from the cmdline - # Will be guessed later from cmdline but we want to explicitly - # invoke cmdline here in order to get an AccessDenied - # exception if the user has not enough privileges. - self.cmdline() - return "" - - @wrap_exceptions - def cmdline(self): - return self._proc_name_and_args()[1].split(' ') - - @wrap_exceptions - def environ(self): - return cext.proc_environ(self.pid, self._procfs_path) - - @wrap_exceptions - def create_time(self): - return self._proc_basic_info()[proc_info_map['create_time']] - - @wrap_exceptions - def num_threads(self): - return self._proc_basic_info()[proc_info_map['num_threads']] - - @wrap_exceptions - def nice_get(self): - # Note #1: getpriority(3) doesn't work for realtime processes. - # Psinfo is what ps uses, see: - # https://github.com/giampaolo/psutil/issues/1194 - return self._proc_basic_info()[proc_info_map['nice']] - - @wrap_exceptions - def nice_set(self, value): - if self.pid in {2, 3}: - # Special case PIDs: internally setpriority(3) return ESRCH - # (no such process), no matter what. - # The process actually exists though, as it has a name, - # creation time, etc. - raise AccessDenied(self.pid, self._name) - return cext_posix.setpriority(self.pid, value) - - @wrap_exceptions - def ppid(self): - self._ppid = self._proc_basic_info()[proc_info_map['ppid']] - return self._ppid - - @wrap_exceptions - def uids(self): - try: - real, effective, saved, _, _, _ = self._proc_cred() - except AccessDenied: - real = self._proc_basic_info()[proc_info_map['uid']] - effective = self._proc_basic_info()[proc_info_map['euid']] - saved = None - return _common.puids(real, effective, saved) - - @wrap_exceptions - def gids(self): - try: - _, _, _, real, effective, saved = self._proc_cred() - except AccessDenied: - real = self._proc_basic_info()[proc_info_map['gid']] - effective = self._proc_basic_info()[proc_info_map['egid']] - saved = None - return _common.puids(real, effective, saved) - - @wrap_exceptions - def cpu_times(self): - try: - times = cext.proc_cpu_times(self.pid, self._procfs_path) - except OSError as err: - if err.errno == errno.EOVERFLOW and not IS_64_BIT: - # We may get here if we attempt to query a 64bit process - # with a 32bit python. - # Error originates from read() and also tools like "cat" - # fail in the same way (!). - # Since there simply is no way to determine CPU times we - # return 0.0 as a fallback. See: - # https://github.com/giampaolo/psutil/issues/857 - times = (0.0, 0.0, 0.0, 0.0) - else: - raise - return _common.pcputimes(*times) - - @wrap_exceptions - def cpu_num(self): - return cext.proc_cpu_num(self.pid, self._procfs_path) - - @wrap_exceptions - def terminal(self): - procfs_path = self._procfs_path - hit_enoent = False - tty = wrap_exceptions(self._proc_basic_info()[proc_info_map['ttynr']]) - if tty != cext.PRNODEV: - for x in (0, 1, 2, 255): - try: - return os.readlink(f"{procfs_path}/{self.pid}/path/{x}") - except FileNotFoundError: - hit_enoent = True - continue - if hit_enoent: - self._assert_alive() - - @wrap_exceptions - def cwd(self): - # /proc/PID/path/cwd may not be resolved by readlink() even if - # it exists (ls shows it). If that's the case and the process - # is still alive return None (we can return None also on BSD). - # Reference: https://groups.google.com/g/comp.unix.solaris/c/tcqvhTNFCAs - procfs_path = self._procfs_path - try: - return os.readlink(f"{procfs_path}/{self.pid}/path/cwd") - except FileNotFoundError: - os.stat(f"{procfs_path}/{self.pid}") # raise NSP or AD - return "" - - @wrap_exceptions - def memory_info(self): - ret = self._proc_basic_info() - rss = ret[proc_info_map['rss']] * 1024 - vms = ret[proc_info_map['vms']] * 1024 - return pmem(rss, vms) - - memory_full_info = memory_info - - @wrap_exceptions - def status(self): - code = self._proc_basic_info()[proc_info_map['status']] - # XXX is '?' legit? (we're not supposed to return it anyway) - return PROC_STATUSES.get(code, '?') - - @wrap_exceptions - def threads(self): - procfs_path = self._procfs_path - ret = [] - tids = os.listdir(f"{procfs_path}/{self.pid}/lwp") - hit_enoent = False - for tid in tids: - tid = int(tid) - try: - utime, stime = cext.query_process_thread( - self.pid, tid, procfs_path - ) - except OSError as err: - if err.errno == errno.EOVERFLOW and not IS_64_BIT: - # We may get here if we attempt to query a 64bit process - # with a 32bit python. - # Error originates from read() and also tools like "cat" - # fail in the same way (!). - # Since there simply is no way to determine CPU times we - # return 0.0 as a fallback. See: - # https://github.com/giampaolo/psutil/issues/857 - continue - # ENOENT == thread gone in meantime - if err.errno == errno.ENOENT: - hit_enoent = True - continue - raise - else: - nt = _common.pthread(tid, utime, stime) - ret.append(nt) - if hit_enoent: - self._assert_alive() - return ret - - @wrap_exceptions - def open_files(self): - retlist = [] - hit_enoent = False - procfs_path = self._procfs_path - pathdir = f"{procfs_path}/{self.pid}/path" - for fd in os.listdir(f"{procfs_path}/{self.pid}/fd"): - path = os.path.join(pathdir, fd) - if os.path.islink(path): - try: - file = os.readlink(path) - except FileNotFoundError: - hit_enoent = True - continue - else: - if isfile_strict(file): - retlist.append(_common.popenfile(file, int(fd))) - if hit_enoent: - self._assert_alive() - return retlist - - def _get_unix_sockets(self, pid): - """Get UNIX sockets used by process by parsing 'pfiles' output.""" - # TODO: rewrite this in C (...but the damn netstat source code - # does not include this part! Argh!!) - cmd = ["pfiles", str(pid)] - p = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) - stdout, stderr = p.communicate() - stdout, stderr = ( - x.decode(sys.stdout.encoding) for x in (stdout, stderr) - ) - if p.returncode != 0: - if 'permission denied' in stderr.lower(): - raise AccessDenied(self.pid, self._name) - if 'no such process' in stderr.lower(): - raise NoSuchProcess(self.pid, self._name) - msg = f"{cmd!r} command error\n{stderr}" - raise RuntimeError(msg) - - lines = stdout.split('\n')[2:] - for i, line in enumerate(lines): - line = line.lstrip() - if line.startswith('sockname: AF_UNIX'): - path = line.split(' ', 2)[2] - type = lines[i - 2].strip() - if type == 'SOCK_STREAM': - type = socket.SOCK_STREAM - elif type == 'SOCK_DGRAM': - type = socket.SOCK_DGRAM - else: - type = -1 - yield (-1, socket.AF_UNIX, type, path, "", _common.CONN_NONE) - - @wrap_exceptions - def net_connections(self, kind='inet'): - ret = net_connections(kind, _pid=self.pid) - # The underlying C implementation retrieves all OS connections - # and filters them by PID. At this point we can't tell whether - # an empty list means there were no connections for process or - # process is no longer active so we force NSP in case the PID - # is no longer there. - if not ret: - # will raise NSP if process is gone - os.stat(f"{self._procfs_path}/{self.pid}") - - # UNIX sockets - if kind in {'all', 'unix'}: - ret.extend([ - _common.pconn(*conn) - for conn in self._get_unix_sockets(self.pid) - ]) - return ret - - nt_mmap_grouped = namedtuple('mmap', 'path rss anon locked') - nt_mmap_ext = namedtuple('mmap', 'addr perms path rss anon locked') - - @wrap_exceptions - def memory_maps(self): - def toaddr(start, end): - return "{}-{}".format( - hex(start)[2:].strip('L'), hex(end)[2:].strip('L') - ) - - procfs_path = self._procfs_path - retlist = [] - try: - rawlist = cext.proc_memory_maps(self.pid, procfs_path) - except OSError as err: - if err.errno == errno.EOVERFLOW and not IS_64_BIT: - # We may get here if we attempt to query a 64bit process - # with a 32bit python. - # Error originates from read() and also tools like "cat" - # fail in the same way (!). - # Since there simply is no way to determine CPU times we - # return 0.0 as a fallback. See: - # https://github.com/giampaolo/psutil/issues/857 - return [] - else: - raise - hit_enoent = False - for item in rawlist: - addr, addrsize, perm, name, rss, anon, locked = item - addr = toaddr(addr, addrsize) - if not name.startswith('['): - try: - name = os.readlink(f"{procfs_path}/{self.pid}/path/{name}") - except OSError as err: - if err.errno == errno.ENOENT: - # sometimes the link may not be resolved by - # readlink() even if it exists (ls shows it). - # If that's the case we just return the - # unresolved link path. - # This seems an inconsistency with /proc similar - # to: http://goo.gl/55XgO - name = f"{procfs_path}/{self.pid}/path/{name}" - hit_enoent = True - else: - raise - retlist.append((addr, perm, name, rss, anon, locked)) - if hit_enoent: - self._assert_alive() - return retlist - - @wrap_exceptions - def num_fds(self): - return len(os.listdir(f"{self._procfs_path}/{self.pid}/fd")) - - @wrap_exceptions - def num_ctx_switches(self): - return _common.pctxsw( - *cext.proc_num_ctx_switches(self.pid, self._procfs_path) - ) - - @wrap_exceptions - def wait(self, timeout=None): - return _psposix.wait_pid(self.pid, timeout, self._name) diff --git a/PortablePython/Lib/site-packages/psutil/_psutil_windows.pyd b/PortablePython/Lib/site-packages/psutil/_psutil_windows.pyd deleted file mode 100644 index 1e7f44e61bf4a6a040ae6a7228951100a7141ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67072 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
LDhWMrjjy@#~H?+A2{y5T3_~* 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 KR+WF9&;J6gnG;n2 diff --git a/PortablePython/Lib/site-packages/psutil/_pswindows.py b/PortablePython/Lib/site-packages/psutil/_pswindows.py deleted file mode 100644 index e5af3c9..0000000 --- a/PortablePython/Lib/site-packages/psutil/_pswindows.py +++ /dev/null @@ -1,1103 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Windows platform implementation.""" - -import contextlib -import enum -import functools -import os -import signal -import sys -import time -from collections import namedtuple - -from . import _common -from ._common import ENCODING -from ._common import AccessDenied -from ._common import NoSuchProcess -from ._common import TimeoutExpired -from ._common import conn_tmap -from ._common import conn_to_ntuple -from ._common import debug -from ._common import isfile_strict -from ._common import memoize -from ._common import memoize_when_activated -from ._common import parse_environ_block -from ._common import usage_percent -from ._psutil_windows import ABOVE_NORMAL_PRIORITY_CLASS -from ._psutil_windows import BELOW_NORMAL_PRIORITY_CLASS -from ._psutil_windows import HIGH_PRIORITY_CLASS -from ._psutil_windows import IDLE_PRIORITY_CLASS -from ._psutil_windows import NORMAL_PRIORITY_CLASS -from ._psutil_windows import REALTIME_PRIORITY_CLASS - - -try: - from . import _psutil_windows as cext -except ImportError as err: - if ( - str(err).lower().startswith("dll load failed") - and sys.getwindowsversion()[0] < 6 - ): - # We may get here if: - # 1) we are on an old Windows version - # 2) psutil was installed via pip + wheel - # See: https://github.com/giampaolo/psutil/issues/811 - msg = "this Windows version is too old (< Windows Vista); " - msg += "psutil 3.4.2 is the latest version which supports Windows " - msg += "2000, XP and 2003 server" - raise RuntimeError(msg) from err - else: - raise - - -# process priority constants, import from __init__.py: -# http://msdn.microsoft.com/en-us/library/ms686219(v=vs.85).aspx -# fmt: off -__extra__all__ = [ - "win_service_iter", "win_service_get", - # Process priority - "ABOVE_NORMAL_PRIORITY_CLASS", "BELOW_NORMAL_PRIORITY_CLASS", - "HIGH_PRIORITY_CLASS", "IDLE_PRIORITY_CLASS", "NORMAL_PRIORITY_CLASS", - "REALTIME_PRIORITY_CLASS", - # IO priority - "IOPRIO_VERYLOW", "IOPRIO_LOW", "IOPRIO_NORMAL", "IOPRIO_HIGH", - # others - "CONN_DELETE_TCB", "AF_LINK", -] -# fmt: on - - -# ===================================================================== -# --- globals -# ===================================================================== - -CONN_DELETE_TCB = "DELETE_TCB" -ERROR_PARTIAL_COPY = 299 -PYPY = '__pypy__' in sys.builtin_module_names - -AddressFamily = enum.IntEnum('AddressFamily', {'AF_LINK': -1}) -AF_LINK = AddressFamily.AF_LINK - -TCP_STATUSES = { - cext.MIB_TCP_STATE_ESTAB: _common.CONN_ESTABLISHED, - cext.MIB_TCP_STATE_SYN_SENT: _common.CONN_SYN_SENT, - cext.MIB_TCP_STATE_SYN_RCVD: _common.CONN_SYN_RECV, - cext.MIB_TCP_STATE_FIN_WAIT1: _common.CONN_FIN_WAIT1, - cext.MIB_TCP_STATE_FIN_WAIT2: _common.CONN_FIN_WAIT2, - cext.MIB_TCP_STATE_TIME_WAIT: _common.CONN_TIME_WAIT, - cext.MIB_TCP_STATE_CLOSED: _common.CONN_CLOSE, - cext.MIB_TCP_STATE_CLOSE_WAIT: _common.CONN_CLOSE_WAIT, - cext.MIB_TCP_STATE_LAST_ACK: _common.CONN_LAST_ACK, - cext.MIB_TCP_STATE_LISTEN: _common.CONN_LISTEN, - cext.MIB_TCP_STATE_CLOSING: _common.CONN_CLOSING, - cext.MIB_TCP_STATE_DELETE_TCB: CONN_DELETE_TCB, - cext.PSUTIL_CONN_NONE: _common.CONN_NONE, -} - - -class Priority(enum.IntEnum): - ABOVE_NORMAL_PRIORITY_CLASS = ABOVE_NORMAL_PRIORITY_CLASS - BELOW_NORMAL_PRIORITY_CLASS = BELOW_NORMAL_PRIORITY_CLASS - HIGH_PRIORITY_CLASS = HIGH_PRIORITY_CLASS - IDLE_PRIORITY_CLASS = IDLE_PRIORITY_CLASS - NORMAL_PRIORITY_CLASS = NORMAL_PRIORITY_CLASS - REALTIME_PRIORITY_CLASS = REALTIME_PRIORITY_CLASS - - -globals().update(Priority.__members__) - - -class IOPriority(enum.IntEnum): - IOPRIO_VERYLOW = 0 - IOPRIO_LOW = 1 - IOPRIO_NORMAL = 2 - IOPRIO_HIGH = 3 - - -globals().update(IOPriority.__members__) - -pinfo_map = dict( - num_handles=0, - ctx_switches=1, - user_time=2, - kernel_time=3, - create_time=4, - num_threads=5, - io_rcount=6, - io_wcount=7, - io_rbytes=8, - io_wbytes=9, - io_count_others=10, - io_bytes_others=11, - num_page_faults=12, - peak_wset=13, - wset=14, - peak_paged_pool=15, - paged_pool=16, - peak_non_paged_pool=17, - non_paged_pool=18, - pagefile=19, - peak_pagefile=20, - mem_private=21, -) - - -# ===================================================================== -# --- named tuples -# ===================================================================== - - -# fmt: off -# psutil.cpu_times() -scputimes = namedtuple('scputimes', - ['user', 'system', 'idle', 'interrupt', 'dpc']) -# psutil.virtual_memory() -svmem = namedtuple('svmem', ['total', 'available', 'percent', 'used', 'free']) -# psutil.Process.memory_info() -pmem = namedtuple( - 'pmem', ['rss', 'vms', - 'num_page_faults', 'peak_wset', 'wset', 'peak_paged_pool', - 'paged_pool', 'peak_nonpaged_pool', 'nonpaged_pool', - 'pagefile', 'peak_pagefile', 'private']) -# psutil.Process.memory_full_info() -pfullmem = namedtuple('pfullmem', pmem._fields + ('uss', )) -# psutil.Process.memory_maps(grouped=True) -pmmap_grouped = namedtuple('pmmap_grouped', ['path', 'rss']) -# psutil.Process.memory_maps(grouped=False) -pmmap_ext = namedtuple( - 'pmmap_ext', 'addr perms ' + ' '.join(pmmap_grouped._fields)) -# psutil.Process.io_counters() -pio = namedtuple('pio', ['read_count', 'write_count', - 'read_bytes', 'write_bytes', - 'other_count', 'other_bytes']) -# fmt: on - - -# ===================================================================== -# --- utils -# ===================================================================== - - -@functools.lru_cache(maxsize=512) -def convert_dos_path(s): - r"""Convert paths using native DOS format like: - "\Device\HarddiskVolume1\Windows\systemew\file.txt" - into: - "C:\Windows\systemew\file.txt". - """ - rawdrive = '\\'.join(s.split('\\')[:3]) - driveletter = cext.QueryDosDevice(rawdrive) - remainder = s[len(rawdrive) :] - return os.path.join(driveletter, remainder) - - -@memoize -def getpagesize(): - return cext.getpagesize() - - -# ===================================================================== -# --- memory -# ===================================================================== - - -def virtual_memory(): - """System virtual memory as a namedtuple.""" - mem = cext.virtual_mem() - totphys, availphys, _totsys, _availsys = mem - total = totphys - avail = availphys - free = availphys - used = total - avail - percent = usage_percent((total - avail), total, round_=1) - return svmem(total, avail, percent, used, free) - - -def swap_memory(): - """Swap system memory as a (total, used, free, sin, sout) tuple.""" - mem = cext.virtual_mem() - - total_phys = mem[0] - total_system = mem[2] - - # system memory (commit total/limit) is the sum of physical and swap - # thus physical memory values need to be subtracted to get swap values - total = total_system - total_phys - # commit total is incremented immediately (decrementing free_system) - # while the corresponding free physical value is not decremented until - # pages are accessed, so we can't use free system memory for swap. - # instead, we calculate page file usage based on performance counter - if total > 0: - percentswap = cext.swap_percent() - used = int(0.01 * percentswap * total) - else: - percentswap = 0.0 - used = 0 - - free = total - used - percent = round(percentswap, 1) - return _common.sswap(total, used, free, percent, 0, 0) - - -# ===================================================================== -# --- disk -# ===================================================================== - - -disk_io_counters = cext.disk_io_counters - - -def disk_usage(path): - """Return disk usage associated with path.""" - if isinstance(path, bytes): - # XXX: do we want to use "strict"? Probably yes, in order - # to fail immediately. After all we are accepting input here... - path = path.decode(ENCODING, errors="strict") - total, free = cext.disk_usage(path) - used = total - free - percent = usage_percent(used, total, round_=1) - return _common.sdiskusage(total, used, free, percent) - - -def disk_partitions(all): - """Return disk partitions.""" - rawlist = cext.disk_partitions(all) - return [_common.sdiskpart(*x) for x in rawlist] - - -# ===================================================================== -# --- CPU -# ===================================================================== - - -def cpu_times(): - """Return system CPU times as a named tuple.""" - user, system, idle = cext.cpu_times() - # Internally, GetSystemTimes() is used, and it doesn't return - # interrupt and dpc times. cext.per_cpu_times() does, so we - # rely on it to get those only. - percpu_summed = scputimes(*[sum(n) for n in zip(*cext.per_cpu_times())]) - return scputimes( - user, system, idle, percpu_summed.interrupt, percpu_summed.dpc - ) - - -def per_cpu_times(): - """Return system per-CPU times as a list of named tuples.""" - ret = [] - for user, system, idle, interrupt, dpc in cext.per_cpu_times(): - item = scputimes(user, system, idle, interrupt, dpc) - ret.append(item) - return ret - - -def cpu_count_logical(): - """Return the number of logical CPUs in the system.""" - return cext.cpu_count_logical() - - -def cpu_count_cores(): - """Return the number of CPU cores in the system.""" - return cext.cpu_count_cores() - - -def cpu_stats(): - """Return CPU statistics.""" - ctx_switches, interrupts, _dpcs, syscalls = cext.cpu_stats() - soft_interrupts = 0 - return _common.scpustats( - ctx_switches, interrupts, soft_interrupts, syscalls - ) - - -def cpu_freq(): - """Return CPU frequency. - On Windows per-cpu frequency is not supported. - """ - curr, max_ = cext.cpu_freq() - min_ = 0.0 - return [_common.scpufreq(float(curr), min_, float(max_))] - - -_loadavg_inititialized = False - - -def getloadavg(): - """Return the number of processes in the system run queue averaged - over the last 1, 5, and 15 minutes respectively as a tuple. - """ - global _loadavg_inititialized - - if not _loadavg_inititialized: - cext.init_loadavg_counter() - _loadavg_inititialized = True - - # Drop to 2 decimal points which is what Linux does - raw_loads = cext.getloadavg() - return tuple(round(load, 2) for load in raw_loads) - - -# ===================================================================== -# --- network -# ===================================================================== - - -def net_connections(kind, _pid=-1): - """Return socket connections. If pid == -1 return system-wide - connections (as opposed to connections opened by one process only). - """ - families, types = conn_tmap[kind] - rawlist = cext.net_connections(_pid, families, types) - ret = set() - for item in rawlist: - fd, fam, type, laddr, raddr, status, pid = item - nt = conn_to_ntuple( - fd, - fam, - type, - laddr, - raddr, - status, - TCP_STATUSES, - pid=pid if _pid == -1 else None, - ) - ret.add(nt) - return list(ret) - - -def net_if_stats(): - """Get NIC stats (isup, duplex, speed, mtu).""" - ret = {} - rawdict = cext.net_if_stats() - for name, items in rawdict.items(): - isup, duplex, speed, mtu = items - if hasattr(_common, 'NicDuplex'): - duplex = _common.NicDuplex(duplex) - ret[name] = _common.snicstats(isup, duplex, speed, mtu, '') - return ret - - -def net_io_counters(): - """Return network I/O statistics for every network interface - installed on the system as a dict of raw tuples. - """ - return cext.net_io_counters() - - -def net_if_addrs(): - """Return the addresses associated to each NIC.""" - return cext.net_if_addrs() - - -# ===================================================================== -# --- sensors -# ===================================================================== - - -def sensors_battery(): - """Return battery information.""" - # For constants meaning see: - # https://msdn.microsoft.com/en-us/library/windows/desktop/ - # aa373232(v=vs.85).aspx - acline_status, flags, percent, secsleft = cext.sensors_battery() - power_plugged = acline_status == 1 - no_battery = bool(flags & 128) - charging = bool(flags & 8) - - if no_battery: - return None - if power_plugged or charging: - secsleft = _common.POWER_TIME_UNLIMITED - elif secsleft == -1: - secsleft = _common.POWER_TIME_UNKNOWN - - return _common.sbattery(percent, secsleft, power_plugged) - - -# ===================================================================== -# --- other system functions -# ===================================================================== - - -_last_btime = 0 - - -def boot_time(): - """The system boot time expressed in seconds since the epoch.""" - # This dirty hack is to adjust the precision of the returned - # value which may have a 1 second fluctuation, see: - # https://github.com/giampaolo/psutil/issues/1007 - global _last_btime - ret = float(cext.boot_time()) - if abs(ret - _last_btime) <= 1: - return _last_btime - else: - _last_btime = ret - return ret - - -def users(): - """Return currently connected users as a list of namedtuples.""" - retlist = [] - rawlist = cext.users() - for item in rawlist: - user, hostname, tstamp = item - nt = _common.suser(user, None, hostname, tstamp, None) - retlist.append(nt) - return retlist - - -# ===================================================================== -# --- Windows services -# ===================================================================== - - -def win_service_iter(): - """Yields a list of WindowsService instances.""" - for name, display_name in cext.winservice_enumerate(): - yield WindowsService(name, display_name) - - -def win_service_get(name): - """Open a Windows service and return it as a WindowsService instance.""" - service = WindowsService(name, None) - service._display_name = service._query_config()['display_name'] - return service - - -class WindowsService: # noqa: PLW1641 - """Represents an installed Windows service.""" - - def __init__(self, name, display_name): - self._name = name - self._display_name = display_name - - def __str__(self): - details = f"(name={self._name!r}, display_name={self._display_name!r})" - return f"{self.__class__.__name__}{details}" - - def __repr__(self): - return f"<{self.__str__()} at {id(self)}>" - - def __eq__(self, other): - # Test for equality with another WindosService object based - # on name. - if not isinstance(other, WindowsService): - return NotImplemented - return self._name == other._name - - def __ne__(self, other): - return not self == other - - def _query_config(self): - with self._wrap_exceptions(): - display_name, binpath, username, start_type = ( - cext.winservice_query_config(self._name) - ) - # XXX - update _self.display_name? - return dict( - display_name=display_name, - binpath=binpath, - username=username, - start_type=start_type, - ) - - def _query_status(self): - with self._wrap_exceptions(): - status, pid = cext.winservice_query_status(self._name) - if pid == 0: - pid = None - return dict(status=status, pid=pid) - - @contextlib.contextmanager - def _wrap_exceptions(self): - """Ctx manager which translates bare OSError and WindowsError - exceptions into NoSuchProcess and AccessDenied. - """ - try: - yield - except OSError as err: - name = self._name - if is_permission_err(err): - msg = ( - f"service {name!r} is not querable (not enough privileges)" - ) - raise AccessDenied(pid=None, name=name, msg=msg) from err - elif err.winerror in { - cext.ERROR_INVALID_NAME, - cext.ERROR_SERVICE_DOES_NOT_EXIST, - }: - msg = f"service {name!r} does not exist" - raise NoSuchProcess(pid=None, name=name, msg=msg) from err - else: - raise - - # config query - - def name(self): - """The service name. This string is how a service is referenced - and can be passed to win_service_get() to get a new - WindowsService instance. - """ - return self._name - - def display_name(self): - """The service display name. The value is cached when this class - is instantiated. - """ - return self._display_name - - def binpath(self): - """The fully qualified path to the service binary/exe file as - a string, including command line arguments. - """ - return self._query_config()['binpath'] - - def username(self): - """The name of the user that owns this service.""" - return self._query_config()['username'] - - def start_type(self): - """A string which can either be "automatic", "manual" or - "disabled". - """ - return self._query_config()['start_type'] - - # status query - - def pid(self): - """The process PID, if any, else None. This can be passed - to Process class to control the service's process. - """ - return self._query_status()['pid'] - - def status(self): - """Service status as a string.""" - return self._query_status()['status'] - - def description(self): - """Service long description.""" - return cext.winservice_query_descr(self.name()) - - # utils - - def as_dict(self): - """Utility method retrieving all the information above as a - dictionary. - """ - d = self._query_config() - d.update(self._query_status()) - d['name'] = self.name() - d['display_name'] = self.display_name() - d['description'] = self.description() - return d - - # actions - # XXX: the necessary C bindings for start() and stop() are - # implemented but for now I prefer not to expose them. - # I may change my mind in the future. Reasons: - # - they require Administrator privileges - # - can't implement a timeout for stop() (unless by using a thread, - # which sucks) - # - would require adding ServiceAlreadyStarted and - # ServiceAlreadyStopped exceptions, adding two new APIs. - # - we might also want to have modify(), which would basically mean - # rewriting win32serviceutil.ChangeServiceConfig, which involves a - # lot of stuff (and API constants which would pollute the API), see: - # http://pyxr.sourceforge.net/PyXR/c/python24/lib/site-packages/ - # win32/lib/win32serviceutil.py.html#0175 - # - psutil is typically about "read only" monitoring stuff; - # win_service_* APIs should only be used to retrieve a service and - # check whether it's running - - # def start(self, timeout=None): - # with self._wrap_exceptions(): - # cext.winservice_start(self.name()) - # if timeout: - # giveup_at = time.time() + timeout - # while True: - # if self.status() == "running": - # return - # else: - # if time.time() > giveup_at: - # raise TimeoutExpired(timeout) - # else: - # time.sleep(.1) - - # def stop(self): - # # Note: timeout is not implemented because it's just not - # # possible, see: - # # http://stackoverflow.com/questions/11973228/ - # with self._wrap_exceptions(): - # return cext.winservice_stop(self.name()) - - -# ===================================================================== -# --- processes -# ===================================================================== - - -pids = cext.pids -pid_exists = cext.pid_exists -ppid_map = cext.ppid_map # used internally by Process.children() - - -def is_permission_err(exc): - """Return True if this is a permission error.""" - assert isinstance(exc, OSError), exc - return isinstance(exc, PermissionError) or exc.winerror in { - cext.ERROR_ACCESS_DENIED, - cext.ERROR_PRIVILEGE_NOT_HELD, - } - - -def convert_oserror(exc, pid=None, name=None): - """Convert OSError into NoSuchProcess or AccessDenied.""" - assert isinstance(exc, OSError), exc - if is_permission_err(exc): - return AccessDenied(pid=pid, name=name) - if isinstance(exc, ProcessLookupError): - return NoSuchProcess(pid=pid, name=name) - raise exc - - -def wrap_exceptions(fun): - """Decorator which converts OSError into NoSuchProcess or AccessDenied.""" - - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - try: - return fun(self, *args, **kwargs) - except OSError as err: - raise convert_oserror(err, pid=self.pid, name=self._name) from err - - return wrapper - - -def retry_error_partial_copy(fun): - """Workaround for https://github.com/giampaolo/psutil/issues/875. - See: https://stackoverflow.com/questions/4457745#4457745. - """ - - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - delay = 0.0001 - times = 33 - for _ in range(times): # retries for roughly 1 second - try: - return fun(self, *args, **kwargs) - except OSError as _: - err = _ - if err.winerror == ERROR_PARTIAL_COPY: - time.sleep(delay) - delay = min(delay * 2, 0.04) - continue - raise - msg = ( - f"{fun} retried {times} times, converted to AccessDenied as it's " - f"still returning {err}" - ) - raise AccessDenied(pid=self.pid, name=self._name, msg=msg) - - return wrapper - - -class Process: - """Wrapper class around underlying C implementation.""" - - __slots__ = ["_cache", "_name", "_ppid", "pid"] - - def __init__(self, pid): - self.pid = pid - self._name = None - self._ppid = None - - # --- oneshot() stuff - - def oneshot_enter(self): - self._proc_info.cache_activate(self) - self.exe.cache_activate(self) - - def oneshot_exit(self): - self._proc_info.cache_deactivate(self) - self.exe.cache_deactivate(self) - - @memoize_when_activated - def _proc_info(self): - """Return multiple information about this process as a - raw tuple. - """ - ret = cext.proc_info(self.pid) - assert len(ret) == len(pinfo_map) - return ret - - def name(self): - """Return process name, which on Windows is always the final - part of the executable. - """ - # This is how PIDs 0 and 4 are always represented in taskmgr - # and process-hacker. - if self.pid == 0: - return "System Idle Process" - if self.pid == 4: - return "System" - return os.path.basename(self.exe()) - - @wrap_exceptions - @memoize_when_activated - def exe(self): - if PYPY: - try: - exe = cext.proc_exe(self.pid) - except OSError as err: - # 24 = ERROR_TOO_MANY_OPEN_FILES. Not sure why this happens - # (perhaps PyPy's JIT delaying garbage collection of files?). - if err.errno == 24: - debug(f"{err!r} translated into AccessDenied") - raise AccessDenied(self.pid, self._name) from err - raise - else: - exe = cext.proc_exe(self.pid) - if exe.startswith('\\'): - return convert_dos_path(exe) - return exe # May be "Registry", "MemCompression", ... - - @wrap_exceptions - @retry_error_partial_copy - def cmdline(self): - if cext.WINVER >= cext.WINDOWS_8_1: - # PEB method detects cmdline changes but requires more - # privileges: https://github.com/giampaolo/psutil/pull/1398 - try: - return cext.proc_cmdline(self.pid, use_peb=True) - except OSError as err: - if is_permission_err(err): - return cext.proc_cmdline(self.pid, use_peb=False) - else: - raise - else: - return cext.proc_cmdline(self.pid, use_peb=True) - - @wrap_exceptions - @retry_error_partial_copy - def environ(self): - s = cext.proc_environ(self.pid) - return parse_environ_block(s) - - def ppid(self): - try: - return ppid_map()[self.pid] - except KeyError: - raise NoSuchProcess(self.pid, self._name) from None - - def _get_raw_meminfo(self): - try: - return cext.proc_memory_info(self.pid) - except OSError as err: - if is_permission_err(err): - # TODO: the C ext can probably be refactored in order - # to get this from cext.proc_info() - debug("attempting memory_info() fallback (slower)") - info = self._proc_info() - return ( - info[pinfo_map['num_page_faults']], - info[pinfo_map['peak_wset']], - info[pinfo_map['wset']], - info[pinfo_map['peak_paged_pool']], - info[pinfo_map['paged_pool']], - info[pinfo_map['peak_non_paged_pool']], - info[pinfo_map['non_paged_pool']], - info[pinfo_map['pagefile']], - info[pinfo_map['peak_pagefile']], - info[pinfo_map['mem_private']], - ) - raise - - @wrap_exceptions - def memory_info(self): - # on Windows RSS == WorkingSetSize and VSM == PagefileUsage. - # Underlying C function returns fields of PROCESS_MEMORY_COUNTERS - # struct. - t = self._get_raw_meminfo() - rss = t[2] # wset - vms = t[7] # pagefile - return pmem(*(rss, vms) + t) - - @wrap_exceptions - def memory_full_info(self): - basic_mem = self.memory_info() - uss = cext.proc_memory_uss(self.pid) - uss *= getpagesize() - return pfullmem(*basic_mem + (uss,)) - - def memory_maps(self): - try: - raw = cext.proc_memory_maps(self.pid) - except OSError as err: - # XXX - can't use wrap_exceptions decorator as we're - # returning a generator; probably needs refactoring. - raise convert_oserror(err, self.pid, self._name) from err - else: - for addr, perm, path, rss in raw: - path = convert_dos_path(path) - addr = hex(addr) - yield (addr, perm, path, rss) - - @wrap_exceptions - def kill(self): - return cext.proc_kill(self.pid) - - @wrap_exceptions - def send_signal(self, sig): - if sig == signal.SIGTERM: - cext.proc_kill(self.pid) - elif sig in {signal.CTRL_C_EVENT, signal.CTRL_BREAK_EVENT}: - os.kill(self.pid, sig) - else: - msg = ( - "only SIGTERM, CTRL_C_EVENT and CTRL_BREAK_EVENT signals " - "are supported on Windows" - ) - raise ValueError(msg) - - @wrap_exceptions - def wait(self, timeout=None): - if timeout is None: - cext_timeout = cext.INFINITE - else: - # WaitForSingleObject() expects time in milliseconds. - cext_timeout = int(timeout * 1000) - - timer = getattr(time, 'monotonic', time.time) - stop_at = timer() + timeout if timeout is not None else None - - try: - # Exit code is supposed to come from GetExitCodeProcess(). - # May also be None if OpenProcess() failed with - # ERROR_INVALID_PARAMETER, meaning PID is already gone. - exit_code = cext.proc_wait(self.pid, cext_timeout) - except cext.TimeoutExpired as err: - # WaitForSingleObject() returned WAIT_TIMEOUT. Just raise. - raise TimeoutExpired(timeout, self.pid, self._name) from err - except cext.TimeoutAbandoned: - # WaitForSingleObject() returned WAIT_ABANDONED, see: - # https://github.com/giampaolo/psutil/issues/1224 - # We'll just rely on the internal polling and return None - # when the PID disappears. Subprocess module does the same - # (return None): - # https://github.com/python/cpython/blob/ - # be50a7b627d0aa37e08fa8e2d5568891f19903ce/ - # Lib/subprocess.py#L1193-L1194 - exit_code = None - - # At this point WaitForSingleObject() returned WAIT_OBJECT_0, - # meaning the process is gone. Stupidly there are cases where - # its PID may still stick around so we do a further internal - # polling. - delay = 0.0001 - while True: - if not pid_exists(self.pid): - return exit_code - if stop_at and timer() >= stop_at: - raise TimeoutExpired(timeout, pid=self.pid, name=self._name) - time.sleep(delay) - delay = min(delay * 2, 0.04) # incremental delay - - @wrap_exceptions - def username(self): - if self.pid in {0, 4}: - return 'NT AUTHORITY\\SYSTEM' - domain, user = cext.proc_username(self.pid) - return f"{domain}\\{user}" - - @wrap_exceptions - def create_time(self, fast_only=False): - # Note: proc_times() not put under oneshot() 'cause create_time() - # is already cached by the main Process class. - try: - _user, _system, created = cext.proc_times(self.pid) - return created - except OSError as err: - if is_permission_err(err): - if fast_only: - raise - debug("attempting create_time() fallback (slower)") - return self._proc_info()[pinfo_map['create_time']] - raise - - @wrap_exceptions - def num_threads(self): - return self._proc_info()[pinfo_map['num_threads']] - - @wrap_exceptions - def threads(self): - rawlist = cext.proc_threads(self.pid) - retlist = [] - for thread_id, utime, stime in rawlist: - ntuple = _common.pthread(thread_id, utime, stime) - retlist.append(ntuple) - return retlist - - @wrap_exceptions - def cpu_times(self): - try: - user, system, _created = cext.proc_times(self.pid) - except OSError as err: - if not is_permission_err(err): - raise - debug("attempting cpu_times() fallback (slower)") - info = self._proc_info() - user = info[pinfo_map['user_time']] - system = info[pinfo_map['kernel_time']] - # Children user/system times are not retrievable (set to 0). - return _common.pcputimes(user, system, 0.0, 0.0) - - @wrap_exceptions - def suspend(self): - cext.proc_suspend_or_resume(self.pid, True) - - @wrap_exceptions - def resume(self): - cext.proc_suspend_or_resume(self.pid, False) - - @wrap_exceptions - @retry_error_partial_copy - def cwd(self): - if self.pid in {0, 4}: - raise AccessDenied(self.pid, self._name) - # return a normalized pathname since the native C function appends - # "\\" at the and of the path - path = cext.proc_cwd(self.pid) - return os.path.normpath(path) - - @wrap_exceptions - def open_files(self): - if self.pid in {0, 4}: - return [] - ret = set() - # Filenames come in in native format like: - # "\Device\HarddiskVolume1\Windows\systemew\file.txt" - # Convert the first part in the corresponding drive letter - # (e.g. "C:\") by using Windows's QueryDosDevice() - raw_file_names = cext.proc_open_files(self.pid) - for file in raw_file_names: - file = convert_dos_path(file) - if isfile_strict(file): - ntuple = _common.popenfile(file, -1) - ret.add(ntuple) - return list(ret) - - @wrap_exceptions - def net_connections(self, kind='inet'): - return net_connections(kind, _pid=self.pid) - - @wrap_exceptions - def nice_get(self): - value = cext.proc_priority_get(self.pid) - value = Priority(value) - return value - - @wrap_exceptions - def nice_set(self, value): - return cext.proc_priority_set(self.pid, value) - - @wrap_exceptions - def ionice_get(self): - ret = cext.proc_io_priority_get(self.pid) - ret = IOPriority(ret) - return ret - - @wrap_exceptions - def ionice_set(self, ioclass, value): - if value: - msg = "value argument not accepted on Windows" - raise TypeError(msg) - if ioclass not in { - IOPriority.IOPRIO_VERYLOW, - IOPriority.IOPRIO_LOW, - IOPriority.IOPRIO_NORMAL, - IOPriority.IOPRIO_HIGH, - }: - msg = f"{ioclass} is not a valid priority" - raise ValueError(msg) - cext.proc_io_priority_set(self.pid, ioclass) - - @wrap_exceptions - def io_counters(self): - try: - ret = cext.proc_io_counters(self.pid) - except OSError as err: - if not is_permission_err(err): - raise - debug("attempting io_counters() fallback (slower)") - info = self._proc_info() - ret = ( - info[pinfo_map['io_rcount']], - info[pinfo_map['io_wcount']], - info[pinfo_map['io_rbytes']], - info[pinfo_map['io_wbytes']], - info[pinfo_map['io_count_others']], - info[pinfo_map['io_bytes_others']], - ) - return pio(*ret) - - @wrap_exceptions - def status(self): - suspended = cext.proc_is_suspended(self.pid) - if suspended: - return _common.STATUS_STOPPED - else: - return _common.STATUS_RUNNING - - @wrap_exceptions - def cpu_affinity_get(self): - def from_bitmask(x): - return [i for i in range(64) if (1 << i) & x] - - bitmask = cext.proc_cpu_affinity_get(self.pid) - return from_bitmask(bitmask) - - @wrap_exceptions - def cpu_affinity_set(self, value): - def to_bitmask(ls): - if not ls: - msg = f"invalid argument {ls!r}" - raise ValueError(msg) - out = 0 - for b in ls: - out |= 2**b - return out - - # SetProcessAffinityMask() states that ERROR_INVALID_PARAMETER - # is returned for an invalid CPU but this seems not to be true, - # therefore we check CPUs validy beforehand. - allcpus = list(range(len(per_cpu_times()))) - for cpu in value: - if cpu not in allcpus: - if not isinstance(cpu, int): - msg = f"invalid CPU {cpu!r}; an integer is required" - raise TypeError(msg) - msg = f"invalid CPU {cpu!r}" - raise ValueError(msg) - - bitmask = to_bitmask(value) - cext.proc_cpu_affinity_set(self.pid, bitmask) - - @wrap_exceptions - def num_handles(self): - try: - return cext.proc_num_handles(self.pid) - except OSError as err: - if is_permission_err(err): - debug("attempting num_handles() fallback (slower)") - return self._proc_info()[pinfo_map['num_handles']] - raise - - @wrap_exceptions - def num_ctx_switches(self): - ctx_switches = self._proc_info()[pinfo_map['ctx_switches']] - # only voluntary ctx switches are supported - return _common.pctxsw(ctx_switches, 0) diff --git a/PortablePython/Lib/site-packages/psutil/tests/__init__.py b/PortablePython/Lib/site-packages/psutil/tests/__init__.py deleted file mode 100644 index 5d4b3ab..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/__init__.py +++ /dev/null @@ -1,2025 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Test utilities.""" - - -import atexit -import contextlib -import ctypes -import enum -import errno -import functools -import gc -import importlib -import ipaddress -import os -import platform -import random -import re -import select -import shlex -import shutil -import signal -import socket -import stat -import subprocess -import sys -import tempfile -import textwrap -import threading -import time -import unittest -import warnings -from socket import AF_INET -from socket import AF_INET6 -from socket import SOCK_STREAM - - -try: - import pytest -except ImportError: - pytest = None - -import psutil -from psutil import AIX -from psutil import LINUX -from psutil import MACOS -from psutil import NETBSD -from psutil import OPENBSD -from psutil import POSIX -from psutil import SUNOS -from psutil import WINDOWS -from psutil._common import bytes2human -from psutil._common import debug -from psutil._common import memoize -from psutil._common import print_color -from psutil._common import supports_ipv6 - - -if POSIX: - from psutil._psposix import wait_pid - - -# fmt: off -__all__ = [ - # constants - 'DEVNULL', 'GLOBAL_TIMEOUT', 'TOLERANCE_SYS_MEM', 'NO_RETRIES', - 'PYPY', 'PYTHON_EXE', 'PYTHON_EXE_ENV', 'ROOT_DIR', 'SCRIPTS_DIR', - 'TESTFN_PREFIX', 'UNICODE_SUFFIX', 'INVALID_UNICODE_SUFFIX', - 'CI_TESTING', 'VALID_PROC_STATUSES', 'TOLERANCE_DISK_USAGE', 'IS_64BIT', - "HAS_CPU_AFFINITY", "HAS_CPU_FREQ", "HAS_ENVIRON", "HAS_PROC_IO_COUNTERS", - "HAS_IONICE", "HAS_MEMORY_MAPS", "HAS_PROC_CPU_NUM", "HAS_RLIMIT", - "HAS_SENSORS_BATTERY", "HAS_BATTERY", "HAS_SENSORS_FANS", - "HAS_SENSORS_TEMPERATURES", "HAS_NET_CONNECTIONS_UNIX", "MACOS_11PLUS", - "MACOS_12PLUS", "COVERAGE", 'AARCH64', "PYTEST_PARALLEL", - # subprocesses - 'pyrun', 'terminate', 'reap_children', 'spawn_testproc', 'spawn_zombie', - 'spawn_children_pair', - # threads - 'ThreadTask', - # test utils - 'unittest', 'skip_on_access_denied', 'skip_on_not_implemented', - 'retry_on_failure', 'TestMemoryLeak', 'PsutilTestCase', - 'process_namespace', 'system_namespace', 'print_sysinfo', - 'is_win_secure_system_proc', 'fake_pytest', - # fs utils - 'chdir', 'safe_rmpath', 'create_py_exe', 'create_c_exe', 'get_testfn', - # os - 'get_winver', 'kernel_version', - # sync primitives - 'call_until', 'wait_for_pid', 'wait_for_file', - # network - 'check_net_address', 'filter_proc_net_connections', - 'get_free_port', 'bind_socket', 'bind_unix_socket', 'tcp_socketpair', - 'unix_socketpair', 'create_sockets', - # compat - 'reload_module', 'import_module_by_path', - # others - 'warn', 'copyload_shared_lib', 'is_namedtuple', -] -# fmt: on - - -# =================================================================== -# --- constants -# =================================================================== - -# --- platforms - -PYPY = '__pypy__' in sys.builtin_module_names -# whether we're running this test suite on a Continuous Integration service -GITHUB_ACTIONS = 'GITHUB_ACTIONS' in os.environ or 'CIBUILDWHEEL' in os.environ -CI_TESTING = GITHUB_ACTIONS -COVERAGE = 'COVERAGE_RUN' in os.environ -PYTEST_PARALLEL = "PYTEST_XDIST_WORKER" in os.environ # `make test-parallel` -# are we a 64 bit process? -IS_64BIT = sys.maxsize > 2**32 -AARCH64 = platform.machine() == "aarch64" - - -@memoize -def macos_version(): - version_str = platform.mac_ver()[0] - version = tuple(map(int, version_str.split(".")[:2])) - if version == (10, 16): - # When built against an older macOS SDK, Python will report - # macOS 10.16 instead of the real version. - version_str = subprocess.check_output( - [ - sys.executable, - "-sS", - "-c", - "import platform; print(platform.mac_ver()[0])", - ], - env={"SYSTEM_VERSION_COMPAT": "0"}, - universal_newlines=True, - ) - version = tuple(map(int, version_str.split(".")[:2])) - return version - - -if MACOS: - MACOS_11PLUS = macos_version() > (10, 15) - MACOS_12PLUS = macos_version() >= (12, 0) -else: - MACOS_11PLUS = False - MACOS_12PLUS = False - - -# --- configurable defaults - -# how many times retry_on_failure() decorator will retry -NO_RETRIES = 10 -# bytes tolerance for system-wide related tests -TOLERANCE_SYS_MEM = 5 * 1024 * 1024 # 5MB -TOLERANCE_DISK_USAGE = 10 * 1024 * 1024 # 10MB -# the timeout used in functions which have to wait -GLOBAL_TIMEOUT = 5 -# be more tolerant if we're on CI in order to avoid false positives -if CI_TESTING: - NO_RETRIES *= 3 - GLOBAL_TIMEOUT *= 3 - TOLERANCE_SYS_MEM *= 4 - TOLERANCE_DISK_USAGE *= 3 - -# --- file names - -# Disambiguate TESTFN for parallel testing. -if os.name == 'java': - # Jython disallows @ in module names - TESTFN_PREFIX = f"$psutil-{os.getpid()}-" -else: - TESTFN_PREFIX = f"@psutil-{os.getpid()}-" -UNICODE_SUFFIX = "-ƒőő" -# An invalid unicode string. -INVALID_UNICODE_SUFFIX = b"f\xc0\x80".decode('utf8', 'surrogateescape') -ASCII_FS = sys.getfilesystemencoding().lower() in {"ascii", "us-ascii"} - -# --- paths - -ROOT_DIR = os.path.realpath( - os.path.join(os.path.dirname(__file__), '..', '..') -) -SCRIPTS_DIR = os.environ.get( - "PSUTIL_SCRIPTS_DIR", os.path.join(ROOT_DIR, 'scripts') -) -HERE = os.path.realpath(os.path.dirname(__file__)) - -# --- support - -HAS_CPU_AFFINITY = hasattr(psutil.Process, "cpu_affinity") -HAS_CPU_FREQ = hasattr(psutil, "cpu_freq") -HAS_ENVIRON = hasattr(psutil.Process, "environ") -HAS_GETLOADAVG = hasattr(psutil, "getloadavg") -HAS_IONICE = hasattr(psutil.Process, "ionice") -HAS_MEMORY_MAPS = hasattr(psutil.Process, "memory_maps") -HAS_NET_CONNECTIONS_UNIX = POSIX and not SUNOS -HAS_NET_IO_COUNTERS = hasattr(psutil, "net_io_counters") -HAS_PROC_CPU_NUM = hasattr(psutil.Process, "cpu_num") -HAS_PROC_IO_COUNTERS = hasattr(psutil.Process, "io_counters") -HAS_RLIMIT = hasattr(psutil.Process, "rlimit") -HAS_SENSORS_BATTERY = hasattr(psutil, "sensors_battery") -try: - HAS_BATTERY = HAS_SENSORS_BATTERY and bool(psutil.sensors_battery()) -except Exception: # noqa: BLE001 - HAS_BATTERY = False -HAS_SENSORS_FANS = hasattr(psutil, "sensors_fans") -HAS_SENSORS_TEMPERATURES = hasattr(psutil, "sensors_temperatures") -HAS_THREADS = hasattr(psutil.Process, "threads") -SKIP_SYSCONS = (MACOS or AIX) and os.getuid() != 0 - -# --- misc - - -def _get_py_exe(): - def attempt(exe): - try: - subprocess.check_call( - [exe, "-V"], stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) - except subprocess.CalledProcessError: - return None - else: - return exe - - env = os.environ.copy() - - # On Windows, starting with python 3.7, virtual environments use a - # venv launcher startup process. This does not play well when - # counting spawned processes, or when relying on the PID of the - # spawned process to do some checks, e.g. connections check per PID. - # Let's use the base python in this case. - base = getattr(sys, "_base_executable", None) - if WINDOWS and sys.version_info >= (3, 7) and base is not None: - # We need to set __PYVENV_LAUNCHER__ to sys.executable for the - # base python executable to know about the environment. - env["__PYVENV_LAUNCHER__"] = sys.executable - return base, env - elif GITHUB_ACTIONS: - return sys.executable, env - elif MACOS: - exe = ( - attempt(sys.executable) - or attempt(os.path.realpath(sys.executable)) - or attempt( - shutil.which("python{}.{}".format(*sys.version_info[:2])) - ) - or attempt(psutil.Process().exe()) - ) - if not exe: - raise ValueError("can't find python exe real abspath") - return exe, env - else: - exe = os.path.realpath(sys.executable) - assert os.path.exists(exe), exe - return exe, env - - -PYTHON_EXE, PYTHON_EXE_ENV = _get_py_exe() -DEVNULL = open(os.devnull, 'r+') # noqa: SIM115 -atexit.register(DEVNULL.close) - -VALID_PROC_STATUSES = [ - getattr(psutil, x) for x in dir(psutil) if x.startswith('STATUS_') -] -AF_UNIX = getattr(socket, "AF_UNIX", object()) - -_subprocesses_started = set() -_pids_started = set() - - -# =================================================================== -# --- threads -# =================================================================== - - -class ThreadTask(threading.Thread): - """A thread task which does nothing expect staying alive.""" - - def __init__(self): - super().__init__() - self._running = False - self._interval = 0.001 - self._flag = threading.Event() - - def __repr__(self): - name = self.__class__.__name__ - return f"<{name} running={self._running} at {id(self):#x}>" - - def __enter__(self): - self.start() - return self - - def __exit__(self, *args, **kwargs): - self.stop() - - def start(self): - """Start thread and keep it running until an explicit - stop() request. Polls for shutdown every 'timeout' seconds. - """ - if self._running: - raise ValueError("already started") - threading.Thread.start(self) - self._flag.wait() - - def run(self): - self._running = True - self._flag.set() - while self._running: - time.sleep(self._interval) - - def stop(self): - """Stop thread execution and and waits until it is stopped.""" - if not self._running: - raise ValueError("already stopped") - self._running = False - self.join() - - -# =================================================================== -# --- subprocesses -# =================================================================== - - -def _reap_children_on_err(fun): - @functools.wraps(fun) - def wrapper(*args, **kwargs): - try: - return fun(*args, **kwargs) - except Exception: - reap_children() - raise - - return wrapper - - -@_reap_children_on_err -def spawn_testproc(cmd=None, **kwds): - """Create a python subprocess which does nothing for some secs and - return it as a subprocess.Popen instance. - If "cmd" is specified that is used instead of python. - By default stdin and stdout are redirected to /dev/null. - It also attempts to make sure the process is in a reasonably - initialized state. - The process is registered for cleanup on reap_children(). - """ - kwds.setdefault("stdin", DEVNULL) - kwds.setdefault("stdout", DEVNULL) - kwds.setdefault("cwd", os.getcwd()) - kwds.setdefault("env", PYTHON_EXE_ENV) - if WINDOWS: - # Prevents the subprocess to open error dialogs. This will also - # cause stderr to be suppressed, which is suboptimal in order - # to debug broken tests. - CREATE_NO_WINDOW = 0x8000000 - kwds.setdefault("creationflags", CREATE_NO_WINDOW) - if cmd is None: - testfn = get_testfn(dir=os.getcwd()) - try: - safe_rmpath(testfn) - pyline = ( - "import time;" - f"open(r'{testfn}', 'w').close();" - "[time.sleep(0.1) for x in range(100)];" # 10 secs - ) - cmd = [PYTHON_EXE, "-c", pyline] - sproc = subprocess.Popen(cmd, **kwds) - _subprocesses_started.add(sproc) - wait_for_file(testfn, delete=True, empty=True) - finally: - safe_rmpath(testfn) - else: - sproc = subprocess.Popen(cmd, **kwds) - _subprocesses_started.add(sproc) - wait_for_pid(sproc.pid) - return sproc - - -@_reap_children_on_err -def spawn_children_pair(): - """Create a subprocess which creates another one as in: - A (us) -> B (child) -> C (grandchild). - Return a (child, grandchild) tuple. - The 2 processes are fully initialized and will live for 60 secs - and are registered for cleanup on reap_children(). - """ - tfile = None - testfn = get_testfn(dir=os.getcwd()) - try: - s = textwrap.dedent(f"""\ - import subprocess, os, sys, time - s = "import os, time;" - s += "f = open('{os.path.basename(testfn)}', 'w');" - s += "f.write(str(os.getpid()));" - s += "f.close();" - s += "[time.sleep(0.1) for x in range(100 * 6)];" - p = subprocess.Popen([r'{PYTHON_EXE}', '-c', s]) - p.wait() - """) - # On Windows if we create a subprocess with CREATE_NO_WINDOW flag - # set (which is the default) a "conhost.exe" extra process will be - # spawned as a child. We don't want that. - if WINDOWS: - subp, tfile = pyrun(s, creationflags=0) - else: - subp, tfile = pyrun(s) - child = psutil.Process(subp.pid) - grandchild_pid = int(wait_for_file(testfn, delete=True, empty=False)) - _pids_started.add(grandchild_pid) - grandchild = psutil.Process(grandchild_pid) - return (child, grandchild) - finally: - safe_rmpath(testfn) - if tfile is not None: - safe_rmpath(tfile) - - -def spawn_zombie(): - """Create a zombie process and return a (parent, zombie) process tuple. - In order to kill the zombie parent must be terminate()d first, then - zombie must be wait()ed on. - """ - assert psutil.POSIX - unix_file = get_testfn() - src = textwrap.dedent(f"""\ - import os, sys, time, socket, contextlib - child_pid = os.fork() - if child_pid > 0: - time.sleep(3000) - else: - # this is the zombie process - with socket.socket(socket.AF_UNIX) as s: - s.connect('{unix_file}') - pid = bytes(str(os.getpid()), 'ascii') - s.sendall(pid) - """) - tfile = None - sock = bind_unix_socket(unix_file) - try: - sock.settimeout(GLOBAL_TIMEOUT) - parent, tfile = pyrun(src) - conn, _ = sock.accept() - try: - select.select([conn.fileno()], [], [], GLOBAL_TIMEOUT) - zpid = int(conn.recv(1024)) - _pids_started.add(zpid) - zombie = psutil.Process(zpid) - call_until(lambda: zombie.status() == psutil.STATUS_ZOMBIE) - return (parent, zombie) - finally: - conn.close() - finally: - sock.close() - safe_rmpath(unix_file) - if tfile is not None: - safe_rmpath(tfile) - - -@_reap_children_on_err -def pyrun(src, **kwds): - """Run python 'src' code string in a separate interpreter. - Returns a subprocess.Popen instance and the test file where the source - code was written. - """ - kwds.setdefault("stdout", None) - kwds.setdefault("stderr", None) - srcfile = get_testfn() - try: - with open(srcfile, "w") as f: - f.write(src) - subp = spawn_testproc([PYTHON_EXE, f.name], **kwds) - wait_for_pid(subp.pid) - return (subp, srcfile) - except Exception: - safe_rmpath(srcfile) - raise - - -@_reap_children_on_err -def sh(cmd, **kwds): - """Run cmd in a subprocess and return its output. - raises RuntimeError on error. - """ - # Prevents subprocess to open error dialogs in case of error. - flags = 0x8000000 if WINDOWS else 0 - kwds.setdefault("stdout", subprocess.PIPE) - kwds.setdefault("stderr", subprocess.PIPE) - kwds.setdefault("universal_newlines", True) - kwds.setdefault("creationflags", flags) - if isinstance(cmd, str): - cmd = shlex.split(cmd) - p = subprocess.Popen(cmd, **kwds) - _subprocesses_started.add(p) - stdout, stderr = p.communicate(timeout=GLOBAL_TIMEOUT) - if p.returncode != 0: - raise RuntimeError(stdout + stderr) - if stderr: - warn(stderr) - if stdout.endswith('\n'): - stdout = stdout[:-1] - return stdout - - -def terminate(proc_or_pid, sig=signal.SIGTERM, wait_timeout=GLOBAL_TIMEOUT): - """Terminate a process and wait() for it. - Process can be a PID or an instance of psutil.Process(), - subprocess.Popen() or psutil.Popen(). - If it's a subprocess.Popen() or psutil.Popen() instance also closes - its stdin / stdout / stderr fds. - PID is wait()ed even if the process is already gone (kills zombies). - Does nothing if the process does not exist. - Return process exit status. - """ - - def wait(proc, timeout): - proc.wait(timeout) - if WINDOWS and isinstance(proc, subprocess.Popen): - # Otherwise PID may still hang around. - try: - return psutil.Process(proc.pid).wait(timeout) - except psutil.NoSuchProcess: - pass - - def sendsig(proc, sig): - # XXX: otherwise the build hangs for some reason. - if MACOS and GITHUB_ACTIONS: - sig = signal.SIGKILL - # If the process received SIGSTOP, SIGCONT is necessary first, - # otherwise SIGTERM won't work. - if POSIX and sig != signal.SIGKILL: - proc.send_signal(signal.SIGCONT) - proc.send_signal(sig) - - def term_subprocess_proc(proc, timeout): - try: - sendsig(proc, sig) - except ProcessLookupError: - pass - except OSError as err: - if WINDOWS and err.winerror == 6: # "invalid handle" - pass - raise - return wait(proc, timeout) - - def term_psutil_proc(proc, timeout): - try: - sendsig(proc, sig) - except psutil.NoSuchProcess: - pass - return wait(proc, timeout) - - def term_pid(pid, timeout): - try: - proc = psutil.Process(pid) - except psutil.NoSuchProcess: - # Needed to kill zombies. - if POSIX: - return wait_pid(pid, timeout) - else: - return term_psutil_proc(proc, timeout) - - def flush_popen(proc): - if proc.stdout: - proc.stdout.close() - if proc.stderr: - proc.stderr.close() - # Flushing a BufferedWriter may raise an error. - if proc.stdin: - proc.stdin.close() - - p = proc_or_pid - try: - if isinstance(p, int): - return term_pid(p, wait_timeout) - elif isinstance(p, (psutil.Process, psutil.Popen)): - return term_psutil_proc(p, wait_timeout) - elif isinstance(p, subprocess.Popen): - return term_subprocess_proc(p, wait_timeout) - else: - raise TypeError(f"wrong type {p!r}") - finally: - if isinstance(p, (subprocess.Popen, psutil.Popen)): - flush_popen(p) - pid = p if isinstance(p, int) else p.pid - assert not psutil.pid_exists(pid), pid - - -def reap_children(recursive=False): - """Terminate and wait() any subprocess started by this test suite - and any children currently running, ensuring that no processes stick - around to hog resources. - If recursive is True it also tries to terminate and wait() - all grandchildren started by this process. - """ - # Get the children here before terminating them, as in case of - # recursive=True we don't want to lose the intermediate reference - # pointing to the grandchildren. - children = psutil.Process().children(recursive=recursive) - - # Terminate subprocess.Popen. - while _subprocesses_started: - subp = _subprocesses_started.pop() - terminate(subp) - - # Collect started pids. - while _pids_started: - pid = _pids_started.pop() - terminate(pid) - - # Terminate children. - if children: - for p in children: - terminate(p, wait_timeout=None) - _, alive = psutil.wait_procs(children, timeout=GLOBAL_TIMEOUT) - for p in alive: - warn(f"couldn't terminate process {p!r}; attempting kill()") - terminate(p, sig=signal.SIGKILL) - - -# =================================================================== -# --- OS -# =================================================================== - - -def kernel_version(): - """Return a tuple such as (2, 6, 36).""" - if not POSIX: - raise NotImplementedError("not POSIX") - s = "" - uname = os.uname()[2] - for c in uname: - if c.isdigit() or c == '.': - s += c - else: - break - if not s: - raise ValueError(f"can't parse {uname!r}") - minor = 0 - micro = 0 - nums = s.split('.') - major = int(nums[0]) - if len(nums) >= 2: - minor = int(nums[1]) - if len(nums) >= 3: - micro = int(nums[2]) - return (major, minor, micro) - - -def get_winver(): - if not WINDOWS: - raise NotImplementedError("not WINDOWS") - wv = sys.getwindowsversion() - sp = wv.service_pack_major or 0 - return (wv[0], wv[1], sp) - - -# =================================================================== -# --- sync primitives -# =================================================================== - - -class retry: - """A retry decorator.""" - - def __init__( - self, - exception=Exception, - timeout=None, - retries=None, - interval=0.001, - logfun=None, - ): - if timeout and retries: - raise ValueError("timeout and retries args are mutually exclusive") - self.exception = exception - self.timeout = timeout - self.retries = retries - self.interval = interval - self.logfun = logfun - - def __iter__(self): - if self.timeout: - stop_at = time.time() + self.timeout - while time.time() < stop_at: - yield - elif self.retries: - for _ in range(self.retries): - yield - else: - while True: - yield - - def sleep(self): - if self.interval is not None: - time.sleep(self.interval) - - def __call__(self, fun): - @functools.wraps(fun) - def wrapper(*args, **kwargs): - exc = None - for _ in self: - try: - return fun(*args, **kwargs) - except self.exception as _: - exc = _ - if self.logfun is not None: - self.logfun(exc) - self.sleep() - continue - - raise exc - - # This way the user of the decorated function can change config - # parameters. - wrapper.decorator = self - return wrapper - - -@retry( - exception=psutil.NoSuchProcess, - logfun=None, - timeout=GLOBAL_TIMEOUT, - interval=0.001, -) -def wait_for_pid(pid): - """Wait for pid to show up in the process list then return. - Used in the test suite to give time the sub process to initialize. - """ - if pid not in psutil.pids(): - raise psutil.NoSuchProcess(pid) - psutil.Process(pid) - - -@retry( - exception=(FileNotFoundError, AssertionError), - logfun=None, - timeout=GLOBAL_TIMEOUT, - interval=0.001, -) -def wait_for_file(fname, delete=True, empty=False): - """Wait for a file to be written on disk with some content.""" - with open(fname, "rb") as f: - data = f.read() - if not empty: - assert data - if delete: - safe_rmpath(fname) - return data - - -@retry( - exception=AssertionError, - logfun=None, - timeout=GLOBAL_TIMEOUT, - interval=0.001, -) -def call_until(fun): - """Keep calling function until it evaluates to True.""" - ret = fun() - assert ret - return ret - - -# =================================================================== -# --- fs -# =================================================================== - - -def safe_rmpath(path): - """Convenience function for removing temporary test files or dirs.""" - - def retry_fun(fun): - # On Windows it could happen that the file or directory has - # open handles or references preventing the delete operation - # to succeed immediately, so we retry for a while. See: - # https://bugs.python.org/issue33240 - stop_at = time.time() + GLOBAL_TIMEOUT - while time.time() < stop_at: - try: - return fun() - except FileNotFoundError: - pass - except OSError as _: - err = _ - warn(f"ignoring {err}") - time.sleep(0.01) - raise err - - try: - st = os.stat(path) - if stat.S_ISDIR(st.st_mode): - fun = functools.partial(shutil.rmtree, path) - else: - fun = functools.partial(os.remove, path) - if POSIX: - fun() - else: - retry_fun(fun) - except FileNotFoundError: - pass - - -def safe_mkdir(dir): - """Convenience function for creating a directory.""" - try: - os.mkdir(dir) - except FileExistsError: - pass - - -@contextlib.contextmanager -def chdir(dirname): - """Context manager which temporarily changes the current directory.""" - curdir = os.getcwd() - try: - os.chdir(dirname) - yield - finally: - os.chdir(curdir) - - -def create_py_exe(path): - """Create a Python executable file in the given location.""" - assert not os.path.exists(path), path - atexit.register(safe_rmpath, path) - shutil.copyfile(PYTHON_EXE, path) - if POSIX: - st = os.stat(path) - os.chmod(path, st.st_mode | stat.S_IEXEC) - return path - - -def create_c_exe(path, c_code=None): - """Create a compiled C executable in the given location.""" - assert not os.path.exists(path), path - if not shutil.which("gcc"): - raise pytest.skip("gcc is not installed") - if c_code is None: - c_code = textwrap.dedent(""" - #include - int main() { - pause(); - return 1; - } - """) - else: - assert isinstance(c_code, str), c_code - - atexit.register(safe_rmpath, path) - with open(get_testfn(suffix='.c'), "w") as f: - f.write(c_code) - try: - subprocess.check_call(["gcc", f.name, "-o", path]) - finally: - safe_rmpath(f.name) - return path - - -def get_testfn(suffix="", dir=None): - """Return an absolute pathname of a file or dir that did not - exist at the time this call is made. Also schedule it for safe - deletion at interpreter exit. It's technically racy but probably - not really due to the time variant. - """ - while True: - name = tempfile.mktemp(prefix=TESTFN_PREFIX, suffix=suffix, dir=dir) - if not os.path.exists(name): # also include dirs - path = os.path.realpath(name) # needed for OSX - atexit.register(safe_rmpath, path) - return path - - -# =================================================================== -# --- testing -# =================================================================== - - -class fake_pytest: - """A class that mimics some basic pytest APIs. This is meant for - when unit tests are run in production, where pytest may not be - installed. Still, the user can test psutil installation via: - - $ python3 -m psutil.tests - """ - - @staticmethod - def main(*args, **kw): # noqa: ARG004 - """Mimics pytest.main(). It has the same effect as running - `python3 -m unittest -v` from the project root directory. - """ - suite = unittest.TestLoader().discover(HERE) - unittest.TextTestRunner(verbosity=2).run(suite) - warnings.warn( - "Fake pytest module was used. Test results may be inaccurate.", - UserWarning, - stacklevel=1, - ) - return suite - - @staticmethod - def raises(exc, match=None): - """Mimics `pytest.raises`.""" - - class ExceptionInfo: - _exc = None - - @property - def value(self): - return self._exc - - @contextlib.contextmanager - def context(exc, match=None): - einfo = ExceptionInfo() - try: - yield einfo - except exc as err: - if match and not re.search(match, str(err)): - msg = f'"{match}" does not match "{err}"' - raise AssertionError(msg) - einfo._exc = err - else: - raise AssertionError(f"{exc!r} not raised") - - return context(exc, match=match) - - @staticmethod - def warns(warning, match=None): - """Mimics `pytest.warns`.""" - if match: - return unittest.TestCase().assertWarnsRegex(warning, match) - return unittest.TestCase().assertWarns(warning) - - @staticmethod - def skip(reason=""): - """Mimics `unittest.SkipTest`.""" - raise unittest.SkipTest(reason) - - class mark: - - @staticmethod - def skipif(condition, reason=""): - """Mimics `@pytest.mark.skipif` decorator.""" - return unittest.skipIf(condition, reason) - - class xdist_group: - """Mimics `@pytest.mark.xdist_group` decorator (no-op).""" - - def __init__(self, name=None): - pass - - def __call__(self, cls_or_meth): - return cls_or_meth - - -if pytest is None: - pytest = fake_pytest - - -class PsutilTestCase(unittest.TestCase): - """Test class providing auto-cleanup wrappers on top of process - test utilities. All test classes should derive from this one, even - if we use pytest. - """ - - def get_testfn(self, suffix="", dir=None): - fname = get_testfn(suffix=suffix, dir=dir) - self.addCleanup(safe_rmpath, fname) - return fname - - def spawn_testproc(self, *args, **kwds): - sproc = spawn_testproc(*args, **kwds) - self.addCleanup(terminate, sproc) - return sproc - - def spawn_children_pair(self): - child1, child2 = spawn_children_pair() - self.addCleanup(terminate, child2) - self.addCleanup(terminate, child1) # executed first - return (child1, child2) - - def spawn_zombie(self): - parent, zombie = spawn_zombie() - self.addCleanup(terminate, zombie) - self.addCleanup(terminate, parent) # executed first - return (parent, zombie) - - def pyrun(self, *args, **kwds): - sproc, srcfile = pyrun(*args, **kwds) - self.addCleanup(safe_rmpath, srcfile) - self.addCleanup(terminate, sproc) # executed first - return sproc - - def _check_proc_exc(self, proc, exc): - assert isinstance(exc, psutil.Error) - assert exc.pid == proc.pid - assert exc.name == proc._name - if exc.name: - assert exc.name - if isinstance(exc, psutil.ZombieProcess): - assert exc.ppid == proc._ppid - if exc.ppid is not None: - assert exc.ppid >= 0 - str(exc) - repr(exc) - - def assertPidGone(self, pid): - with pytest.raises(psutil.NoSuchProcess) as cm: - try: - psutil.Process(pid) - except psutil.ZombieProcess: - raise AssertionError("wasn't supposed to raise ZombieProcess") - assert cm.value.pid == pid - assert cm.value.name is None - assert not psutil.pid_exists(pid), pid - assert pid not in psutil.pids() - assert pid not in [x.pid for x in psutil.process_iter()] - - def assertProcessGone(self, proc): - self.assertPidGone(proc.pid) - ns = process_namespace(proc) - for fun, name in ns.iter(ns.all, clear_cache=True): - with self.subTest(proc=proc, name=name): - try: - ret = fun() - except psutil.ZombieProcess: - raise - except psutil.NoSuchProcess as exc: - self._check_proc_exc(proc, exc) - else: - msg = ( - f"Process.{name}() didn't raise NSP and returned" - f" {ret!r}" - ) - raise AssertionError(msg) - proc.wait(timeout=0) # assert not raise TimeoutExpired - - def assertProcessZombie(self, proc): - # A zombie process should always be instantiable. - clone = psutil.Process(proc.pid) - # Cloned zombie on Open/NetBSD has null creation time, see: - # https://github.com/giampaolo/psutil/issues/2287 - assert proc == clone - if not (OPENBSD or NETBSD): - assert hash(proc) == hash(clone) - # Its status always be querable. - assert proc.status() == psutil.STATUS_ZOMBIE - # It should be considered 'running'. - assert proc.is_running() - assert psutil.pid_exists(proc.pid) - # as_dict() shouldn't crash. - proc.as_dict() - # It should show up in pids() and process_iter(). - assert proc.pid in psutil.pids() - assert proc.pid in [x.pid for x in psutil.process_iter()] - psutil._pmap = {} - assert proc.pid in [x.pid for x in psutil.process_iter()] - # Call all methods. - ns = process_namespace(proc) - for fun, name in ns.iter(ns.all, clear_cache=True): - with self.subTest(proc=proc, name=name): - try: - fun() - except (psutil.ZombieProcess, psutil.AccessDenied) as exc: - self._check_proc_exc(proc, exc) - if LINUX: - # https://github.com/giampaolo/psutil/pull/2288 - with pytest.raises(psutil.ZombieProcess) as cm: - proc.cmdline() - self._check_proc_exc(proc, cm.value) - with pytest.raises(psutil.ZombieProcess) as cm: - proc.exe() - self._check_proc_exc(proc, cm.value) - with pytest.raises(psutil.ZombieProcess) as cm: - proc.memory_maps() - self._check_proc_exc(proc, cm.value) - # Zombie cannot be signaled or terminated. - proc.suspend() - proc.resume() - proc.terminate() - proc.kill() - assert proc.is_running() - assert psutil.pid_exists(proc.pid) - assert proc.pid in psutil.pids() - assert proc.pid in [x.pid for x in psutil.process_iter()] - psutil._pmap = {} - assert proc.pid in [x.pid for x in psutil.process_iter()] - - # Its parent should 'see' it (edit: not true on BSD and MACOS). - # descendants = [x.pid for x in psutil.Process().children( - # recursive=True)] - # self.assertIn(proc.pid, descendants) - - # __eq__ can't be relied upon because creation time may not be - # querable. - # self.assertEqual(proc, psutil.Process(proc.pid)) - - # XXX should we also assume ppid() to be usable? Note: this - # would be an important use case as the only way to get - # rid of a zombie is to kill its parent. - # self.assertEqual(proc.ppid(), os.getpid()) - - -@pytest.mark.skipif(PYPY, reason="unreliable on PYPY") -class TestMemoryLeak(PsutilTestCase): - """Test framework class for detecting function memory leaks, - typically functions implemented in C which forgot to free() memory - from the heap. It does so by checking whether the process memory - usage increased before and after calling the function many times. - - Note that this is hard (probably impossible) to do reliably, due - to how the OS handles memory, the GC and so on (memory can even - decrease!). In order to avoid false positives, in case of failure - (mem > 0) we retry the test for up to 5 times, increasing call - repetitions each time. If the memory keeps increasing then it's a - failure. - - If available (Linux, OSX, Windows), USS memory is used for comparison, - since it's supposed to be more precise, see: - https://gmpy.dev/blog/2016/real-process-memory-and-environ-in-python - If not, RSS memory is used. mallinfo() on Linux and _heapwalk() on - Windows may give even more precision, but at the moment are not - implemented. - - PyPy appears to be completely unstable for this framework, probably - because of its JIT, so tests on PYPY are skipped. - - Usage: - - class TestLeaks(psutil.tests.TestMemoryLeak): - - def test_fun(self): - self.execute(some_function) - """ - - # Configurable class attrs. - times = 200 - warmup_times = 10 - tolerance = 0 # memory - retries = 10 if CI_TESTING else 5 - verbose = True - _thisproc = psutil.Process() - _psutil_debug_orig = bool(os.getenv('PSUTIL_DEBUG')) - - @classmethod - def setUpClass(cls): - psutil._set_debug(False) # avoid spamming to stderr - - @classmethod - def tearDownClass(cls): - psutil._set_debug(cls._psutil_debug_orig) - - def _get_mem(self): - # USS is the closest thing we have to "real" memory usage and it - # should be less likely to produce false positives. - mem = self._thisproc.memory_full_info() - return getattr(mem, "uss", mem.rss) - - def _get_num_fds(self): - if POSIX: - return self._thisproc.num_fds() - else: - return self._thisproc.num_handles() - - def _log(self, msg): - if self.verbose: - print_color(msg, color="yellow", file=sys.stderr) - - def _check_fds(self, fun): - """Makes sure num_fds() (POSIX) or num_handles() (Windows) does - not increase after calling a function. Used to discover forgotten - close(2) and CloseHandle syscalls. - """ - before = self._get_num_fds() - self.call(fun) - after = self._get_num_fds() - diff = after - before - if diff < 0: - msg = ( - f"negative diff {diff!r} (gc probably collected a" - " resource from a previous test)" - ) - raise self.fail(msg) - if diff > 0: - type_ = "fd" if POSIX else "handle" - if diff > 1: - type_ += "s" - msg = f"{diff} unclosed {type_} after calling {fun!r}" - raise self.fail(msg) - - def _call_ntimes(self, fun, times): - """Get 2 distinct memory samples, before and after having - called fun repeatedly, and return the memory difference. - """ - gc.collect(generation=1) - mem1 = self._get_mem() - for x in range(times): - ret = self.call(fun) - del x, ret - gc.collect(generation=1) - mem2 = self._get_mem() - assert gc.garbage == [] - diff = mem2 - mem1 # can also be negative - return diff - - def _check_mem(self, fun, times, retries, tolerance): - messages = [] - prev_mem = 0 - increase = times - for idx in range(1, retries + 1): - mem = self._call_ntimes(fun, times) - msg = "Run #{}: extra-mem={}, per-call={}, calls={}".format( - idx, - bytes2human(mem), - bytes2human(mem / times), - times, - ) - messages.append(msg) - success = mem <= tolerance or mem <= prev_mem - if success: - if idx > 1: - self._log(msg) - return - else: - if idx == 1: - print() # noqa: T201 - self._log(msg) - times += increase - prev_mem = mem - raise self.fail(". ".join(messages)) - - # --- - - def call(self, fun): - return fun() - - def execute( - self, fun, times=None, warmup_times=None, retries=None, tolerance=None - ): - """Test a callable.""" - times = times if times is not None else self.times - warmup_times = ( - warmup_times if warmup_times is not None else self.warmup_times - ) - retries = retries if retries is not None else self.retries - tolerance = tolerance if tolerance is not None else self.tolerance - try: - assert times >= 1, "times must be >= 1" - assert warmup_times >= 0, "warmup_times must be >= 0" - assert retries >= 0, "retries must be >= 0" - assert tolerance >= 0, "tolerance must be >= 0" - except AssertionError as err: - raise ValueError(str(err)) - - self._call_ntimes(fun, warmup_times) # warm up - self._check_fds(fun) - self._check_mem(fun, times=times, retries=retries, tolerance=tolerance) - - def execute_w_exc(self, exc, fun, **kwargs): - """Convenience method to test a callable while making sure it - raises an exception on every call. - """ - - def call(): - self.assertRaises(exc, fun) - - self.execute(call, **kwargs) - - -def print_sysinfo(): - import collections - import datetime - import getpass - import locale - import pprint - - try: - import pip - except ImportError: - pip = None - try: - import wheel - except ImportError: - wheel = None - - info = collections.OrderedDict() - - # OS - if psutil.LINUX and shutil.which("lsb_release"): - info['OS'] = sh('lsb_release -d -s') - elif psutil.OSX: - info['OS'] = f"Darwin {platform.mac_ver()[0]}" - elif psutil.WINDOWS: - info['OS'] = "Windows " + ' '.join(map(str, platform.win32_ver())) - if hasattr(platform, 'win32_edition'): - info['OS'] += ", " + platform.win32_edition() - else: - info['OS'] = f"{platform.system()} {platform.version()}" - info['arch'] = ', '.join( - list(platform.architecture()) + [platform.machine()] - ) - if psutil.POSIX: - info['kernel'] = platform.uname()[2] - - # python - info['python'] = ', '.join([ - platform.python_implementation(), - platform.python_version(), - platform.python_compiler(), - ]) - info['pip'] = getattr(pip, '__version__', 'not installed') - if wheel is not None: - info['pip'] += f" (wheel={wheel.__version__})" - - # UNIX - if psutil.POSIX: - if shutil.which("gcc"): - out = sh(['gcc', '--version']) - info['gcc'] = str(out).split('\n')[0] - else: - info['gcc'] = 'not installed' - s = platform.libc_ver()[1] - if s: - info['glibc'] = s - - # system - info['fs-encoding'] = sys.getfilesystemencoding() - lang = locale.getlocale() - info['lang'] = f"{lang[0]}, {lang[1]}" - info['boot-time'] = datetime.datetime.fromtimestamp( - psutil.boot_time() - ).strftime("%Y-%m-%d %H:%M:%S") - info['time'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - info['user'] = getpass.getuser() - info['home'] = os.path.expanduser("~") - info['cwd'] = os.getcwd() - info['pyexe'] = PYTHON_EXE - info['hostname'] = platform.node() - info['PID'] = os.getpid() - - # metrics - info['cpus'] = psutil.cpu_count() - info['loadavg'] = "{:.1f}%, {:.1f}%, {:.1f}%".format( - *tuple(x / psutil.cpu_count() * 100 for x in psutil.getloadavg()) - ) - mem = psutil.virtual_memory() - info['memory'] = "{}%%, used={}, total={}".format( - int(mem.percent), - bytes2human(mem.used), - bytes2human(mem.total), - ) - swap = psutil.swap_memory() - info['swap'] = "{}%%, used={}, total={}".format( - int(swap.percent), - bytes2human(swap.used), - bytes2human(swap.total), - ) - info['pids'] = len(psutil.pids()) - pinfo = psutil.Process().as_dict() - pinfo.pop('memory_maps', None) - info['proc'] = pprint.pformat(pinfo) - - print("=" * 70, file=sys.stderr) # noqa: T201 - for k, v in info.items(): - print("{:<17} {}".format(k + ":", v), file=sys.stderr) # noqa: T201 - print("=" * 70, file=sys.stderr) # noqa: T201 - sys.stdout.flush() - - # if WINDOWS: - # os.system("tasklist") - # elif shutil.which("ps"): - # os.system("ps aux") - # print("=" * 70, file=sys.stderr) - - sys.stdout.flush() - - -def is_win_secure_system_proc(pid): - # see: https://github.com/giampaolo/psutil/issues/2338 - @memoize - def get_procs(): - ret = {} - out = sh("tasklist.exe /NH /FO csv") - for line in out.splitlines()[1:]: - bits = [x.replace('"', "") for x in line.split(",")] - name, pid = bits[0], int(bits[1]) - ret[pid] = name - return ret - - try: - return get_procs()[pid] == "Secure System" - except KeyError: - return False - - -def _get_eligible_cpu(): - p = psutil.Process() - if hasattr(p, "cpu_num"): - return p.cpu_num() - elif hasattr(p, "cpu_affinity"): - return random.choice(p.cpu_affinity()) - return 0 - - -class process_namespace: - """A container that lists all Process class method names + some - reasonable parameters to be called with. Utility methods (parent(), - children(), ...) are excluded. - - >>> ns = process_namespace(psutil.Process()) - >>> for fun, name in ns.iter(ns.getters): - ... fun() - """ - - utils = [('cpu_percent', (), {}), ('memory_percent', (), {})] - - ignored = [ - ('as_dict', (), {}), - ('children', (), {'recursive': True}), - ('connections', (), {}), # deprecated - ('is_running', (), {}), - ('oneshot', (), {}), - ('parent', (), {}), - ('parents', (), {}), - ('pid', (), {}), - ('wait', (0,), {}), - ] - - getters = [ - ('cmdline', (), {}), - ('cpu_times', (), {}), - ('create_time', (), {}), - ('cwd', (), {}), - ('exe', (), {}), - ('memory_full_info', (), {}), - ('memory_info', (), {}), - ('name', (), {}), - ('net_connections', (), {'kind': 'all'}), - ('nice', (), {}), - ('num_ctx_switches', (), {}), - ('num_threads', (), {}), - ('open_files', (), {}), - ('ppid', (), {}), - ('status', (), {}), - ('threads', (), {}), - ('username', (), {}), - ] - if POSIX: - getters += [('uids', (), {})] - getters += [('gids', (), {})] - getters += [('terminal', (), {})] - getters += [('num_fds', (), {})] - if HAS_PROC_IO_COUNTERS: - getters += [('io_counters', (), {})] - if HAS_IONICE: - getters += [('ionice', (), {})] - if HAS_RLIMIT: - getters += [('rlimit', (psutil.RLIMIT_NOFILE,), {})] - if HAS_CPU_AFFINITY: - getters += [('cpu_affinity', (), {})] - if HAS_PROC_CPU_NUM: - getters += [('cpu_num', (), {})] - if HAS_ENVIRON: - getters += [('environ', (), {})] - if WINDOWS: - getters += [('num_handles', (), {})] - if HAS_MEMORY_MAPS: - getters += [('memory_maps', (), {'grouped': False})] - - setters = [] - if POSIX: - setters += [('nice', (0,), {})] - else: - setters += [('nice', (psutil.NORMAL_PRIORITY_CLASS,), {})] - if HAS_RLIMIT: - setters += [('rlimit', (psutil.RLIMIT_NOFILE, (1024, 4096)), {})] - if HAS_IONICE: - if LINUX: - setters += [('ionice', (psutil.IOPRIO_CLASS_NONE, 0), {})] - else: - setters += [('ionice', (psutil.IOPRIO_NORMAL,), {})] - if HAS_CPU_AFFINITY: - setters += [('cpu_affinity', ([_get_eligible_cpu()],), {})] - - killers = [ - ('send_signal', (signal.SIGTERM,), {}), - ('suspend', (), {}), - ('resume', (), {}), - ('terminate', (), {}), - ('kill', (), {}), - ] - if WINDOWS: - killers += [('send_signal', (signal.CTRL_C_EVENT,), {})] - killers += [('send_signal', (signal.CTRL_BREAK_EVENT,), {})] - - all = utils + getters + setters + killers - - def __init__(self, proc): - self._proc = proc - - def iter(self, ls, clear_cache=True): - """Given a list of tuples yields a set of (fun, fun_name) tuples - in random order. - """ - ls = list(ls) - random.shuffle(ls) - for fun_name, args, kwds in ls: - if clear_cache: - self.clear_cache() - fun = getattr(self._proc, fun_name) - fun = functools.partial(fun, *args, **kwds) - yield (fun, fun_name) - - def clear_cache(self): - """Clear the cache of a Process instance.""" - self._proc._init(self._proc.pid, _ignore_nsp=True) - - @classmethod - def test_class_coverage(cls, test_class, ls): - """Given a TestCase instance and a list of tuples checks that - the class defines the required test method names. - """ - for fun_name, _, _ in ls: - meth_name = 'test_' + fun_name - if not hasattr(test_class, meth_name): - msg = ( - f"{test_class.__class__.__name__!r} class should define a" - f" {meth_name!r} method" - ) - raise AttributeError(msg) - - @classmethod - def test(cls): - this = {x[0] for x in cls.all} - ignored = {x[0] for x in cls.ignored} - klass = {x for x in dir(psutil.Process) if x[0] != '_'} - leftout = (this | ignored) ^ klass - if leftout: - raise ValueError(f"uncovered Process class names: {leftout!r}") - - -class system_namespace: - """A container that lists all the module-level, system-related APIs. - Utilities such as cpu_percent() are excluded. Usage: - - >>> ns = system_namespace - >>> for fun, name in ns.iter(ns.getters): - ... fun() - """ - - getters = [ - ('boot_time', (), {}), - ('cpu_count', (), {'logical': False}), - ('cpu_count', (), {'logical': True}), - ('cpu_stats', (), {}), - ('cpu_times', (), {'percpu': False}), - ('cpu_times', (), {'percpu': True}), - ('disk_io_counters', (), {'perdisk': True}), - ('disk_partitions', (), {'all': True}), - ('disk_usage', (os.getcwd(),), {}), - ('net_connections', (), {'kind': 'all'}), - ('net_if_addrs', (), {}), - ('net_if_stats', (), {}), - ('net_io_counters', (), {'pernic': True}), - ('pid_exists', (os.getpid(),), {}), - ('pids', (), {}), - ('swap_memory', (), {}), - ('users', (), {}), - ('virtual_memory', (), {}), - ] - if HAS_CPU_FREQ: - if MACOS and platform.machine() == 'arm64': # skipped due to #1892 - pass - else: - getters += [('cpu_freq', (), {'percpu': True})] - if HAS_GETLOADAVG: - getters += [('getloadavg', (), {})] - if HAS_SENSORS_TEMPERATURES: - getters += [('sensors_temperatures', (), {})] - if HAS_SENSORS_FANS: - getters += [('sensors_fans', (), {})] - if HAS_SENSORS_BATTERY: - getters += [('sensors_battery', (), {})] - if WINDOWS: - getters += [('win_service_iter', (), {})] - getters += [('win_service_get', ('alg',), {})] - - ignored = [ - ('process_iter', (), {}), - ('wait_procs', ([psutil.Process()],), {}), - ('cpu_percent', (), {}), - ('cpu_times_percent', (), {}), - ] - - all = getters - - @staticmethod - def iter(ls): - """Given a list of tuples yields a set of (fun, fun_name) tuples - in random order. - """ - ls = list(ls) - random.shuffle(ls) - for fun_name, args, kwds in ls: - fun = getattr(psutil, fun_name) - fun = functools.partial(fun, *args, **kwds) - yield (fun, fun_name) - - test_class_coverage = process_namespace.test_class_coverage - - -def retry_on_failure(retries=NO_RETRIES): - """Decorator which runs a test function and retries N times before - actually failing. - """ - - def logfun(exc): - print(f"{exc!r}, retrying", file=sys.stderr) # noqa: T201 - - return retry( - exception=AssertionError, timeout=None, retries=retries, logfun=logfun - ) - - -def skip_on_access_denied(only_if=None): - """Decorator to Ignore AccessDenied exceptions.""" - - def decorator(fun): - @functools.wraps(fun) - def wrapper(*args, **kwargs): - try: - return fun(*args, **kwargs) - except psutil.AccessDenied: - if only_if is not None: - if not only_if: - raise - raise pytest.skip("raises AccessDenied") - - return wrapper - - return decorator - - -def skip_on_not_implemented(only_if=None): - """Decorator to Ignore NotImplementedError exceptions.""" - - def decorator(fun): - @functools.wraps(fun) - def wrapper(*args, **kwargs): - try: - return fun(*args, **kwargs) - except NotImplementedError: - if only_if is not None: - if not only_if: - raise - msg = ( - f"{fun.__name__!r} was skipped because it raised" - " NotImplementedError" - ) - raise pytest.skip(msg) - - return wrapper - - return decorator - - -# =================================================================== -# --- network -# =================================================================== - - -# XXX: no longer used -def get_free_port(host='127.0.0.1'): - """Return an unused TCP port. Subject to race conditions.""" - with socket.socket() as sock: - sock.bind((host, 0)) - return sock.getsockname()[1] - - -def bind_socket(family=AF_INET, type=SOCK_STREAM, addr=None): - """Binds a generic socket.""" - if addr is None and family in {AF_INET, AF_INET6}: - addr = ("", 0) - sock = socket.socket(family, type) - try: - if os.name not in {'nt', 'cygwin'}: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.bind(addr) - if type == socket.SOCK_STREAM: - sock.listen(5) - return sock - except Exception: - sock.close() - raise - - -def bind_unix_socket(name, type=socket.SOCK_STREAM): - """Bind a UNIX socket.""" - assert psutil.POSIX - assert not os.path.exists(name), name - sock = socket.socket(socket.AF_UNIX, type) - try: - sock.bind(name) - if type == socket.SOCK_STREAM: - sock.listen(5) - except Exception: - sock.close() - raise - return sock - - -def tcp_socketpair(family, addr=("", 0)): - """Build a pair of TCP sockets connected to each other. - Return a (server, client) tuple. - """ - with socket.socket(family, SOCK_STREAM) as ll: - ll.bind(addr) - ll.listen(5) - addr = ll.getsockname() - c = socket.socket(family, SOCK_STREAM) - try: - c.connect(addr) - caddr = c.getsockname() - while True: - a, addr = ll.accept() - # check that we've got the correct client - if addr == caddr: - return (a, c) - a.close() - except OSError: - c.close() - raise - - -def unix_socketpair(name): - """Build a pair of UNIX sockets connected to each other through - the same UNIX file name. - Return a (server, client) tuple. - """ - assert psutil.POSIX - server = client = None - try: - server = bind_unix_socket(name, type=socket.SOCK_STREAM) - server.setblocking(0) - client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - client.setblocking(0) - client.connect(name) - # new = server.accept() - except Exception: - if server is not None: - server.close() - if client is not None: - client.close() - raise - return (server, client) - - -@contextlib.contextmanager -def create_sockets(): - """Open as many socket families / types as possible.""" - socks = [] - fname1 = fname2 = None - try: - socks.extend(( - bind_socket(socket.AF_INET, socket.SOCK_STREAM), - bind_socket(socket.AF_INET, socket.SOCK_DGRAM), - )) - if supports_ipv6(): - socks.extend(( - bind_socket(socket.AF_INET6, socket.SOCK_STREAM), - bind_socket(socket.AF_INET6, socket.SOCK_DGRAM), - )) - if POSIX and HAS_NET_CONNECTIONS_UNIX: - fname1 = get_testfn() - fname2 = get_testfn() - s1, s2 = unix_socketpair(fname1) - s3 = bind_unix_socket(fname2, type=socket.SOCK_DGRAM) - for s in (s1, s2, s3): - socks.append(s) - yield socks - finally: - for s in socks: - s.close() - for fname in (fname1, fname2): - if fname is not None: - safe_rmpath(fname) - - -def check_net_address(addr, family): - """Check a net address validity. Supported families are IPv4, - IPv6 and MAC addresses. - """ - assert isinstance(family, enum.IntEnum), family - if family == socket.AF_INET: - octs = [int(x) for x in addr.split('.')] - assert len(octs) == 4, addr - for num in octs: - assert 0 <= num <= 255, addr - ipaddress.IPv4Address(addr) - elif family == socket.AF_INET6: - assert isinstance(addr, str), addr - ipaddress.IPv6Address(addr) - elif family == psutil.AF_LINK: - assert re.match(r'([a-fA-F0-9]{2}[:|\-]?){6}', addr) is not None, addr - else: - raise ValueError(f"unknown family {family!r}") - - -def check_connection_ntuple(conn): - """Check validity of a connection namedtuple.""" - - def check_ntuple(conn): - has_pid = len(conn) == 7 - assert len(conn) in {6, 7}, len(conn) - assert conn[0] == conn.fd, conn.fd - assert conn[1] == conn.family, conn.family - assert conn[2] == conn.type, conn.type - assert conn[3] == conn.laddr, conn.laddr - assert conn[4] == conn.raddr, conn.raddr - assert conn[5] == conn.status, conn.status - if has_pid: - assert conn[6] == conn.pid, conn.pid - - def check_family(conn): - assert conn.family in {AF_INET, AF_INET6, AF_UNIX}, conn.family - assert isinstance(conn.family, enum.IntEnum), conn - if conn.family == AF_INET: - # actually try to bind the local socket; ignore IPv6 - # sockets as their address might be represented as - # an IPv4-mapped-address (e.g. "::127.0.0.1") - # and that's rejected by bind() - with socket.socket(conn.family, conn.type) as s: - try: - s.bind((conn.laddr[0], 0)) - except OSError as err: - if err.errno != errno.EADDRNOTAVAIL: - raise - elif conn.family == AF_UNIX: - assert conn.status == psutil.CONN_NONE, conn.status - - def check_type(conn): - # SOCK_SEQPACKET may happen in case of AF_UNIX socks - SOCK_SEQPACKET = getattr(socket, "SOCK_SEQPACKET", object()) - assert conn.type in { - socket.SOCK_STREAM, - socket.SOCK_DGRAM, - SOCK_SEQPACKET, - }, conn.type - assert isinstance(conn.type, enum.IntEnum), conn - if conn.type == socket.SOCK_DGRAM: - assert conn.status == psutil.CONN_NONE, conn.status - - def check_addrs(conn): - # check IP address and port sanity - for addr in (conn.laddr, conn.raddr): - if conn.family in {AF_INET, AF_INET6}: - assert isinstance(addr, tuple), type(addr) - if not addr: - continue - assert isinstance(addr.port, int), type(addr.port) - assert 0 <= addr.port <= 65535, addr.port - check_net_address(addr.ip, conn.family) - elif conn.family == AF_UNIX: - assert isinstance(addr, str), type(addr) - - def check_status(conn): - assert isinstance(conn.status, str), conn.status - valids = [ - getattr(psutil, x) for x in dir(psutil) if x.startswith('CONN_') - ] - assert conn.status in valids, conn.status - if conn.family in {AF_INET, AF_INET6} and conn.type == SOCK_STREAM: - assert conn.status != psutil.CONN_NONE, conn.status - else: - assert conn.status == psutil.CONN_NONE, conn.status - - check_ntuple(conn) - check_family(conn) - check_type(conn) - check_addrs(conn) - check_status(conn) - - -def filter_proc_net_connections(cons): - """Our process may start with some open UNIX sockets which are not - initialized by us, invalidating unit tests. - """ - new = [] - for conn in cons: - if POSIX and conn.family == socket.AF_UNIX: - if MACOS and "/syslog" in conn.raddr: - debug(f"skipping {conn}") - continue - new.append(conn) - return new - - -# =================================================================== -# --- import utils -# =================================================================== - - -def reload_module(module): - return importlib.reload(module) - - -def import_module_by_path(path): - name = os.path.splitext(os.path.basename(path))[0] - spec = importlib.util.spec_from_file_location(name, path) - mod = importlib.util.module_from_spec(spec) - spec.loader.exec_module(mod) - return mod - - -# =================================================================== -# --- others -# =================================================================== - - -def warn(msg): - """Raise a warning msg.""" - warnings.warn(msg, UserWarning, stacklevel=2) - - -def is_namedtuple(x): - """Check if object is an instance of namedtuple.""" - t = type(x) - b = t.__bases__ - if len(b) != 1 or b[0] is not tuple: - return False - f = getattr(t, '_fields', None) - if not isinstance(f, tuple): - return False - return all(isinstance(n, str) for n in f) - - -if POSIX: - - @contextlib.contextmanager - def copyload_shared_lib(suffix=""): - """Ctx manager which picks up a random shared CO lib used - by this process, copies it in another location and loads it - in memory via ctypes. Return the new absolutized path. - """ - exe = 'pypy' if PYPY else 'python' - ext = ".so" - dst = get_testfn(suffix=suffix + ext) - libs = [ - x.path - for x in psutil.Process().memory_maps() - if os.path.splitext(x.path)[1] == ext and exe in x.path.lower() - ] - src = random.choice(libs) - shutil.copyfile(src, dst) - try: - ctypes.CDLL(dst) - yield dst - finally: - safe_rmpath(dst) - -else: - - @contextlib.contextmanager - def copyload_shared_lib(suffix=""): - """Ctx manager which picks up a random shared DLL lib used - by this process, copies it in another location and loads it - in memory via ctypes. - Return the new absolutized, normcased path. - """ - from ctypes import WinError - from ctypes import wintypes - - ext = ".dll" - dst = get_testfn(suffix=suffix + ext) - libs = [ - x.path - for x in psutil.Process().memory_maps() - if x.path.lower().endswith(ext) - and 'python' in os.path.basename(x.path).lower() - and 'wow64' not in x.path.lower() - ] - if PYPY and not libs: - libs = [ - x.path - for x in psutil.Process().memory_maps() - if 'pypy' in os.path.basename(x.path).lower() - ] - src = random.choice(libs) - shutil.copyfile(src, dst) - cfile = None - try: - cfile = ctypes.WinDLL(dst) - yield dst - finally: - # Work around OverflowError: - # - https://ci.appveyor.com/project/giampaolo/psutil/build/1207/ - # job/o53330pbnri9bcw7 - # - http://bugs.python.org/issue30286 - # - http://stackoverflow.com/questions/23522055 - if cfile is not None: - FreeLibrary = ctypes.windll.kernel32.FreeLibrary - FreeLibrary.argtypes = [wintypes.HMODULE] - ret = FreeLibrary(cfile._handle) - if ret == 0: - raise WinError() - safe_rmpath(dst) - - -# =================================================================== -# --- Exit funs (first is executed last) -# =================================================================== - - -# this is executed first -@atexit.register -def cleanup_test_procs(): - reap_children(recursive=True) - - -# atexit module does not execute exit functions in case of SIGTERM, which -# gets sent to test subprocesses, which is a problem if they import this -# module. With this it will. See: -# https://gmpy.dev/blog/2016/how-to-always-execute-exit-functions-in-python -if POSIX: - signal.signal(signal.SIGTERM, lambda sig, _: sys.exit(sig)) diff --git a/PortablePython/Lib/site-packages/psutil/tests/__main__.py b/PortablePython/Lib/site-packages/psutil/tests/__main__.py deleted file mode 100644 index ce6fc24..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Run unit tests. This is invoked by: -$ python -m psutil.tests. -""" - -from psutil.tests import pytest - - -pytest.main(["-v", "-s", "--tb=short"]) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_aix.py b/PortablePython/Lib/site-packages/psutil/tests/test_aix.py deleted file mode 100644 index 10934c1..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_aix.py +++ /dev/null @@ -1,142 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola' -# Copyright (c) 2017, Arnon Yaari -# All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""AIX specific tests.""" - -import re - -import psutil -from psutil import AIX -from psutil.tests import PsutilTestCase -from psutil.tests import pytest -from psutil.tests import sh - - -@pytest.mark.skipif(not AIX, reason="AIX only") -class AIXSpecificTestCase(PsutilTestCase): - def test_virtual_memory(self): - out = sh('/usr/bin/svmon -O unit=KB') - re_pattern = r"memory\s*" - for field in [ - "size", - "inuse", - "free", - "pin", - "virtual", - "available", - "mmode", - ]: - re_pattern += rf"(?P<{field}>\S+)\s+" - matchobj = re.search(re_pattern, out) - - assert matchobj is not None - - KB = 1024 - total = int(matchobj.group("size")) * KB - available = int(matchobj.group("available")) * KB - used = int(matchobj.group("inuse")) * KB - free = int(matchobj.group("free")) * KB - - psutil_result = psutil.virtual_memory() - - # TOLERANCE_SYS_MEM from psutil.tests is not enough. For some reason - # we're seeing differences of ~1.2 MB. 2 MB is still a good tolerance - # when compared to GBs. - TOLERANCE_SYS_MEM = 2 * KB * KB # 2 MB - assert psutil_result.total == total - assert abs(psutil_result.used - used) < TOLERANCE_SYS_MEM - assert abs(psutil_result.available - available) < TOLERANCE_SYS_MEM - assert abs(psutil_result.free - free) < TOLERANCE_SYS_MEM - - def test_swap_memory(self): - out = sh('/usr/sbin/lsps -a') - # From the man page, "The size is given in megabytes" so we assume - # we'll always have 'MB' in the result - # TODO maybe try to use "swap -l" to check "used" too, but its units - # are not guaranteed to be "MB" so parsing may not be consistent - matchobj = re.search( - r"(?P\S+)\s+" - r"(?P\S+)\s+" - r"(?P\S+)\s+" - r"(?P\d+)MB", - out, - ) - - assert matchobj is not None - - total_mb = int(matchobj.group("size")) - MB = 1024**2 - psutil_result = psutil.swap_memory() - # we divide our result by MB instead of multiplying the lsps value by - # MB because lsps may round down, so we round down too - assert int(psutil_result.total / MB) == total_mb - - def test_cpu_stats(self): - out = sh('/usr/bin/mpstat -a') - - re_pattern = r"ALL\s*" - for field in [ - "min", - "maj", - "mpcs", - "mpcr", - "dev", - "soft", - "dec", - "ph", - "cs", - "ics", - "bound", - "rq", - "push", - "S3pull", - "S3grd", - "S0rd", - "S1rd", - "S2rd", - "S3rd", - "S4rd", - "S5rd", - "sysc", - ]: - re_pattern += rf"(?P<{field}>\S+)\s+" - matchobj = re.search(re_pattern, out) - - assert matchobj is not None - - # numbers are usually in the millions so 1000 is ok for tolerance - CPU_STATS_TOLERANCE = 1000 - psutil_result = psutil.cpu_stats() - assert ( - abs(psutil_result.ctx_switches - int(matchobj.group("cs"))) - < CPU_STATS_TOLERANCE - ) - assert ( - abs(psutil_result.syscalls - int(matchobj.group("sysc"))) - < CPU_STATS_TOLERANCE - ) - assert ( - abs(psutil_result.interrupts - int(matchobj.group("dev"))) - < CPU_STATS_TOLERANCE - ) - assert ( - abs(psutil_result.soft_interrupts - int(matchobj.group("soft"))) - < CPU_STATS_TOLERANCE - ) - - def test_cpu_count_logical(self): - out = sh('/usr/bin/mpstat -a') - mpstat_lcpu = int(re.search(r"lcpu=(\d+)", out).group(1)) - psutil_lcpu = psutil.cpu_count(logical=True) - assert mpstat_lcpu == psutil_lcpu - - def test_net_if_addrs_names(self): - out = sh('/etc/ifconfig -l') - ifconfig_names = set(out.split()) - psutil_names = set(psutil.net_if_addrs().keys()) - assert ifconfig_names == psutil_names diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_bsd.py b/PortablePython/Lib/site-packages/psutil/tests/test_bsd.py deleted file mode 100644 index 2786c34..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_bsd.py +++ /dev/null @@ -1,593 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# TODO: (FreeBSD) add test for comparing connections with 'sockstat' cmd. - - -"""Tests specific to all BSD platforms.""" - -import datetime -import os -import re -import shutil -import time - -import psutil -from psutil import BSD -from psutil import FREEBSD -from psutil import NETBSD -from psutil import OPENBSD -from psutil.tests import HAS_BATTERY -from psutil.tests import TOLERANCE_SYS_MEM -from psutil.tests import PsutilTestCase -from psutil.tests import pytest -from psutil.tests import retry_on_failure -from psutil.tests import sh -from psutil.tests import spawn_testproc -from psutil.tests import terminate - - -if BSD: - from psutil._psutil_posix import getpagesize - - PAGESIZE = getpagesize() - # muse requires root privileges - MUSE_AVAILABLE = os.getuid() == 0 and shutil.which("muse") -else: - PAGESIZE = None - MUSE_AVAILABLE = False - - -def sysctl(cmdline): - """Expects a sysctl command with an argument and parse the result - returning only the value of interest. - """ - result = sh("sysctl " + cmdline) - if FREEBSD: - result = result[result.find(": ") + 2 :] - elif OPENBSD or NETBSD: - result = result[result.find("=") + 1 :] - try: - return int(result) - except ValueError: - return result - - -def muse(field): - """Thin wrapper around 'muse' cmdline utility.""" - out = sh('muse') - for line in out.split('\n'): - if line.startswith(field): - break - else: - raise ValueError("line not found") - return int(line.split()[1]) - - -# ===================================================================== -# --- All BSD* -# ===================================================================== - - -@pytest.mark.skipif(not BSD, reason="BSD only") -class BSDTestCase(PsutilTestCase): - """Generic tests common to all BSD variants.""" - - @classmethod - def setUpClass(cls): - cls.pid = spawn_testproc().pid - - @classmethod - def tearDownClass(cls): - terminate(cls.pid) - - @pytest.mark.skipif(NETBSD, reason="-o lstart doesn't work on NETBSD") - def test_process_create_time(self): - output = sh(f"ps -o lstart -p {self.pid}") - start_ps = output.replace('STARTED', '').strip() - start_psutil = psutil.Process(self.pid).create_time() - start_psutil = time.strftime( - "%a %b %e %H:%M:%S %Y", time.localtime(start_psutil) - ) - assert start_ps == start_psutil - - def test_disks(self): - # test psutil.disk_usage() and psutil.disk_partitions() - # against "df -a" - def df(path): - out = sh(f'df -k "{path}"').strip() - lines = out.split('\n') - lines.pop(0) - line = lines.pop(0) - dev, total, used, free = line.split()[:4] - if dev == 'none': - dev = '' - total = int(total) * 1024 - used = int(used) * 1024 - free = int(free) * 1024 - return dev, total, used, free - - for part in psutil.disk_partitions(all=False): - usage = psutil.disk_usage(part.mountpoint) - dev, total, used, free = df(part.mountpoint) - assert part.device == dev - assert usage.total == total - # 10 MB tolerance - if abs(usage.free - free) > 10 * 1024 * 1024: - raise self.fail(f"psutil={usage.free}, df={free}") - if abs(usage.used - used) > 10 * 1024 * 1024: - raise self.fail(f"psutil={usage.used}, df={used}") - - @pytest.mark.skipif( - not shutil.which("sysctl"), reason="sysctl cmd not available" - ) - def test_cpu_count_logical(self): - syst = sysctl("hw.ncpu") - assert psutil.cpu_count(logical=True) == syst - - @pytest.mark.skipif( - not shutil.which("sysctl"), reason="sysctl cmd not available" - ) - @pytest.mark.skipif( - NETBSD, reason="skipped on NETBSD" # we check /proc/meminfo - ) - def test_virtual_memory_total(self): - num = sysctl('hw.physmem') - assert num == psutil.virtual_memory().total - - @pytest.mark.skipif( - not shutil.which("ifconfig"), reason="ifconfig cmd not available" - ) - def test_net_if_stats(self): - for name, stats in psutil.net_if_stats().items(): - try: - out = sh(f"ifconfig {name}") - except RuntimeError: - pass - else: - assert stats.isup == ('RUNNING' in out) - if "mtu" in out: - assert stats.mtu == int(re.findall(r'mtu (\d+)', out)[0]) - - -# ===================================================================== -# --- FreeBSD -# ===================================================================== - - -@pytest.mark.skipif(not FREEBSD, reason="FREEBSD only") -class FreeBSDPsutilTestCase(PsutilTestCase): - @classmethod - def setUpClass(cls): - cls.pid = spawn_testproc().pid - - @classmethod - def tearDownClass(cls): - terminate(cls.pid) - - @retry_on_failure() - def test_memory_maps(self): - out = sh(f"procstat -v {self.pid}") - maps = psutil.Process(self.pid).memory_maps(grouped=False) - lines = out.split('\n')[1:] - while lines: - line = lines.pop() - fields = line.split() - _, start, stop, _perms, res = fields[:5] - map = maps.pop() - assert f"{start}-{stop}" == map.addr - assert int(res) == map.rss - if not map.path.startswith('['): - assert fields[10] == map.path - - def test_exe(self): - out = sh(f"procstat -b {self.pid}") - assert psutil.Process(self.pid).exe() == out.split('\n')[1].split()[-1] - - def test_cmdline(self): - out = sh(f"procstat -c {self.pid}") - assert ' '.join(psutil.Process(self.pid).cmdline()) == ' '.join( - out.split('\n')[1].split()[2:] - ) - - def test_uids_gids(self): - out = sh(f"procstat -s {self.pid}") - euid, ruid, suid, egid, rgid, sgid = out.split('\n')[1].split()[2:8] - p = psutil.Process(self.pid) - uids = p.uids() - gids = p.gids() - assert uids.real == int(ruid) - assert uids.effective == int(euid) - assert uids.saved == int(suid) - assert gids.real == int(rgid) - assert gids.effective == int(egid) - assert gids.saved == int(sgid) - - @retry_on_failure() - def test_ctx_switches(self): - tested = [] - out = sh(f"procstat -r {self.pid}") - p = psutil.Process(self.pid) - for line in out.split('\n'): - line = line.lower().strip() - if ' voluntary context' in line: - pstat_value = int(line.split()[-1]) - psutil_value = p.num_ctx_switches().voluntary - assert pstat_value == psutil_value - tested.append(None) - elif ' involuntary context' in line: - pstat_value = int(line.split()[-1]) - psutil_value = p.num_ctx_switches().involuntary - assert pstat_value == psutil_value - tested.append(None) - if len(tested) != 2: - raise RuntimeError("couldn't find lines match in procstat out") - - @retry_on_failure() - def test_cpu_times(self): - tested = [] - out = sh(f"procstat -r {self.pid}") - p = psutil.Process(self.pid) - for line in out.split('\n'): - line = line.lower().strip() - if 'user time' in line: - pstat_value = float('0.' + line.split()[-1].split('.')[-1]) - psutil_value = p.cpu_times().user - assert pstat_value == psutil_value - tested.append(None) - elif 'system time' in line: - pstat_value = float('0.' + line.split()[-1].split('.')[-1]) - psutil_value = p.cpu_times().system - assert pstat_value == psutil_value - tested.append(None) - if len(tested) != 2: - raise RuntimeError("couldn't find lines match in procstat out") - - -@pytest.mark.skipif(not FREEBSD, reason="FREEBSD only") -class FreeBSDSystemTestCase(PsutilTestCase): - @staticmethod - def parse_swapinfo(): - # the last line is always the total - output = sh("swapinfo -k").splitlines()[-1] - parts = re.split(r'\s+', output) - - if not parts: - raise ValueError(f"Can't parse swapinfo: {output}") - - # the size is in 1k units, so multiply by 1024 - total, used, free = (int(p) * 1024 for p in parts[1:4]) - return total, used, free - - def test_cpu_frequency_against_sysctl(self): - # Currently only cpu 0 is frequency is supported in FreeBSD - # All other cores use the same frequency. - sensor = "dev.cpu.0.freq" - try: - sysctl_result = int(sysctl(sensor)) - except RuntimeError: - raise pytest.skip("frequencies not supported by kernel") - assert psutil.cpu_freq().current == sysctl_result - - sensor = "dev.cpu.0.freq_levels" - sysctl_result = sysctl(sensor) - # sysctl returns a string of the format: - # / /... - # Ordered highest available to lowest available. - max_freq = int(sysctl_result.split()[0].split("/")[0]) - min_freq = int(sysctl_result.split()[-1].split("/")[0]) - assert psutil.cpu_freq().max == max_freq - assert psutil.cpu_freq().min == min_freq - - # --- virtual_memory(); tests against sysctl - - @retry_on_failure() - def test_vmem_active(self): - syst = sysctl("vm.stats.vm.v_active_count") * PAGESIZE - assert abs(psutil.virtual_memory().active - syst) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_inactive(self): - syst = sysctl("vm.stats.vm.v_inactive_count") * PAGESIZE - assert abs(psutil.virtual_memory().inactive - syst) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_wired(self): - syst = sysctl("vm.stats.vm.v_wire_count") * PAGESIZE - assert abs(psutil.virtual_memory().wired - syst) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_cached(self): - syst = sysctl("vm.stats.vm.v_cache_count") * PAGESIZE - assert abs(psutil.virtual_memory().cached - syst) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_free(self): - syst = sysctl("vm.stats.vm.v_free_count") * PAGESIZE - assert abs(psutil.virtual_memory().free - syst) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_buffers(self): - syst = sysctl("vfs.bufspace") - assert abs(psutil.virtual_memory().buffers - syst) < TOLERANCE_SYS_MEM - - # --- virtual_memory(); tests against muse - - @pytest.mark.skipif(not MUSE_AVAILABLE, reason="muse not installed") - def test_muse_vmem_total(self): - num = muse('Total') - assert psutil.virtual_memory().total == num - - @pytest.mark.skipif(not MUSE_AVAILABLE, reason="muse not installed") - @retry_on_failure() - def test_muse_vmem_active(self): - num = muse('Active') - assert abs(psutil.virtual_memory().active - num) < TOLERANCE_SYS_MEM - - @pytest.mark.skipif(not MUSE_AVAILABLE, reason="muse not installed") - @retry_on_failure() - def test_muse_vmem_inactive(self): - num = muse('Inactive') - assert abs(psutil.virtual_memory().inactive - num) < TOLERANCE_SYS_MEM - - @pytest.mark.skipif(not MUSE_AVAILABLE, reason="muse not installed") - @retry_on_failure() - def test_muse_vmem_wired(self): - num = muse('Wired') - assert abs(psutil.virtual_memory().wired - num) < TOLERANCE_SYS_MEM - - @pytest.mark.skipif(not MUSE_AVAILABLE, reason="muse not installed") - @retry_on_failure() - def test_muse_vmem_cached(self): - num = muse('Cache') - assert abs(psutil.virtual_memory().cached - num) < TOLERANCE_SYS_MEM - - @pytest.mark.skipif(not MUSE_AVAILABLE, reason="muse not installed") - @retry_on_failure() - def test_muse_vmem_free(self): - num = muse('Free') - assert abs(psutil.virtual_memory().free - num) < TOLERANCE_SYS_MEM - - @pytest.mark.skipif(not MUSE_AVAILABLE, reason="muse not installed") - @retry_on_failure() - def test_muse_vmem_buffers(self): - num = muse('Buffer') - assert abs(psutil.virtual_memory().buffers - num) < TOLERANCE_SYS_MEM - - def test_cpu_stats_ctx_switches(self): - assert ( - abs( - psutil.cpu_stats().ctx_switches - - sysctl('vm.stats.sys.v_swtch') - ) - < 1000 - ) - - def test_cpu_stats_interrupts(self): - assert ( - abs(psutil.cpu_stats().interrupts - sysctl('vm.stats.sys.v_intr')) - < 1000 - ) - - def test_cpu_stats_soft_interrupts(self): - assert ( - abs( - psutil.cpu_stats().soft_interrupts - - sysctl('vm.stats.sys.v_soft') - ) - < 1000 - ) - - @retry_on_failure() - def test_cpu_stats_syscalls(self): - # pretty high tolerance but it looks like it's OK. - assert ( - abs(psutil.cpu_stats().syscalls - sysctl('vm.stats.sys.v_syscall')) - < 200000 - ) - - # def test_cpu_stats_traps(self): - # self.assertAlmostEqual(psutil.cpu_stats().traps, - # sysctl('vm.stats.sys.v_trap'), delta=1000) - - # --- swap memory - - def test_swapmem_free(self): - _total, _used, free = self.parse_swapinfo() - assert abs(psutil.swap_memory().free - free) < TOLERANCE_SYS_MEM - - def test_swapmem_used(self): - _total, used, _free = self.parse_swapinfo() - assert abs(psutil.swap_memory().used - used) < TOLERANCE_SYS_MEM - - def test_swapmem_total(self): - total, _used, _free = self.parse_swapinfo() - assert abs(psutil.swap_memory().total - total) < TOLERANCE_SYS_MEM - - # --- others - - def test_boot_time(self): - s = sysctl('sysctl kern.boottime') - s = s[s.find(" sec = ") + 7 :] - s = s[: s.find(',')] - btime = int(s) - assert btime == psutil.boot_time() - - # --- sensors_battery - - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_sensors_battery(self): - def secs2hours(secs): - m, _s = divmod(secs, 60) - h, m = divmod(m, 60) - return f"{int(h)}:{int(m):02}" - - out = sh("acpiconf -i 0") - fields = {x.split('\t')[0]: x.split('\t')[-1] for x in out.split("\n")} - metrics = psutil.sensors_battery() - percent = int(fields['Remaining capacity:'].replace('%', '')) - remaining_time = fields['Remaining time:'] - assert metrics.percent == percent - if remaining_time == 'unknown': - assert metrics.secsleft == psutil.POWER_TIME_UNLIMITED - else: - assert secs2hours(metrics.secsleft) == remaining_time - - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_sensors_battery_against_sysctl(self): - assert psutil.sensors_battery().percent == sysctl( - "hw.acpi.battery.life" - ) - assert psutil.sensors_battery().power_plugged == ( - sysctl("hw.acpi.acline") == 1 - ) - secsleft = psutil.sensors_battery().secsleft - if secsleft < 0: - assert sysctl("hw.acpi.battery.time") == -1 - else: - assert secsleft == sysctl("hw.acpi.battery.time") * 60 - - @pytest.mark.skipif(HAS_BATTERY, reason="has battery") - def test_sensors_battery_no_battery(self): - # If no battery is present one of these calls is supposed - # to fail, see: - # https://github.com/giampaolo/psutil/issues/1074 - with pytest.raises(RuntimeError): - sysctl("hw.acpi.battery.life") - sysctl("hw.acpi.battery.time") - sysctl("hw.acpi.acline") - assert psutil.sensors_battery() is None - - # --- sensors_temperatures - - def test_sensors_temperatures_against_sysctl(self): - num_cpus = psutil.cpu_count(True) - for cpu in range(num_cpus): - sensor = f"dev.cpu.{cpu}.temperature" - # sysctl returns a string in the format 46.0C - try: - sysctl_result = int(float(sysctl(sensor)[:-1])) - except RuntimeError: - raise pytest.skip("temperatures not supported by kernel") - assert ( - abs( - psutil.sensors_temperatures()["coretemp"][cpu].current - - sysctl_result - ) - < 10 - ) - - sensor = f"dev.cpu.{cpu}.coretemp.tjmax" - sysctl_result = int(float(sysctl(sensor)[:-1])) - assert ( - psutil.sensors_temperatures()["coretemp"][cpu].high - == sysctl_result - ) - - -# ===================================================================== -# --- OpenBSD -# ===================================================================== - - -@pytest.mark.skipif(not OPENBSD, reason="OPENBSD only") -class OpenBSDTestCase(PsutilTestCase): - def test_boot_time(self): - s = sysctl('kern.boottime') - sys_bt = datetime.datetime.strptime(s, "%a %b %d %H:%M:%S %Y") - psutil_bt = datetime.datetime.fromtimestamp(psutil.boot_time()) - assert sys_bt == psutil_bt - - -# ===================================================================== -# --- NetBSD -# ===================================================================== - - -@pytest.mark.skipif(not NETBSD, reason="NETBSD only") -class NetBSDTestCase(PsutilTestCase): - @staticmethod - def parse_meminfo(look_for): - with open('/proc/meminfo') as f: - for line in f: - if line.startswith(look_for): - return int(line.split()[1]) * 1024 - raise ValueError(f"can't find {look_for}") - - # --- virtual mem - - def test_vmem_total(self): - assert psutil.virtual_memory().total == self.parse_meminfo("MemTotal:") - - def test_vmem_free(self): - assert ( - abs(psutil.virtual_memory().free - self.parse_meminfo("MemFree:")) - < TOLERANCE_SYS_MEM - ) - - def test_vmem_buffers(self): - assert ( - abs( - psutil.virtual_memory().buffers - - self.parse_meminfo("Buffers:") - ) - < TOLERANCE_SYS_MEM - ) - - def test_vmem_shared(self): - assert ( - abs( - psutil.virtual_memory().shared - - self.parse_meminfo("MemShared:") - ) - < TOLERANCE_SYS_MEM - ) - - def test_vmem_cached(self): - assert ( - abs(psutil.virtual_memory().cached - self.parse_meminfo("Cached:")) - < TOLERANCE_SYS_MEM - ) - - # --- swap mem - - def test_swapmem_total(self): - assert ( - abs(psutil.swap_memory().total - self.parse_meminfo("SwapTotal:")) - < TOLERANCE_SYS_MEM - ) - - def test_swapmem_free(self): - assert ( - abs(psutil.swap_memory().free - self.parse_meminfo("SwapFree:")) - < TOLERANCE_SYS_MEM - ) - - def test_swapmem_used(self): - smem = psutil.swap_memory() - assert smem.used == smem.total - smem.free - - # --- others - - def test_cpu_stats_interrupts(self): - with open('/proc/stat', 'rb') as f: - for line in f: - if line.startswith(b'intr'): - interrupts = int(line.split()[1]) - break - else: - raise ValueError("couldn't find line") - assert abs(psutil.cpu_stats().interrupts - interrupts) < 1000 - - def test_cpu_stats_ctx_switches(self): - with open('/proc/stat', 'rb') as f: - for line in f: - if line.startswith(b'ctxt'): - ctx_switches = int(line.split()[1]) - break - else: - raise ValueError("couldn't find line") - assert abs(psutil.cpu_stats().ctx_switches - ctx_switches) < 1000 diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_connections.py b/PortablePython/Lib/site-packages/psutil/tests/test_connections.py deleted file mode 100644 index 5ddeb85..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_connections.py +++ /dev/null @@ -1,566 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for psutil.net_connections() and Process.net_connections() APIs.""" - -import os -import socket -import textwrap -from contextlib import closing -from socket import AF_INET -from socket import AF_INET6 -from socket import SOCK_DGRAM -from socket import SOCK_STREAM - -import psutil -from psutil import FREEBSD -from psutil import LINUX -from psutil import MACOS -from psutil import NETBSD -from psutil import OPENBSD -from psutil import POSIX -from psutil import SUNOS -from psutil import WINDOWS -from psutil._common import supports_ipv6 -from psutil.tests import AF_UNIX -from psutil.tests import HAS_NET_CONNECTIONS_UNIX -from psutil.tests import SKIP_SYSCONS -from psutil.tests import PsutilTestCase -from psutil.tests import bind_socket -from psutil.tests import bind_unix_socket -from psutil.tests import check_connection_ntuple -from psutil.tests import create_sockets -from psutil.tests import filter_proc_net_connections -from psutil.tests import pytest -from psutil.tests import reap_children -from psutil.tests import retry_on_failure -from psutil.tests import skip_on_access_denied -from psutil.tests import tcp_socketpair -from psutil.tests import unix_socketpair -from psutil.tests import wait_for_file - - -SOCK_SEQPACKET = getattr(socket, "SOCK_SEQPACKET", object()) - - -def this_proc_net_connections(kind): - cons = psutil.Process().net_connections(kind=kind) - if kind in {"all", "unix"}: - return filter_proc_net_connections(cons) - return cons - - -@pytest.mark.xdist_group(name="serial") -class ConnectionTestCase(PsutilTestCase): - def setUp(self): - assert this_proc_net_connections(kind='all') == [] - - def tearDown(self): - # Make sure we closed all resources. - assert this_proc_net_connections(kind='all') == [] - - def compare_procsys_connections(self, pid, proc_cons, kind='all'): - """Given a process PID and its list of connections compare - those against system-wide connections retrieved via - psutil.net_connections. - """ - try: - sys_cons = psutil.net_connections(kind=kind) - except psutil.AccessDenied: - # On MACOS, system-wide connections are retrieved by iterating - # over all processes - if MACOS: - return - else: - raise - # Filter for this proc PID and exlucde PIDs from the tuple. - sys_cons = [c[:-1] for c in sys_cons if c.pid == pid] - sys_cons.sort() - proc_cons.sort() - assert proc_cons == sys_cons - - -class TestBasicOperations(ConnectionTestCase): - @pytest.mark.skipif(SKIP_SYSCONS, reason="requires root") - def test_system(self): - with create_sockets(): - for conn in psutil.net_connections(kind='all'): - check_connection_ntuple(conn) - - def test_process(self): - with create_sockets(): - for conn in this_proc_net_connections(kind='all'): - check_connection_ntuple(conn) - - def test_invalid_kind(self): - with pytest.raises(ValueError): - this_proc_net_connections(kind='???') - with pytest.raises(ValueError): - psutil.net_connections(kind='???') - - -@pytest.mark.xdist_group(name="serial") -class TestUnconnectedSockets(ConnectionTestCase): - """Tests sockets which are open but not connected to anything.""" - - def get_conn_from_sock(self, sock): - cons = this_proc_net_connections(kind='all') - smap = {c.fd: c for c in cons} - if NETBSD or FREEBSD: - # NetBSD opens a UNIX socket to /var/log/run - # so there may be more connections. - return smap[sock.fileno()] - else: - assert len(cons) == 1 - if cons[0].fd != -1: - assert smap[sock.fileno()].fd == sock.fileno() - return cons[0] - - def check_socket(self, sock): - """Given a socket, makes sure it matches the one obtained - via psutil. It assumes this process created one connection - only (the one supposed to be checked). - """ - conn = self.get_conn_from_sock(sock) - check_connection_ntuple(conn) - - # fd, family, type - if conn.fd != -1: - assert conn.fd == sock.fileno() - assert conn.family == sock.family - # see: http://bugs.python.org/issue30204 - assert conn.type == sock.getsockopt(socket.SOL_SOCKET, socket.SO_TYPE) - - # local address - laddr = sock.getsockname() - if not laddr and isinstance(laddr, bytes): - # See: http://bugs.python.org/issue30205 - laddr = laddr.decode() - if sock.family == AF_INET6: - laddr = laddr[:2] - assert conn.laddr == laddr - - # XXX Solaris can't retrieve system-wide UNIX sockets - if sock.family == AF_UNIX and HAS_NET_CONNECTIONS_UNIX: - cons = this_proc_net_connections(kind='all') - self.compare_procsys_connections(os.getpid(), cons, kind='all') - return conn - - def test_tcp_v4(self): - addr = ("127.0.0.1", 0) - with closing(bind_socket(AF_INET, SOCK_STREAM, addr=addr)) as sock: - conn = self.check_socket(sock) - assert conn.raddr == () - assert conn.status == psutil.CONN_LISTEN - - @pytest.mark.skipif(not supports_ipv6(), reason="IPv6 not supported") - def test_tcp_v6(self): - addr = ("::1", 0) - with closing(bind_socket(AF_INET6, SOCK_STREAM, addr=addr)) as sock: - conn = self.check_socket(sock) - assert conn.raddr == () - assert conn.status == psutil.CONN_LISTEN - - def test_udp_v4(self): - addr = ("127.0.0.1", 0) - with closing(bind_socket(AF_INET, SOCK_DGRAM, addr=addr)) as sock: - conn = self.check_socket(sock) - assert conn.raddr == () - assert conn.status == psutil.CONN_NONE - - @pytest.mark.skipif(not supports_ipv6(), reason="IPv6 not supported") - def test_udp_v6(self): - addr = ("::1", 0) - with closing(bind_socket(AF_INET6, SOCK_DGRAM, addr=addr)) as sock: - conn = self.check_socket(sock) - assert conn.raddr == () - assert conn.status == psutil.CONN_NONE - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_unix_tcp(self): - testfn = self.get_testfn() - with closing(bind_unix_socket(testfn, type=SOCK_STREAM)) as sock: - conn = self.check_socket(sock) - assert conn.raddr == "" - assert conn.status == psutil.CONN_NONE - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_unix_udp(self): - testfn = self.get_testfn() - with closing(bind_unix_socket(testfn, type=SOCK_STREAM)) as sock: - conn = self.check_socket(sock) - assert conn.raddr == "" - assert conn.status == psutil.CONN_NONE - - -@pytest.mark.xdist_group(name="serial") -class TestConnectedSocket(ConnectionTestCase): - """Test socket pairs which are actually connected to - each other. - """ - - # On SunOS, even after we close() it, the server socket stays around - # in TIME_WAIT state. - @pytest.mark.skipif(SUNOS, reason="unreliable on SUONS") - def test_tcp(self): - addr = ("127.0.0.1", 0) - assert this_proc_net_connections(kind='tcp4') == [] - server, client = tcp_socketpair(AF_INET, addr=addr) - try: - cons = this_proc_net_connections(kind='tcp4') - assert len(cons) == 2 - assert cons[0].status == psutil.CONN_ESTABLISHED - assert cons[1].status == psutil.CONN_ESTABLISHED - # May not be fast enough to change state so it stays - # commenteed. - # client.close() - # cons = this_proc_net_connections(kind='all') - # self.assertEqual(len(cons), 1) - # self.assertEqual(cons[0].status, psutil.CONN_CLOSE_WAIT) - finally: - server.close() - client.close() - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_unix(self): - testfn = self.get_testfn() - server, client = unix_socketpair(testfn) - try: - cons = this_proc_net_connections(kind='unix') - assert not (cons[0].laddr and cons[0].raddr), cons - assert not (cons[1].laddr and cons[1].raddr), cons - if NETBSD or FREEBSD: - # On NetBSD creating a UNIX socket will cause - # a UNIX connection to /var/run/log. - cons = [c for c in cons if c.raddr != '/var/run/log'] - assert len(cons) == 2 - if LINUX or FREEBSD or SUNOS or OPENBSD: - # remote path is never set - assert cons[0].raddr == "" - assert cons[1].raddr == "" - # one local address should though - assert testfn == (cons[0].laddr or cons[1].laddr) - else: - # On other systems either the laddr or raddr - # of both peers are set. - assert (cons[0].laddr or cons[1].laddr) == testfn - finally: - server.close() - client.close() - - -class TestFilters(ConnectionTestCase): - def test_filters(self): - def check(kind, families, types): - for conn in this_proc_net_connections(kind=kind): - assert conn.family in families - assert conn.type in types - if not SKIP_SYSCONS: - for conn in psutil.net_connections(kind=kind): - assert conn.family in families - assert conn.type in types - - with create_sockets(): - check( - 'all', - [AF_INET, AF_INET6, AF_UNIX], - [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET], - ) - check('inet', [AF_INET, AF_INET6], [SOCK_STREAM, SOCK_DGRAM]) - check('inet4', [AF_INET], [SOCK_STREAM, SOCK_DGRAM]) - check('tcp', [AF_INET, AF_INET6], [SOCK_STREAM]) - check('tcp4', [AF_INET], [SOCK_STREAM]) - check('tcp6', [AF_INET6], [SOCK_STREAM]) - check('udp', [AF_INET, AF_INET6], [SOCK_DGRAM]) - check('udp4', [AF_INET], [SOCK_DGRAM]) - check('udp6', [AF_INET6], [SOCK_DGRAM]) - if HAS_NET_CONNECTIONS_UNIX: - check( - 'unix', - [AF_UNIX], - [SOCK_STREAM, SOCK_DGRAM, SOCK_SEQPACKET], - ) - - @skip_on_access_denied(only_if=MACOS) - def test_combos(self): - reap_children() - - def check_conn(proc, conn, family, type, laddr, raddr, status, kinds): - all_kinds = ( - "all", - "inet", - "inet4", - "inet6", - "tcp", - "tcp4", - "tcp6", - "udp", - "udp4", - "udp6", - ) - check_connection_ntuple(conn) - assert conn.family == family - assert conn.type == type - assert conn.laddr == laddr - assert conn.raddr == raddr - assert conn.status == status - for kind in all_kinds: - cons = proc.net_connections(kind=kind) - if kind in kinds: - assert cons != [] - else: - assert cons == [] - # compare against system-wide connections - # XXX Solaris can't retrieve system-wide UNIX - # sockets. - if HAS_NET_CONNECTIONS_UNIX: - self.compare_procsys_connections(proc.pid, [conn]) - - tcp_template = textwrap.dedent(""" - import socket, time - s = socket.socket({family}, socket.SOCK_STREAM) - s.bind(('{addr}', 0)) - s.listen(5) - with open('{testfn}', 'w') as f: - f.write(str(s.getsockname()[:2])) - [time.sleep(0.1) for x in range(100)] - """) - - udp_template = textwrap.dedent(""" - import socket, time - s = socket.socket({family}, socket.SOCK_DGRAM) - s.bind(('{addr}', 0)) - with open('{testfn}', 'w') as f: - f.write(str(s.getsockname()[:2])) - [time.sleep(0.1) for x in range(100)] - """) - - # must be relative on Windows - testfile = os.path.basename(self.get_testfn(dir=os.getcwd())) - tcp4_template = tcp_template.format( - family=int(AF_INET), addr="127.0.0.1", testfn=testfile - ) - udp4_template = udp_template.format( - family=int(AF_INET), addr="127.0.0.1", testfn=testfile - ) - tcp6_template = tcp_template.format( - family=int(AF_INET6), addr="::1", testfn=testfile - ) - udp6_template = udp_template.format( - family=int(AF_INET6), addr="::1", testfn=testfile - ) - - # launch various subprocess instantiating a socket of various - # families and types to enrich psutil results - tcp4_proc = self.pyrun(tcp4_template) - tcp4_addr = eval(wait_for_file(testfile, delete=True)) - udp4_proc = self.pyrun(udp4_template) - udp4_addr = eval(wait_for_file(testfile, delete=True)) - if supports_ipv6(): - tcp6_proc = self.pyrun(tcp6_template) - tcp6_addr = eval(wait_for_file(testfile, delete=True)) - udp6_proc = self.pyrun(udp6_template) - udp6_addr = eval(wait_for_file(testfile, delete=True)) - else: - tcp6_proc = None - udp6_proc = None - tcp6_addr = None - udp6_addr = None - - for p in psutil.Process().children(): - cons = p.net_connections() - assert len(cons) == 1 - for conn in cons: - # TCP v4 - if p.pid == tcp4_proc.pid: - check_conn( - p, - conn, - AF_INET, - SOCK_STREAM, - tcp4_addr, - (), - psutil.CONN_LISTEN, - ("all", "inet", "inet4", "tcp", "tcp4"), - ) - # UDP v4 - elif p.pid == udp4_proc.pid: - check_conn( - p, - conn, - AF_INET, - SOCK_DGRAM, - udp4_addr, - (), - psutil.CONN_NONE, - ("all", "inet", "inet4", "udp", "udp4"), - ) - # TCP v6 - elif p.pid == getattr(tcp6_proc, "pid", None): - check_conn( - p, - conn, - AF_INET6, - SOCK_STREAM, - tcp6_addr, - (), - psutil.CONN_LISTEN, - ("all", "inet", "inet6", "tcp", "tcp6"), - ) - # UDP v6 - elif p.pid == getattr(udp6_proc, "pid", None): - check_conn( - p, - conn, - AF_INET6, - SOCK_DGRAM, - udp6_addr, - (), - psutil.CONN_NONE, - ("all", "inet", "inet6", "udp", "udp6"), - ) - - def test_count(self): - with create_sockets(): - # tcp - cons = this_proc_net_connections(kind='tcp') - assert len(cons) == (2 if supports_ipv6() else 1) - for conn in cons: - assert conn.family in {AF_INET, AF_INET6} - assert conn.type == SOCK_STREAM - # tcp4 - cons = this_proc_net_connections(kind='tcp4') - assert len(cons) == 1 - assert cons[0].family == AF_INET - assert cons[0].type == SOCK_STREAM - # tcp6 - if supports_ipv6(): - cons = this_proc_net_connections(kind='tcp6') - assert len(cons) == 1 - assert cons[0].family == AF_INET6 - assert cons[0].type == SOCK_STREAM - # udp - cons = this_proc_net_connections(kind='udp') - assert len(cons) == (2 if supports_ipv6() else 1) - for conn in cons: - assert conn.family in {AF_INET, AF_INET6} - assert conn.type == SOCK_DGRAM - # udp4 - cons = this_proc_net_connections(kind='udp4') - assert len(cons) == 1 - assert cons[0].family == AF_INET - assert cons[0].type == SOCK_DGRAM - # udp6 - if supports_ipv6(): - cons = this_proc_net_connections(kind='udp6') - assert len(cons) == 1 - assert cons[0].family == AF_INET6 - assert cons[0].type == SOCK_DGRAM - # inet - cons = this_proc_net_connections(kind='inet') - assert len(cons) == (4 if supports_ipv6() else 2) - for conn in cons: - assert conn.family in {AF_INET, AF_INET6} - assert conn.type in {SOCK_STREAM, SOCK_DGRAM} - # inet6 - if supports_ipv6(): - cons = this_proc_net_connections(kind='inet6') - assert len(cons) == 2 - for conn in cons: - assert conn.family == AF_INET6 - assert conn.type in {SOCK_STREAM, SOCK_DGRAM} - # Skipped on BSD becayse by default the Python process - # creates a UNIX socket to '/var/run/log'. - if HAS_NET_CONNECTIONS_UNIX and not (FREEBSD or NETBSD): - cons = this_proc_net_connections(kind='unix') - assert len(cons) == 3 - for conn in cons: - assert conn.family == AF_UNIX - assert conn.type in {SOCK_STREAM, SOCK_DGRAM} - - -@pytest.mark.skipif(SKIP_SYSCONS, reason="requires root") -class TestSystemWideConnections(ConnectionTestCase): - """Tests for net_connections().""" - - def test_it(self): - def check(cons, families, types_): - for conn in cons: - assert conn.family in families - if conn.family != AF_UNIX: - assert conn.type in types_ - check_connection_ntuple(conn) - - with create_sockets(): - from psutil._common import conn_tmap - - for kind, groups in conn_tmap.items(): - # XXX: SunOS does not retrieve UNIX sockets. - if kind == 'unix' and not HAS_NET_CONNECTIONS_UNIX: - continue - families, types_ = groups - cons = psutil.net_connections(kind) - assert len(cons) == len(set(cons)) - check(cons, families, types_) - - @retry_on_failure() - def test_multi_sockets_procs(self): - # Creates multiple sub processes, each creating different - # sockets. For each process check that proc.net_connections() - # and psutil.net_connections() return the same results. - # This is done mainly to check whether net_connections()'s - # pid is properly set, see: - # https://github.com/giampaolo/psutil/issues/1013 - with create_sockets() as socks: - expected = len(socks) - pids = [] - times = 10 - fnames = [] - for _ in range(times): - fname = self.get_testfn() - fnames.append(fname) - src = textwrap.dedent(f"""\ - import time, os - from psutil.tests import create_sockets - with create_sockets(): - with open(r'{fname}', 'w') as f: - f.write("hello") - [time.sleep(0.1) for x in range(100)] - """) - sproc = self.pyrun(src) - pids.append(sproc.pid) - - # sync - for fname in fnames: - wait_for_file(fname) - - syscons = [ - x for x in psutil.net_connections(kind='all') if x.pid in pids - ] - for pid in pids: - assert len([x for x in syscons if x.pid == pid]) == expected - p = psutil.Process(pid) - assert len(p.net_connections('all')) == expected - - -class TestMisc(PsutilTestCase): - def test_net_connection_constants(self): - ints = [] - strs = [] - for name in dir(psutil): - if name.startswith('CONN_'): - num = getattr(psutil, name) - str_ = str(num) - assert str_.isupper(), str_ - assert str not in strs - assert num not in ints - ints.append(num) - strs.append(str_) - if SUNOS: - psutil.CONN_IDLE # noqa: B018 - psutil.CONN_BOUND # noqa: B018 - if WINDOWS: - psutil.CONN_DELETE_TCB # noqa: B018 diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_contracts.py b/PortablePython/Lib/site-packages/psutil/tests/test_contracts.py deleted file mode 100644 index 55f3a5d..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_contracts.py +++ /dev/null @@ -1,325 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Contracts tests. These tests mainly check API sanity in terms of -returned types and APIs availability. -Some of these are duplicates of tests test_system.py and test_process.py. -""" - -import platform -import signal - -import psutil -from psutil import AIX -from psutil import FREEBSD -from psutil import LINUX -from psutil import MACOS -from psutil import NETBSD -from psutil import OPENBSD -from psutil import POSIX -from psutil import SUNOS -from psutil import WINDOWS -from psutil.tests import GITHUB_ACTIONS -from psutil.tests import HAS_CPU_FREQ -from psutil.tests import HAS_NET_IO_COUNTERS -from psutil.tests import HAS_SENSORS_FANS -from psutil.tests import HAS_SENSORS_TEMPERATURES -from psutil.tests import SKIP_SYSCONS -from psutil.tests import PsutilTestCase -from psutil.tests import create_sockets -from psutil.tests import enum -from psutil.tests import is_namedtuple -from psutil.tests import kernel_version -from psutil.tests import pytest - - -# =================================================================== -# --- APIs availability -# =================================================================== - -# Make sure code reflects what doc promises in terms of APIs -# availability. - - -class TestAvailConstantsAPIs(PsutilTestCase): - def test_PROCFS_PATH(self): - assert hasattr(psutil, "PROCFS_PATH") == (LINUX or SUNOS or AIX) - - def test_win_priority(self): - ae = self.assertEqual - ae(hasattr(psutil, "ABOVE_NORMAL_PRIORITY_CLASS"), WINDOWS) - ae(hasattr(psutil, "BELOW_NORMAL_PRIORITY_CLASS"), WINDOWS) - ae(hasattr(psutil, "HIGH_PRIORITY_CLASS"), WINDOWS) - ae(hasattr(psutil, "IDLE_PRIORITY_CLASS"), WINDOWS) - ae(hasattr(psutil, "NORMAL_PRIORITY_CLASS"), WINDOWS) - ae(hasattr(psutil, "REALTIME_PRIORITY_CLASS"), WINDOWS) - - def test_linux_ioprio_linux(self): - ae = self.assertEqual - ae(hasattr(psutil, "IOPRIO_CLASS_NONE"), LINUX) - ae(hasattr(psutil, "IOPRIO_CLASS_RT"), LINUX) - ae(hasattr(psutil, "IOPRIO_CLASS_BE"), LINUX) - ae(hasattr(psutil, "IOPRIO_CLASS_IDLE"), LINUX) - - def test_linux_ioprio_windows(self): - ae = self.assertEqual - ae(hasattr(psutil, "IOPRIO_HIGH"), WINDOWS) - ae(hasattr(psutil, "IOPRIO_NORMAL"), WINDOWS) - ae(hasattr(psutil, "IOPRIO_LOW"), WINDOWS) - ae(hasattr(psutil, "IOPRIO_VERYLOW"), WINDOWS) - - @pytest.mark.skipif( - GITHUB_ACTIONS and LINUX, - reason="unsupported on GITHUB_ACTIONS + LINUX", - ) - def test_rlimit(self): - ae = self.assertEqual - ae(hasattr(psutil, "RLIM_INFINITY"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_AS"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_CORE"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_CPU"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_DATA"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_FSIZE"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_MEMLOCK"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_NOFILE"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_NPROC"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_RSS"), LINUX or FREEBSD) - ae(hasattr(psutil, "RLIMIT_STACK"), LINUX or FREEBSD) - - ae(hasattr(psutil, "RLIMIT_LOCKS"), LINUX) - if POSIX: - if kernel_version() >= (2, 6, 8): - ae(hasattr(psutil, "RLIMIT_MSGQUEUE"), LINUX) - if kernel_version() >= (2, 6, 12): - ae(hasattr(psutil, "RLIMIT_NICE"), LINUX) - if kernel_version() >= (2, 6, 12): - ae(hasattr(psutil, "RLIMIT_RTPRIO"), LINUX) - if kernel_version() >= (2, 6, 25): - ae(hasattr(psutil, "RLIMIT_RTTIME"), LINUX) - if kernel_version() >= (2, 6, 8): - ae(hasattr(psutil, "RLIMIT_SIGPENDING"), LINUX) - - ae(hasattr(psutil, "RLIMIT_SWAP"), FREEBSD) - ae(hasattr(psutil, "RLIMIT_SBSIZE"), FREEBSD) - ae(hasattr(psutil, "RLIMIT_NPTS"), FREEBSD) - - -class TestAvailSystemAPIs(PsutilTestCase): - def test_win_service_iter(self): - assert hasattr(psutil, "win_service_iter") == WINDOWS - - def test_win_service_get(self): - assert hasattr(psutil, "win_service_get") == WINDOWS - - def test_cpu_freq(self): - assert hasattr(psutil, "cpu_freq") == ( - LINUX or MACOS or WINDOWS or FREEBSD or OPENBSD - ) - - def test_sensors_temperatures(self): - assert hasattr(psutil, "sensors_temperatures") == (LINUX or FREEBSD) - - def test_sensors_fans(self): - assert hasattr(psutil, "sensors_fans") == LINUX - - def test_battery(self): - assert hasattr(psutil, "sensors_battery") == ( - LINUX or WINDOWS or FREEBSD or MACOS - ) - - -class TestAvailProcessAPIs(PsutilTestCase): - def test_environ(self): - assert hasattr(psutil.Process, "environ") == ( - LINUX - or MACOS - or WINDOWS - or AIX - or SUNOS - or FREEBSD - or OPENBSD - or NETBSD - ) - - def test_uids(self): - assert hasattr(psutil.Process, "uids") == POSIX - - def test_gids(self): - assert hasattr(psutil.Process, "uids") == POSIX - - def test_terminal(self): - assert hasattr(psutil.Process, "terminal") == POSIX - - def test_ionice(self): - assert hasattr(psutil.Process, "ionice") == (LINUX or WINDOWS) - - @pytest.mark.skipif( - GITHUB_ACTIONS and LINUX, - reason="unsupported on GITHUB_ACTIONS + LINUX", - ) - def test_rlimit(self): - assert hasattr(psutil.Process, "rlimit") == (LINUX or FREEBSD) - - def test_io_counters(self): - hasit = hasattr(psutil.Process, "io_counters") - assert hasit == (not (MACOS or SUNOS)) - - def test_num_fds(self): - assert hasattr(psutil.Process, "num_fds") == POSIX - - def test_num_handles(self): - assert hasattr(psutil.Process, "num_handles") == WINDOWS - - def test_cpu_affinity(self): - assert hasattr(psutil.Process, "cpu_affinity") == ( - LINUX or WINDOWS or FREEBSD - ) - - def test_cpu_num(self): - assert hasattr(psutil.Process, "cpu_num") == ( - LINUX or FREEBSD or SUNOS - ) - - def test_memory_maps(self): - hasit = hasattr(psutil.Process, "memory_maps") - assert hasit == (not (OPENBSD or NETBSD or AIX or MACOS)) - - -# =================================================================== -# --- API types -# =================================================================== - - -class TestSystemAPITypes(PsutilTestCase): - """Check the return types of system related APIs. - https://github.com/giampaolo/psutil/issues/1039. - """ - - @classmethod - def setUpClass(cls): - cls.proc = psutil.Process() - - def assert_ntuple_of_nums(self, nt, type_=float, gezero=True): - assert is_namedtuple(nt) - for n in nt: - assert isinstance(n, type_) - if gezero: - assert n >= 0 - - def test_cpu_times(self): - self.assert_ntuple_of_nums(psutil.cpu_times()) - for nt in psutil.cpu_times(percpu=True): - self.assert_ntuple_of_nums(nt) - - def test_cpu_percent(self): - assert isinstance(psutil.cpu_percent(interval=None), float) - assert isinstance(psutil.cpu_percent(interval=0.00001), float) - - def test_cpu_times_percent(self): - self.assert_ntuple_of_nums(psutil.cpu_times_percent(interval=None)) - self.assert_ntuple_of_nums(psutil.cpu_times_percent(interval=0.0001)) - - def test_cpu_count(self): - assert isinstance(psutil.cpu_count(), int) - - # TODO: remove this once 1892 is fixed - @pytest.mark.skipif( - MACOS and platform.machine() == 'arm64', reason="skipped due to #1892" - ) - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - def test_cpu_freq(self): - if psutil.cpu_freq() is None: - raise pytest.skip("cpu_freq() returns None") - self.assert_ntuple_of_nums(psutil.cpu_freq(), type_=(float, int)) - - def test_disk_io_counters(self): - # Duplicate of test_system.py. Keep it anyway. - for k, v in psutil.disk_io_counters(perdisk=True).items(): - assert isinstance(k, str) - self.assert_ntuple_of_nums(v, type_=int) - - def test_disk_partitions(self): - # Duplicate of test_system.py. Keep it anyway. - for disk in psutil.disk_partitions(): - assert isinstance(disk.device, str) - assert isinstance(disk.mountpoint, str) - assert isinstance(disk.fstype, str) - assert isinstance(disk.opts, str) - - @pytest.mark.skipif(SKIP_SYSCONS, reason="requires root") - def test_net_connections(self): - with create_sockets(): - ret = psutil.net_connections('all') - assert len(ret) == len(set(ret)) - for conn in ret: - assert is_namedtuple(conn) - - def test_net_if_addrs(self): - # Duplicate of test_system.py. Keep it anyway. - for ifname, addrs in psutil.net_if_addrs().items(): - assert isinstance(ifname, str) - for addr in addrs: - assert isinstance(addr.family, enum.IntEnum) - assert isinstance(addr.address, str) - assert isinstance(addr.netmask, (str, type(None))) - assert isinstance(addr.broadcast, (str, type(None))) - - def test_net_if_stats(self): - # Duplicate of test_system.py. Keep it anyway. - for ifname, info in psutil.net_if_stats().items(): - assert isinstance(ifname, str) - assert isinstance(info.isup, bool) - assert isinstance(info.duplex, enum.IntEnum) - assert isinstance(info.speed, int) - assert isinstance(info.mtu, int) - - @pytest.mark.skipif(not HAS_NET_IO_COUNTERS, reason="not supported") - def test_net_io_counters(self): - # Duplicate of test_system.py. Keep it anyway. - for ifname in psutil.net_io_counters(pernic=True): - assert isinstance(ifname, str) - - @pytest.mark.skipif(not HAS_SENSORS_FANS, reason="not supported") - def test_sensors_fans(self): - # Duplicate of test_system.py. Keep it anyway. - for name, units in psutil.sensors_fans().items(): - assert isinstance(name, str) - for unit in units: - assert isinstance(unit.label, str) - assert isinstance(unit.current, (float, int, type(None))) - - @pytest.mark.skipif(not HAS_SENSORS_TEMPERATURES, reason="not supported") - def test_sensors_temperatures(self): - # Duplicate of test_system.py. Keep it anyway. - for name, units in psutil.sensors_temperatures().items(): - assert isinstance(name, str) - for unit in units: - assert isinstance(unit.label, str) - assert isinstance(unit.current, (float, int, type(None))) - assert isinstance(unit.high, (float, int, type(None))) - assert isinstance(unit.critical, (float, int, type(None))) - - def test_boot_time(self): - # Duplicate of test_system.py. Keep it anyway. - assert isinstance(psutil.boot_time(), float) - - def test_users(self): - # Duplicate of test_system.py. Keep it anyway. - for user in psutil.users(): - assert isinstance(user.name, str) - assert isinstance(user.terminal, (str, type(None))) - assert isinstance(user.host, (str, type(None))) - assert isinstance(user.pid, (int, type(None))) - - -class TestProcessWaitType(PsutilTestCase): - @pytest.mark.skipif(not POSIX, reason="not POSIX") - def test_negative_signal(self): - p = psutil.Process(self.spawn_testproc().pid) - p.terminate() - code = p.wait() - assert code == -signal.SIGTERM - assert isinstance(code, enum.IntEnum) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_linux.py b/PortablePython/Lib/site-packages/psutil/tests/test_linux.py deleted file mode 100644 index f4342d7..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_linux.py +++ /dev/null @@ -1,2292 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Linux specific tests.""" - - -import collections -import contextlib -import errno -import io -import os -import platform -import re -import shutil -import socket -import struct -import textwrap -import time -import warnings -from unittest import mock - -import psutil -from psutil import LINUX -from psutil.tests import AARCH64 -from psutil.tests import GITHUB_ACTIONS -from psutil.tests import GLOBAL_TIMEOUT -from psutil.tests import HAS_BATTERY -from psutil.tests import HAS_CPU_FREQ -from psutil.tests import HAS_GETLOADAVG -from psutil.tests import HAS_RLIMIT -from psutil.tests import PYPY -from psutil.tests import PYTEST_PARALLEL -from psutil.tests import TOLERANCE_DISK_USAGE -from psutil.tests import TOLERANCE_SYS_MEM -from psutil.tests import PsutilTestCase -from psutil.tests import ThreadTask -from psutil.tests import call_until -from psutil.tests import pytest -from psutil.tests import reload_module -from psutil.tests import retry_on_failure -from psutil.tests import safe_rmpath -from psutil.tests import sh -from psutil.tests import skip_on_not_implemented - - -if LINUX: - from psutil._pslinux import CLOCK_TICKS - from psutil._pslinux import RootFsDeviceFinder - from psutil._pslinux import calculate_avail_vmem - from psutil._pslinux import open_binary - - -HERE = os.path.abspath(os.path.dirname(__file__)) -SIOCGIFADDR = 0x8915 -SIOCGIFHWADDR = 0x8927 -SIOCGIFNETMASK = 0x891B -SIOCGIFBRDADDR = 0x8919 -if LINUX: - SECTOR_SIZE = 512 -# ===================================================================== -# --- utils -# ===================================================================== - - -def get_ipv4_address(ifname): - import fcntl - - ifname = bytes(ifname[:15], "ascii") - with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: - return socket.inet_ntoa( - fcntl.ioctl(s.fileno(), SIOCGIFADDR, struct.pack('256s', ifname))[ - 20:24 - ] - ) - - -def get_ipv4_netmask(ifname): - import fcntl - - ifname = bytes(ifname[:15], "ascii") - with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: - return socket.inet_ntoa( - fcntl.ioctl( - s.fileno(), SIOCGIFNETMASK, struct.pack('256s', ifname) - )[20:24] - ) - - -def get_ipv4_broadcast(ifname): - import fcntl - - ifname = bytes(ifname[:15], "ascii") - with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: - return socket.inet_ntoa( - fcntl.ioctl( - s.fileno(), SIOCGIFBRDADDR, struct.pack('256s', ifname) - )[20:24] - ) - - -def get_ipv6_addresses(ifname): - with open("/proc/net/if_inet6") as f: - all_fields = [] - for line in f: - fields = line.split() - if fields[-1] == ifname: - all_fields.append(fields) - - if len(all_fields) == 0: - raise ValueError(f"could not find interface {ifname!r}") - - for i in range(len(all_fields)): - unformatted = all_fields[i][0] - groups = [ - unformatted[j : j + 4] for j in range(0, len(unformatted), 4) - ] - formatted = ":".join(groups) - packed = socket.inet_pton(socket.AF_INET6, formatted) - all_fields[i] = socket.inet_ntop(socket.AF_INET6, packed) - return all_fields - - -def get_mac_address(ifname): - import fcntl - - ifname = bytes(ifname[:15], "ascii") - with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: - info = fcntl.ioctl( - s.fileno(), SIOCGIFHWADDR, struct.pack('256s', ifname) - ) - return "".join([f"{char:02x}:" for char in info[18:24]])[:-1] - - -def free_swap(): - """Parse 'free' cmd and return swap memory's s total, used and free - values. - """ - out = sh(["free", "-b"], env={"LANG": "C.UTF-8"}) - lines = out.split('\n') - for line in lines: - if line.startswith('Swap'): - _, total, used, free = line.split() - nt = collections.namedtuple('free', 'total used free') - return nt(int(total), int(used), int(free)) - raise ValueError(f"can't find 'Swap' in 'free' output:\n{out}") - - -def free_physmem(): - """Parse 'free' cmd and return physical memory's total, used - and free values. - """ - # Note: free can have 2 different formats, invalidating 'shared' - # and 'cached' memory which may have different positions so we - # do not return them. - # https://github.com/giampaolo/psutil/issues/538#issuecomment-57059946 - out = sh(["free", "-b"], env={"LANG": "C.UTF-8"}) - lines = out.split('\n') - for line in lines: - if line.startswith('Mem'): - total, used, free, shared = (int(x) for x in line.split()[1:5]) - nt = collections.namedtuple( - 'free', 'total used free shared output' - ) - return nt(total, used, free, shared, out) - raise ValueError(f"can't find 'Mem' in 'free' output:\n{out}") - - -def vmstat(stat): - out = sh(["vmstat", "-s"], env={"LANG": "C.UTF-8"}) - for line in out.split("\n"): - line = line.strip() - if stat in line: - return int(line.split(' ')[0]) - raise ValueError(f"can't find {stat!r} in 'vmstat' output") - - -def get_free_version_info(): - out = sh(["free", "-V"]).strip() - if 'UNKNOWN' in out: - raise pytest.skip("can't determine free version") - return tuple(map(int, re.findall(r'\d+', out.split()[-1]))) - - -@contextlib.contextmanager -def mock_open_content(pairs): - """Mock open() builtin and forces it to return a certain content - for a given path. `pairs` is a {"path": "content", ...} dict. - """ - - def open_mock(name, *args, **kwargs): - if name in pairs: - content = pairs[name] - if isinstance(content, str): - return io.StringIO(content) - else: - return io.BytesIO(content) - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", create=True, side_effect=open_mock) as m: - yield m - - -@contextlib.contextmanager -def mock_open_exception(for_path, exc): - """Mock open() builtin and raises `exc` if the path being opened - matches `for_path`. - """ - - def open_mock(name, *args, **kwargs): - if name == for_path: - raise exc - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", create=True, side_effect=open_mock) as m: - yield m - - -# ===================================================================== -# --- system virtual memory -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemVirtualMemoryAgainstFree(PsutilTestCase): - def test_total(self): - cli_value = free_physmem().total - psutil_value = psutil.virtual_memory().total - assert cli_value == psutil_value - - @retry_on_failure() - def test_used(self): - # Older versions of procps used slab memory to calculate used memory. - # This got changed in: - # https://gitlab.com/procps-ng/procps/commit/ - # 05d751c4f076a2f0118b914c5e51cfbb4762ad8e - # Newer versions of procps are using yet another way to compute used - # memory. - # https://gitlab.com/procps-ng/procps/commit/ - # 2184e90d2e7cdb582f9a5b706b47015e56707e4d - if get_free_version_info() < (3, 3, 12): - raise pytest.skip("free version too old") - if get_free_version_info() >= (4, 0, 0): - raise pytest.skip("free version too recent") - cli_value = free_physmem().used - psutil_value = psutil.virtual_memory().used - assert abs(cli_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_free(self): - cli_value = free_physmem().free - psutil_value = psutil.virtual_memory().free - assert abs(cli_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_shared(self): - free = free_physmem() - free_value = free.shared - if free_value == 0: - raise pytest.skip("free does not support 'shared' column") - psutil_value = psutil.virtual_memory().shared - assert ( - abs(free_value - psutil_value) < TOLERANCE_SYS_MEM - ), f"{free_value} {psutil_value} \n{free.output}" - - @retry_on_failure() - def test_available(self): - # "free" output format has changed at some point: - # https://github.com/giampaolo/psutil/issues/538#issuecomment-147192098 - out = sh(["free", "-b"]) - lines = out.split('\n') - if 'available' not in lines[0]: - raise pytest.skip("free does not support 'available' column") - free_value = int(lines[1].split()[-1]) - psutil_value = psutil.virtual_memory().available - assert abs(free_value - psutil_value) < TOLERANCE_SYS_MEM - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemVirtualMemoryAgainstVmstat(PsutilTestCase): - def test_total(self): - vmstat_value = vmstat('total memory') * 1024 - psutil_value = psutil.virtual_memory().total - assert abs(vmstat_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_used(self): - # Older versions of procps used slab memory to calculate used memory. - # This got changed in: - # https://gitlab.com/procps-ng/procps/commit/ - # 05d751c4f076a2f0118b914c5e51cfbb4762ad8e - # Newer versions of procps are using yet another way to compute used - # memory. - # https://gitlab.com/procps-ng/procps/commit/ - # 2184e90d2e7cdb582f9a5b706b47015e56707e4d - if get_free_version_info() < (3, 3, 12): - raise pytest.skip("free version too old") - if get_free_version_info() >= (4, 0, 0): - raise pytest.skip("free version too recent") - vmstat_value = vmstat('used memory') * 1024 - psutil_value = psutil.virtual_memory().used - assert abs(vmstat_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_free(self): - vmstat_value = vmstat('free memory') * 1024 - psutil_value = psutil.virtual_memory().free - assert abs(vmstat_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_buffers(self): - vmstat_value = vmstat('buffer memory') * 1024 - psutil_value = psutil.virtual_memory().buffers - assert abs(vmstat_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_active(self): - vmstat_value = vmstat('active memory') * 1024 - psutil_value = psutil.virtual_memory().active - assert abs(vmstat_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_inactive(self): - vmstat_value = vmstat('inactive memory') * 1024 - psutil_value = psutil.virtual_memory().inactive - assert abs(vmstat_value - psutil_value) < TOLERANCE_SYS_MEM - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemVirtualMemoryMocks(PsutilTestCase): - def test_warnings_on_misses(self): - # Emulate a case where /proc/meminfo provides few info. - # psutil is supposed to set the missing fields to 0 and - # raise a warning. - content = textwrap.dedent("""\ - Active(anon): 6145416 kB - Active(file): 2950064 kB - Inactive(anon): 574764 kB - Inactive(file): 1567648 kB - MemAvailable: -1 kB - MemFree: 2057400 kB - MemTotal: 16325648 kB - SReclaimable: 346648 kB - """).encode() - with mock_open_content({'/proc/meminfo': content}) as m: - with warnings.catch_warnings(record=True) as ws: - warnings.simplefilter("always") - ret = psutil.virtual_memory() - assert m.called - assert len(ws) == 1 - w = ws[0] - assert "memory stats couldn't be determined" in str(w.message) - assert "cached" in str(w.message) - assert "shared" in str(w.message) - assert "active" in str(w.message) - assert "inactive" in str(w.message) - assert "buffers" in str(w.message) - assert "available" in str(w.message) - assert ret.cached == 0 - assert ret.active == 0 - assert ret.inactive == 0 - assert ret.shared == 0 - assert ret.buffers == 0 - assert ret.available == 0 - assert ret.slab == 0 - - @retry_on_failure() - def test_avail_old_percent(self): - # Make sure that our calculation of avail mem for old kernels - # is off by max 15%. - mems = {} - with open_binary('/proc/meminfo') as f: - for line in f: - fields = line.split() - mems[fields[0]] = int(fields[1]) * 1024 - - a = calculate_avail_vmem(mems) - if b'MemAvailable:' in mems: - b = mems[b'MemAvailable:'] - diff_percent = abs(a - b) / a * 100 - assert diff_percent < 15 - - def test_avail_old_comes_from_kernel(self): - # Make sure "MemAvailable:" coluimn is used instead of relying - # on our internal algorithm to calculate avail mem. - content = textwrap.dedent("""\ - Active: 9444728 kB - Active(anon): 6145416 kB - Active(file): 2950064 kB - Buffers: 287952 kB - Cached: 4818144 kB - Inactive(file): 1578132 kB - Inactive(anon): 574764 kB - Inactive(file): 1567648 kB - MemAvailable: 6574984 kB - MemFree: 2057400 kB - MemTotal: 16325648 kB - Shmem: 577588 kB - SReclaimable: 346648 kB - """).encode() - with mock_open_content({'/proc/meminfo': content}) as m: - with warnings.catch_warnings(record=True) as ws: - ret = psutil.virtual_memory() - assert m.called - assert ret.available == 6574984 * 1024 - w = ws[0] - assert "inactive memory stats couldn't be determined" in str( - w.message - ) - - def test_avail_old_missing_fields(self): - # Remove Active(file), Inactive(file) and SReclaimable - # from /proc/meminfo and make sure the fallback is used - # (free + cached), - content = textwrap.dedent("""\ - Active: 9444728 kB - Active(anon): 6145416 kB - Buffers: 287952 kB - Cached: 4818144 kB - Inactive(file): 1578132 kB - Inactive(anon): 574764 kB - MemFree: 2057400 kB - MemTotal: 16325648 kB - Shmem: 577588 kB - """).encode() - with mock_open_content({"/proc/meminfo": content}) as m: - with warnings.catch_warnings(record=True) as ws: - ret = psutil.virtual_memory() - assert m.called - assert ret.available == 2057400 * 1024 + 4818144 * 1024 - w = ws[0] - assert "inactive memory stats couldn't be determined" in str( - w.message - ) - - def test_avail_old_missing_zoneinfo(self): - # Remove /proc/zoneinfo file. Make sure fallback is used - # (free + cached). - content = textwrap.dedent("""\ - Active: 9444728 kB - Active(anon): 6145416 kB - Active(file): 2950064 kB - Buffers: 287952 kB - Cached: 4818144 kB - Inactive(file): 1578132 kB - Inactive(anon): 574764 kB - Inactive(file): 1567648 kB - MemFree: 2057400 kB - MemTotal: 16325648 kB - Shmem: 577588 kB - SReclaimable: 346648 kB - """).encode() - with mock_open_content({"/proc/meminfo": content}): - with mock_open_exception("/proc/zoneinfo", FileNotFoundError): - with warnings.catch_warnings(record=True) as ws: - ret = psutil.virtual_memory() - assert ret.available == 2057400 * 1024 + 4818144 * 1024 - w = ws[0] - assert ( - "inactive memory stats couldn't be determined" - in str(w.message) - ) - - def test_virtual_memory_mocked(self): - # Emulate /proc/meminfo because neither vmstat nor free return slab. - content = textwrap.dedent("""\ - MemTotal: 100 kB - MemFree: 2 kB - MemAvailable: 3 kB - Buffers: 4 kB - Cached: 5 kB - SwapCached: 6 kB - Active: 7 kB - Inactive: 8 kB - Active(anon): 9 kB - Inactive(anon): 10 kB - Active(file): 11 kB - Inactive(file): 12 kB - Unevictable: 13 kB - Mlocked: 14 kB - SwapTotal: 15 kB - SwapFree: 16 kB - Dirty: 17 kB - Writeback: 18 kB - AnonPages: 19 kB - Mapped: 20 kB - Shmem: 21 kB - Slab: 22 kB - SReclaimable: 23 kB - SUnreclaim: 24 kB - KernelStack: 25 kB - PageTables: 26 kB - NFS_Unstable: 27 kB - Bounce: 28 kB - WritebackTmp: 29 kB - CommitLimit: 30 kB - Committed_AS: 31 kB - VmallocTotal: 32 kB - VmallocUsed: 33 kB - VmallocChunk: 34 kB - HardwareCorrupted: 35 kB - AnonHugePages: 36 kB - ShmemHugePages: 37 kB - ShmemPmdMapped: 38 kB - CmaTotal: 39 kB - CmaFree: 40 kB - HugePages_Total: 41 kB - HugePages_Free: 42 kB - HugePages_Rsvd: 43 kB - HugePages_Surp: 44 kB - Hugepagesize: 45 kB - DirectMap46k: 46 kB - DirectMap47M: 47 kB - DirectMap48G: 48 kB - """).encode() - with mock_open_content({"/proc/meminfo": content}) as m: - mem = psutil.virtual_memory() - assert m.called - assert mem.total == 100 * 1024 - assert mem.free == 2 * 1024 - assert mem.buffers == 4 * 1024 - # cached mem also includes reclaimable memory - assert mem.cached == (5 + 23) * 1024 - assert mem.shared == 21 * 1024 - assert mem.active == 7 * 1024 - assert mem.inactive == 8 * 1024 - assert mem.slab == 22 * 1024 - assert mem.available == 3 * 1024 - - -# ===================================================================== -# --- system swap memory -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemSwapMemory(PsutilTestCase): - @staticmethod - def meminfo_has_swap_info(): - """Return True if /proc/meminfo provides swap metrics.""" - with open("/proc/meminfo") as f: - data = f.read() - return 'SwapTotal:' in data and 'SwapFree:' in data - - def test_total(self): - free_value = free_swap().total - psutil_value = psutil.swap_memory().total - assert abs(free_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_used(self): - free_value = free_swap().used - psutil_value = psutil.swap_memory().used - assert abs(free_value - psutil_value) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_free(self): - free_value = free_swap().free - psutil_value = psutil.swap_memory().free - assert abs(free_value - psutil_value) < TOLERANCE_SYS_MEM - - def test_missing_sin_sout(self): - with mock.patch('psutil._common.open', create=True) as m: - with warnings.catch_warnings(record=True) as ws: - warnings.simplefilter("always") - ret = psutil.swap_memory() - assert m.called - assert len(ws) == 1 - w = ws[0] - assert ( - "'sin' and 'sout' swap memory stats couldn't be determined" - in str(w.message) - ) - assert ret.sin == 0 - assert ret.sout == 0 - - def test_no_vmstat_mocked(self): - # see https://github.com/giampaolo/psutil/issues/722 - with mock_open_exception("/proc/vmstat", FileNotFoundError) as m: - with warnings.catch_warnings(record=True) as ws: - warnings.simplefilter("always") - ret = psutil.swap_memory() - assert m.called - assert len(ws) == 1 - w = ws[0] - assert ( - "'sin' and 'sout' swap memory stats couldn't " - "be determined and were set to 0" - in str(w.message) - ) - assert ret.sin == 0 - assert ret.sout == 0 - - def test_meminfo_against_sysinfo(self): - # Make sure the content of /proc/meminfo about swap memory - # matches sysinfo() syscall, see: - # https://github.com/giampaolo/psutil/issues/1015 - if not self.meminfo_has_swap_info(): - raise pytest.skip("/proc/meminfo has no swap metrics") - with mock.patch('psutil._pslinux.cext.linux_sysinfo') as m: - swap = psutil.swap_memory() - assert not m.called - import psutil._psutil_linux as cext - - _, _, _, _, total, free, unit_multiplier = cext.linux_sysinfo() - total *= unit_multiplier - free *= unit_multiplier - assert swap.total == total - assert abs(swap.free - free) < TOLERANCE_SYS_MEM - - def test_emulate_meminfo_has_no_metrics(self): - # Emulate a case where /proc/meminfo provides no swap metrics - # in which case sysinfo() syscall is supposed to be used - # as a fallback. - with mock_open_content({"/proc/meminfo": b""}) as m: - psutil.swap_memory() - assert m.called - - -# ===================================================================== -# --- system CPU -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemCPUTimes(PsutilTestCase): - def test_fields(self): - fields = psutil.cpu_times()._fields - kernel_ver = re.findall(r'\d+\.\d+\.\d+', os.uname()[2])[0] - kernel_ver_info = tuple(map(int, kernel_ver.split('.'))) - if kernel_ver_info >= (2, 6, 11): - assert 'steal' in fields - else: - assert 'steal' not in fields - if kernel_ver_info >= (2, 6, 24): - assert 'guest' in fields - else: - assert 'guest' not in fields - if kernel_ver_info >= (3, 2, 0): - assert 'guest_nice' in fields - else: - assert 'guest_nice' not in fields - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemCPUCountLogical(PsutilTestCase): - @pytest.mark.skipif( - not os.path.exists("/sys/devices/system/cpu/online"), - reason="/sys/devices/system/cpu/online does not exist", - ) - def test_against_sysdev_cpu_online(self): - with open("/sys/devices/system/cpu/online") as f: - value = f.read().strip() - if "-" in str(value): - value = int(value.split('-')[1]) + 1 - assert psutil.cpu_count() == value - - @pytest.mark.skipif( - not os.path.exists("/sys/devices/system/cpu"), - reason="/sys/devices/system/cpu does not exist", - ) - def test_against_sysdev_cpu_num(self): - ls = os.listdir("/sys/devices/system/cpu") - count = len([x for x in ls if re.search(r"cpu\d+$", x) is not None]) - assert psutil.cpu_count() == count - - @pytest.mark.skipif( - not shutil.which("nproc"), reason="nproc utility not available" - ) - def test_against_nproc(self): - num = int(sh("nproc --all")) - assert psutil.cpu_count(logical=True) == num - - @pytest.mark.skipif( - not shutil.which("lscpu"), reason="lscpu utility not available" - ) - def test_against_lscpu(self): - out = sh("lscpu -p") - num = len([x for x in out.split('\n') if not x.startswith('#')]) - assert psutil.cpu_count(logical=True) == num - - def test_emulate_fallbacks(self): - import psutil._pslinux - - original = psutil._pslinux.cpu_count_logical() - # Here we want to mock os.sysconf("SC_NPROCESSORS_ONLN") in - # order to cause the parsing of /proc/cpuinfo and /proc/stat. - with mock.patch( - 'psutil._pslinux.os.sysconf', side_effect=ValueError - ) as m: - assert psutil._pslinux.cpu_count_logical() == original - assert m.called - - # Let's have open() return empty data and make sure None is - # returned ('cause we mimic os.cpu_count()). - with mock.patch('psutil._common.open', create=True) as m: - assert psutil._pslinux.cpu_count_logical() is None - assert m.call_count == 2 - # /proc/stat should be the last one - assert m.call_args[0][0] == '/proc/stat' - - # Let's push this a bit further and make sure /proc/cpuinfo - # parsing works as expected. - with open('/proc/cpuinfo', 'rb') as f: - cpuinfo_data = f.read() - fake_file = io.BytesIO(cpuinfo_data) - with mock.patch( - 'psutil._common.open', return_value=fake_file, create=True - ) as m: - assert psutil._pslinux.cpu_count_logical() == original - - # Finally, let's make /proc/cpuinfo return meaningless data; - # this way we'll fall back on relying on /proc/stat - with mock_open_content({"/proc/cpuinfo": b""}) as m: - assert psutil._pslinux.cpu_count_logical() == original - assert m.called - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemCPUCountCores(PsutilTestCase): - @pytest.mark.skipif( - not shutil.which("lscpu"), reason="lscpu utility not available" - ) - def test_against_lscpu(self): - out = sh("lscpu -p") - core_ids = set() - for line in out.split('\n'): - if not line.startswith('#'): - fields = line.split(',') - core_ids.add(fields[1]) - assert psutil.cpu_count(logical=False) == len(core_ids) - - @pytest.mark.skipif( - platform.machine() not in {"x86_64", "i686"}, reason="x86_64/i686 only" - ) - def test_method_2(self): - meth_1 = psutil._pslinux.cpu_count_cores() - with mock.patch('glob.glob', return_value=[]) as m: - meth_2 = psutil._pslinux.cpu_count_cores() - assert m.called - if meth_1 is not None: - assert meth_1 == meth_2 - - def test_emulate_none(self): - with mock.patch('glob.glob', return_value=[]) as m1: - with mock.patch('psutil._common.open', create=True) as m2: - assert psutil._pslinux.cpu_count_cores() is None - assert m1.called - assert m2.called - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemCPUFrequency(PsutilTestCase): - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - @pytest.mark.skipif( - AARCH64, reason="aarch64 does not always expose frequency" - ) - def test_emulate_use_second_file(self): - # https://github.com/giampaolo/psutil/issues/981 - def path_exists_mock(path): - if path.startswith("/sys/devices/system/cpu/cpufreq/policy"): - return False - else: - return orig_exists(path) - - orig_exists = os.path.exists - with mock.patch( - "os.path.exists", side_effect=path_exists_mock, create=True - ): - assert psutil.cpu_freq() - - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - @pytest.mark.skipif( - AARCH64, reason="aarch64 does not report mhz in /proc/cpuinfo" - ) - def test_emulate_use_cpuinfo(self): - # Emulate a case where /sys/devices/system/cpu/cpufreq* does not - # exist and /proc/cpuinfo is used instead. - def path_exists_mock(path): - if path.startswith('/sys/devices/system/cpu/'): - return False - else: - return os_path_exists(path) - - os_path_exists = os.path.exists - try: - with mock.patch("os.path.exists", side_effect=path_exists_mock): - reload_module(psutil._pslinux) - ret = psutil.cpu_freq() - assert ret, ret - assert ret.max == 0.0 - assert ret.min == 0.0 - for freq in psutil.cpu_freq(percpu=True): - assert freq.max == 0.0 - assert freq.min == 0.0 - finally: - reload_module(psutil._pslinux) - reload_module(psutil) - - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - def test_emulate_data(self): - def open_mock(name, *args, **kwargs): - if name.endswith('/scaling_cur_freq') and name.startswith( - "/sys/devices/system/cpu/cpufreq/policy" - ): - return io.BytesIO(b"500000") - elif name.endswith('/scaling_min_freq') and name.startswith( - "/sys/devices/system/cpu/cpufreq/policy" - ): - return io.BytesIO(b"600000") - elif name.endswith('/scaling_max_freq') and name.startswith( - "/sys/devices/system/cpu/cpufreq/policy" - ): - return io.BytesIO(b"700000") - elif name == '/proc/cpuinfo': - return io.BytesIO(b"cpu MHz : 500") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock): - with mock.patch('os.path.exists', return_value=True): - freq = psutil.cpu_freq() - assert freq.current == 500.0 - # when /proc/cpuinfo is used min and max frequencies are not - # available and are set to 0. - if freq.min != 0.0: - assert freq.min == 600.0 - if freq.max != 0.0: - assert freq.max == 700.0 - - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - def test_emulate_multi_cpu(self): - def open_mock(name, *args, **kwargs): - n = name - if n.endswith('/scaling_cur_freq') and n.startswith( - "/sys/devices/system/cpu/cpufreq/policy0" - ): - return io.BytesIO(b"100000") - elif n.endswith('/scaling_min_freq') and n.startswith( - "/sys/devices/system/cpu/cpufreq/policy0" - ): - return io.BytesIO(b"200000") - elif n.endswith('/scaling_max_freq') and n.startswith( - "/sys/devices/system/cpu/cpufreq/policy0" - ): - return io.BytesIO(b"300000") - elif n.endswith('/scaling_cur_freq') and n.startswith( - "/sys/devices/system/cpu/cpufreq/policy1" - ): - return io.BytesIO(b"400000") - elif n.endswith('/scaling_min_freq') and n.startswith( - "/sys/devices/system/cpu/cpufreq/policy1" - ): - return io.BytesIO(b"500000") - elif n.endswith('/scaling_max_freq') and n.startswith( - "/sys/devices/system/cpu/cpufreq/policy1" - ): - return io.BytesIO(b"600000") - elif name == '/proc/cpuinfo': - return io.BytesIO(b"cpu MHz : 100\ncpu MHz : 400") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock): - with mock.patch('os.path.exists', return_value=True): - with mock.patch( - 'psutil._pslinux.cpu_count_logical', return_value=2 - ): - freq = psutil.cpu_freq(percpu=True) - assert freq[0].current == 100.0 - if freq[0].min != 0.0: - assert freq[0].min == 200.0 - if freq[0].max != 0.0: - assert freq[0].max == 300.0 - assert freq[1].current == 400.0 - if freq[1].min != 0.0: - assert freq[1].min == 500.0 - if freq[1].max != 0.0: - assert freq[1].max == 600.0 - - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - def test_emulate_no_scaling_cur_freq_file(self): - # See: https://github.com/giampaolo/psutil/issues/1071 - def open_mock(name, *args, **kwargs): - if name.endswith('/scaling_cur_freq'): - raise FileNotFoundError - if name.endswith('/cpuinfo_cur_freq'): - return io.BytesIO(b"200000") - elif name == '/proc/cpuinfo': - return io.BytesIO(b"cpu MHz : 200") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock): - with mock.patch('os.path.exists', return_value=True): - with mock.patch( - 'psutil._pslinux.cpu_count_logical', return_value=1 - ): - freq = psutil.cpu_freq() - assert freq.current == 200 - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemCPUStats(PsutilTestCase): - - # XXX: fails too often. - # def test_ctx_switches(self): - # vmstat_value = vmstat("context switches") - # psutil_value = psutil.cpu_stats().ctx_switches - # self.assertAlmostEqual(vmstat_value, psutil_value, delta=500) - - def test_interrupts(self): - vmstat_value = vmstat("interrupts") - psutil_value = psutil.cpu_stats().interrupts - assert abs(vmstat_value - psutil_value) < 500 - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestLoadAvg(PsutilTestCase): - @pytest.mark.skipif(not HAS_GETLOADAVG, reason="not supported") - def test_getloadavg(self): - psutil_value = psutil.getloadavg() - with open("/proc/loadavg") as f: - proc_value = f.read().split() - - assert abs(float(proc_value[0]) - psutil_value[0]) < 1 - assert abs(float(proc_value[1]) - psutil_value[1]) < 1 - assert abs(float(proc_value[2]) - psutil_value[2]) < 1 - - -# ===================================================================== -# --- system network -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemNetIfAddrs(PsutilTestCase): - def test_ips(self): - for name, addrs in psutil.net_if_addrs().items(): - for addr in addrs: - if addr.family == psutil.AF_LINK: - assert addr.address == get_mac_address(name) - elif addr.family == socket.AF_INET: - assert addr.address == get_ipv4_address(name) - assert addr.netmask == get_ipv4_netmask(name) - if addr.broadcast is not None: - assert addr.broadcast == get_ipv4_broadcast(name) - else: - assert get_ipv4_broadcast(name) == '0.0.0.0' - elif addr.family == socket.AF_INET6: - # IPv6 addresses can have a percent symbol at the end. - # E.g. these 2 are equivalent: - # "fe80::1ff:fe23:4567:890a" - # "fe80::1ff:fe23:4567:890a%eth0" - # That is the "zone id" portion, which usually is the name - # of the network interface. - address = addr.address.split('%')[0] - assert address in get_ipv6_addresses(name) - - # XXX - not reliable when having virtual NICs installed by Docker. - # @pytest.mark.skipif(not shutil.which("ip"), - # reason="'ip' utility not available") - # def test_net_if_names(self): - # out = sh("ip addr").strip() - # nics = [x for x in psutil.net_if_addrs().keys() if ':' not in x] - # found = 0 - # for line in out.split('\n'): - # line = line.strip() - # if re.search(r"^\d+:", line): - # found += 1 - # name = line.split(':')[1].strip() - # self.assertIn(name, nics) - # self.assertEqual(len(nics), found, msg="{}\n---\n{}".format( - # pprint.pformat(nics), out)) - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemNetIfStats(PsutilTestCase): - @pytest.mark.skipif( - not shutil.which("ifconfig"), reason="ifconfig utility not available" - ) - def test_against_ifconfig(self): - for name, stats in psutil.net_if_stats().items(): - try: - out = sh(f"ifconfig {name}") - except RuntimeError: - pass - else: - assert stats.isup == ('RUNNING' in out), out - assert stats.mtu == int( - re.findall(r'(?i)MTU[: ](\d+)', out)[0] - ) - - def test_mtu(self): - for name, stats in psutil.net_if_stats().items(): - with open(f"/sys/class/net/{name}/mtu") as f: - assert stats.mtu == int(f.read().strip()) - - @pytest.mark.skipif( - not shutil.which("ifconfig"), reason="ifconfig utility not available" - ) - def test_flags(self): - # first line looks like this: - # "eth0: flags=4163 mtu 1500" - matches_found = 0 - for name, stats in psutil.net_if_stats().items(): - try: - out = sh(f"ifconfig {name}") - except RuntimeError: - pass - else: - match = re.search(r"flags=(\d+)?<(.*?)>", out) - if match and len(match.groups()) >= 2: - matches_found += 1 - ifconfig_flags = set(match.group(2).lower().split(",")) - psutil_flags = set(stats.flags.split(",")) - assert ifconfig_flags == psutil_flags - else: - # ifconfig has a different output on CentOS 6 - # let's try that - match = re.search(r"(.*) MTU:(\d+) Metric:(\d+)", out) - if match and len(match.groups()) >= 3: - matches_found += 1 - ifconfig_flags = set(match.group(1).lower().split()) - psutil_flags = set(stats.flags.split(",")) - assert ifconfig_flags == psutil_flags - - if not matches_found: - raise self.fail("no matches were found") - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemNetIOCounters(PsutilTestCase): - @pytest.mark.skipif( - not shutil.which("ifconfig"), reason="ifconfig utility not available" - ) - @retry_on_failure() - def test_against_ifconfig(self): - def ifconfig(nic): - ret = {} - out = sh(f"ifconfig {nic}") - ret['packets_recv'] = int( - re.findall(r'RX packets[: ](\d+)', out)[0] - ) - ret['packets_sent'] = int( - re.findall(r'TX packets[: ](\d+)', out)[0] - ) - ret['errin'] = int(re.findall(r'errors[: ](\d+)', out)[0]) - ret['errout'] = int(re.findall(r'errors[: ](\d+)', out)[1]) - ret['dropin'] = int(re.findall(r'dropped[: ](\d+)', out)[0]) - ret['dropout'] = int(re.findall(r'dropped[: ](\d+)', out)[1]) - ret['bytes_recv'] = int( - re.findall(r'RX (?:packets \d+ +)?bytes[: ](\d+)', out)[0] - ) - ret['bytes_sent'] = int( - re.findall(r'TX (?:packets \d+ +)?bytes[: ](\d+)', out)[0] - ) - return ret - - nio = psutil.net_io_counters(pernic=True, nowrap=False) - for name, stats in nio.items(): - try: - ifconfig_ret = ifconfig(name) - except RuntimeError: - continue - assert ( - abs(stats.bytes_recv - ifconfig_ret['bytes_recv']) < 1024 * 10 - ) - assert ( - abs(stats.bytes_sent - ifconfig_ret['bytes_sent']) < 1024 * 10 - ) - assert ( - abs(stats.packets_recv - ifconfig_ret['packets_recv']) < 1024 - ) - assert ( - abs(stats.packets_sent - ifconfig_ret['packets_sent']) < 1024 - ) - assert abs(stats.errin - ifconfig_ret['errin']) < 10 - assert abs(stats.errout - ifconfig_ret['errout']) < 10 - assert abs(stats.dropin - ifconfig_ret['dropin']) < 10 - assert abs(stats.dropout - ifconfig_ret['dropout']) < 10 - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemNetConnections(PsutilTestCase): - @mock.patch('psutil._pslinux.socket.inet_ntop', side_effect=ValueError) - @mock.patch('psutil._pslinux.supports_ipv6', return_value=False) - def test_emulate_ipv6_unsupported(self, supports_ipv6, inet_ntop): - # see: https://github.com/giampaolo/psutil/issues/623 - try: - s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) - self.addCleanup(s.close) - s.bind(("::1", 0)) - except OSError: - pass - psutil.net_connections(kind='inet6') - - def test_emulate_unix(self): - content = textwrap.dedent("""\ - 0: 00000003 000 000 0001 03 462170 @/tmp/dbus-Qw2hMPIU3n - 0: 00000003 000 000 0001 03 35010 @/tmp/dbus-tB2X8h69BQ - 0: 00000003 000 000 0001 03 34424 @/tmp/dbus-cHy80Y8O - 000000000000000000000000000000000000000000000000000000 - """) - with mock_open_content({"/proc/net/unix": content}) as m: - psutil.net_connections(kind='unix') - assert m.called - - -# ===================================================================== -# --- system disks -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemDiskPartitions(PsutilTestCase): - @pytest.mark.skipif( - not hasattr(os, 'statvfs'), reason="os.statvfs() not available" - ) - @skip_on_not_implemented() - def test_against_df(self): - # test psutil.disk_usage() and psutil.disk_partitions() - # against "df -a" - def df(path): - out = sh(f'df -P -B 1 "{path}"').strip() - lines = out.split('\n') - lines.pop(0) - line = lines.pop(0) - dev, total, used, free = line.split()[:4] - if dev == 'none': - dev = '' - total, used, free = int(total), int(used), int(free) - return dev, total, used, free - - for part in psutil.disk_partitions(all=False): - usage = psutil.disk_usage(part.mountpoint) - _, total, used, free = df(part.mountpoint) - assert usage.total == total - assert abs(usage.free - free) < TOLERANCE_DISK_USAGE - assert abs(usage.used - used) < TOLERANCE_DISK_USAGE - - def test_zfs_fs(self): - # Test that ZFS partitions are returned. - with open("/proc/filesystems") as f: - data = f.read() - if 'zfs' in data: - for part in psutil.disk_partitions(): - if part.fstype == 'zfs': - return - - # No ZFS partitions on this system. Let's fake one. - fake_file = io.StringIO("nodev\tzfs\n") - with mock.patch( - 'psutil._common.open', return_value=fake_file, create=True - ) as m1: - with mock.patch( - 'psutil._pslinux.cext.disk_partitions', - return_value=[('/dev/sdb3', '/', 'zfs', 'rw')], - ) as m2: - ret = psutil.disk_partitions() - assert m1.called - assert m2.called - assert ret - assert ret[0].fstype == 'zfs' - - def test_emulate_realpath_fail(self): - # See: https://github.com/giampaolo/psutil/issues/1307 - try: - with mock.patch( - 'os.path.realpath', return_value='/non/existent' - ) as m: - with pytest.raises(FileNotFoundError): - psutil.disk_partitions() - assert m.called - finally: - psutil.PROCFS_PATH = "/proc" - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSystemDiskIoCounters(PsutilTestCase): - def test_emulate_kernel_2_4(self): - # Tests /proc/diskstats parsing format for 2.4 kernels, see: - # https://github.com/giampaolo/psutil/issues/767 - content = " 3 0 1 hda 2 3 4 5 6 7 8 9 10 11 12" - with mock_open_content({'/proc/diskstats': content}): - with mock.patch( - 'psutil._pslinux.is_storage_device', return_value=True - ): - ret = psutil.disk_io_counters(nowrap=False) - assert ret.read_count == 1 - assert ret.read_merged_count == 2 - assert ret.read_bytes == 3 * SECTOR_SIZE - assert ret.read_time == 4 - assert ret.write_count == 5 - assert ret.write_merged_count == 6 - assert ret.write_bytes == 7 * SECTOR_SIZE - assert ret.write_time == 8 - assert ret.busy_time == 10 - - def test_emulate_kernel_2_6_full(self): - # Tests /proc/diskstats parsing format for 2.6 kernels, - # lines reporting all metrics: - # https://github.com/giampaolo/psutil/issues/767 - content = " 3 0 hda 1 2 3 4 5 6 7 8 9 10 11" - with mock_open_content({"/proc/diskstats": content}): - with mock.patch( - 'psutil._pslinux.is_storage_device', return_value=True - ): - ret = psutil.disk_io_counters(nowrap=False) - assert ret.read_count == 1 - assert ret.read_merged_count == 2 - assert ret.read_bytes == 3 * SECTOR_SIZE - assert ret.read_time == 4 - assert ret.write_count == 5 - assert ret.write_merged_count == 6 - assert ret.write_bytes == 7 * SECTOR_SIZE - assert ret.write_time == 8 - assert ret.busy_time == 10 - - def test_emulate_kernel_2_6_limited(self): - # Tests /proc/diskstats parsing format for 2.6 kernels, - # where one line of /proc/partitions return a limited - # amount of metrics when it bumps into a partition - # (instead of a disk). See: - # https://github.com/giampaolo/psutil/issues/767 - with mock_open_content({"/proc/diskstats": " 3 1 hda 1 2 3 4"}): - with mock.patch( - 'psutil._pslinux.is_storage_device', return_value=True - ): - ret = psutil.disk_io_counters(nowrap=False) - assert ret.read_count == 1 - assert ret.read_bytes == 2 * SECTOR_SIZE - assert ret.write_count == 3 - assert ret.write_bytes == 4 * SECTOR_SIZE - - assert ret.read_merged_count == 0 - assert ret.read_time == 0 - assert ret.write_merged_count == 0 - assert ret.write_time == 0 - assert ret.busy_time == 0 - - def test_emulate_include_partitions(self): - # Make sure that when perdisk=True disk partitions are returned, - # see: - # https://github.com/giampaolo/psutil/pull/1313#issuecomment-408626842 - content = textwrap.dedent("""\ - 3 0 nvme0n1 1 2 3 4 5 6 7 8 9 10 11 - 3 0 nvme0n1p1 1 2 3 4 5 6 7 8 9 10 11 - """) - with mock_open_content({"/proc/diskstats": content}): - with mock.patch( - 'psutil._pslinux.is_storage_device', return_value=False - ): - ret = psutil.disk_io_counters(perdisk=True, nowrap=False) - assert len(ret) == 2 - assert ret['nvme0n1'].read_count == 1 - assert ret['nvme0n1p1'].read_count == 1 - assert ret['nvme0n1'].write_count == 5 - assert ret['nvme0n1p1'].write_count == 5 - - def test_emulate_exclude_partitions(self): - # Make sure that when perdisk=False partitions (e.g. 'sda1', - # 'nvme0n1p1') are skipped and not included in the total count. - # https://github.com/giampaolo/psutil/pull/1313#issuecomment-408626842 - content = textwrap.dedent("""\ - 3 0 nvme0n1 1 2 3 4 5 6 7 8 9 10 11 - 3 0 nvme0n1p1 1 2 3 4 5 6 7 8 9 10 11 - """) - with mock_open_content({"/proc/diskstats": content}): - with mock.patch( - 'psutil._pslinux.is_storage_device', return_value=False - ): - ret = psutil.disk_io_counters(perdisk=False, nowrap=False) - assert ret is None - - def is_storage_device(name): - return name == 'nvme0n1' - - content = textwrap.dedent("""\ - 3 0 nvme0n1 1 2 3 4 5 6 7 8 9 10 11 - 3 0 nvme0n1p1 1 2 3 4 5 6 7 8 9 10 11 - """) - with mock_open_content({"/proc/diskstats": content}): - with mock.patch( - 'psutil._pslinux.is_storage_device', - create=True, - side_effect=is_storage_device, - ): - ret = psutil.disk_io_counters(perdisk=False, nowrap=False) - assert ret.read_count == 1 - assert ret.write_count == 5 - - def test_emulate_use_sysfs(self): - def exists(path): - return path == '/proc/diskstats' - - wprocfs = psutil.disk_io_counters(perdisk=True) - with mock.patch( - 'psutil._pslinux.os.path.exists', create=True, side_effect=exists - ): - wsysfs = psutil.disk_io_counters(perdisk=True) - assert len(wprocfs) == len(wsysfs) - - def test_emulate_not_impl(self): - def exists(path): - return False - - with mock.patch( - 'psutil._pslinux.os.path.exists', create=True, side_effect=exists - ): - with pytest.raises(NotImplementedError): - psutil.disk_io_counters() - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestRootFsDeviceFinder(PsutilTestCase): - def setUp(self): - dev = os.stat("/").st_dev - self.major = os.major(dev) - self.minor = os.minor(dev) - - def test_call_methods(self): - finder = RootFsDeviceFinder() - if os.path.exists("/proc/partitions"): - finder.ask_proc_partitions() - else: - with pytest.raises(FileNotFoundError): - finder.ask_proc_partitions() - if os.path.exists(f"/sys/dev/block/{self.major}:{self.minor}/uevent"): - finder.ask_sys_dev_block() - else: - with pytest.raises(FileNotFoundError): - finder.ask_sys_dev_block() - finder.ask_sys_class_block() - - @pytest.mark.skipif(GITHUB_ACTIONS, reason="unsupported on GITHUB_ACTIONS") - def test_comparisons(self): - finder = RootFsDeviceFinder() - assert finder.find() is not None - - a = b = c = None - if os.path.exists("/proc/partitions"): - a = finder.ask_proc_partitions() - if os.path.exists(f"/sys/dev/block/{self.major}:{self.minor}/uevent"): - b = finder.ask_sys_class_block() - c = finder.ask_sys_dev_block() - - base = a or b or c - if base and a: - assert base == a - if base and b: - assert base == b - if base and c: - assert base == c - - @pytest.mark.skipif( - not shutil.which("findmnt"), reason="findmnt utility not available" - ) - @pytest.mark.skipif(GITHUB_ACTIONS, reason="unsupported on GITHUB_ACTIONS") - def test_against_findmnt(self): - psutil_value = RootFsDeviceFinder().find() - findmnt_value = sh("findmnt -o SOURCE -rn /") - assert psutil_value == findmnt_value - - def test_disk_partitions_mocked(self): - with mock.patch( - 'psutil._pslinux.cext.disk_partitions', - return_value=[('/dev/root', '/', 'ext4', 'rw')], - ) as m: - part = psutil.disk_partitions()[0] - assert m.called - if not GITHUB_ACTIONS: - assert part.device != "/dev/root" - assert part.device == RootFsDeviceFinder().find() - else: - assert part.device == "/dev/root" - - -# ===================================================================== -# --- misc -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestMisc(PsutilTestCase): - def test_boot_time(self): - vmstat_value = vmstat('boot time') - psutil_value = psutil.boot_time() - assert int(vmstat_value) == int(psutil_value) - - def test_no_procfs_on_import(self): - my_procfs = self.get_testfn() - os.mkdir(my_procfs) - - with open(os.path.join(my_procfs, 'stat'), 'w') as f: - f.write('cpu 0 0 0 0 0 0 0 0 0 0\n') - f.write('cpu0 0 0 0 0 0 0 0 0 0 0\n') - f.write('cpu1 0 0 0 0 0 0 0 0 0 0\n') - - try: - orig_open = open - - def open_mock(name, *args, **kwargs): - if name.startswith('/proc'): - raise FileNotFoundError - return orig_open(name, *args, **kwargs) - - with mock.patch("builtins.open", side_effect=open_mock): - reload_module(psutil) - - with pytest.raises(OSError): - psutil.cpu_times() - with pytest.raises(OSError): - psutil.cpu_times(percpu=True) - with pytest.raises(OSError): - psutil.cpu_percent() - with pytest.raises(OSError): - psutil.cpu_percent(percpu=True) - with pytest.raises(OSError): - psutil.cpu_times_percent() - with pytest.raises(OSError): - psutil.cpu_times_percent(percpu=True) - - psutil.PROCFS_PATH = my_procfs - - assert psutil.cpu_percent() == 0 - assert sum(psutil.cpu_times_percent()) == 0 - - # since we don't know the number of CPUs at import time, - # we awkwardly say there are none until the second call - per_cpu_percent = psutil.cpu_percent(percpu=True) - assert sum(per_cpu_percent) == 0 - - # ditto awkward length - per_cpu_times_percent = psutil.cpu_times_percent(percpu=True) - assert sum(map(sum, per_cpu_times_percent)) == 0 - - # much user, very busy - with open(os.path.join(my_procfs, 'stat'), 'w') as f: - f.write('cpu 1 0 0 0 0 0 0 0 0 0\n') - f.write('cpu0 1 0 0 0 0 0 0 0 0 0\n') - f.write('cpu1 1 0 0 0 0 0 0 0 0 0\n') - - assert psutil.cpu_percent() != 0 - assert sum(psutil.cpu_percent(percpu=True)) != 0 - assert sum(psutil.cpu_times_percent()) != 0 - assert ( - sum(map(sum, psutil.cpu_times_percent(percpu=True))) != 0 - ) - finally: - shutil.rmtree(my_procfs) - reload_module(psutil) - - assert psutil.PROCFS_PATH == '/proc' - - def test_cpu_steal_decrease(self): - # Test cumulative cpu stats decrease. We should ignore this. - # See issue #1210. - content = textwrap.dedent("""\ - cpu 0 0 0 0 0 0 0 1 0 0 - cpu0 0 0 0 0 0 0 0 1 0 0 - cpu1 0 0 0 0 0 0 0 1 0 0 - """).encode() - with mock_open_content({"/proc/stat": content}) as m: - # first call to "percent" functions should read the new stat file - # and compare to the "real" file read at import time - so the - # values are meaningless - psutil.cpu_percent() - assert m.called - psutil.cpu_percent(percpu=True) - psutil.cpu_times_percent() - psutil.cpu_times_percent(percpu=True) - - content = textwrap.dedent("""\ - cpu 1 0 0 0 0 0 0 0 0 0 - cpu0 1 0 0 0 0 0 0 0 0 0 - cpu1 1 0 0 0 0 0 0 0 0 0 - """).encode() - with mock_open_content({"/proc/stat": content}): - # Increase "user" while steal goes "backwards" to zero. - cpu_percent = psutil.cpu_percent() - assert m.called - cpu_percent_percpu = psutil.cpu_percent(percpu=True) - cpu_times_percent = psutil.cpu_times_percent() - cpu_times_percent_percpu = psutil.cpu_times_percent(percpu=True) - assert cpu_percent != 0 - assert sum(cpu_percent_percpu) != 0 - assert sum(cpu_times_percent) != 0 - assert sum(cpu_times_percent) != 100.0 - assert sum(map(sum, cpu_times_percent_percpu)) != 0 - assert sum(map(sum, cpu_times_percent_percpu)) != 100.0 - assert cpu_times_percent.steal == 0 - assert cpu_times_percent.user != 0 - - def test_boot_time_mocked(self): - with mock.patch('psutil._common.open', create=True) as m: - with pytest.raises(RuntimeError): - psutil._pslinux.boot_time() - assert m.called - - def test_users(self): - # Make sure the C extension converts ':0' and ':0.0' to - # 'localhost'. - for user in psutil.users(): - assert user.host not in {":0", ":0.0"} - - def test_procfs_path(self): - tdir = self.get_testfn() - os.mkdir(tdir) - try: - psutil.PROCFS_PATH = tdir - with pytest.raises(OSError): - psutil.virtual_memory() - with pytest.raises(OSError): - psutil.cpu_times() - with pytest.raises(OSError): - psutil.cpu_times(percpu=True) - with pytest.raises(OSError): - psutil.boot_time() - # self.assertRaises(OSError, psutil.pids) - with pytest.raises(OSError): - psutil.net_connections() - with pytest.raises(OSError): - psutil.net_io_counters() - with pytest.raises(OSError): - psutil.net_if_stats() - # self.assertRaises(OSError, psutil.disk_io_counters) - with pytest.raises(OSError): - psutil.disk_partitions() - with pytest.raises(psutil.NoSuchProcess): - psutil.Process() - finally: - psutil.PROCFS_PATH = "/proc" - - @retry_on_failure() - @pytest.mark.skipif(PYTEST_PARALLEL, reason="skip if pytest-parallel") - def test_issue_687(self): - # In case of thread ID: - # - pid_exists() is supposed to return False - # - Process(tid) is supposed to work - # - pids() should not return the TID - # See: https://github.com/giampaolo/psutil/issues/687 - with ThreadTask(): - p = psutil.Process() - threads = p.threads() - assert len(threads) == 2 - tid = sorted(threads, key=lambda x: x.id)[1].id - assert p.pid != tid - pt = psutil.Process(tid) - pt.as_dict() - assert tid not in psutil.pids() - - def test_pid_exists_no_proc_status(self): - # Internally pid_exists relies on /proc/{pid}/status. - # Emulate a case where this file is empty in which case - # psutil is supposed to fall back on using pids(). - with mock_open_content({"/proc/%s/status": ""}) as m: - assert psutil.pid_exists(os.getpid()) - assert m.called - - -# ===================================================================== -# --- sensors -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -@pytest.mark.skipif(not HAS_BATTERY, reason="no battery") -class TestSensorsBattery(PsutilTestCase): - @pytest.mark.skipif( - not shutil.which("acpi"), reason="acpi utility not available" - ) - def test_percent(self): - out = sh("acpi -b") - acpi_value = int(out.split(",")[1].strip().replace('%', '')) - psutil_value = psutil.sensors_battery().percent - assert abs(acpi_value - psutil_value) < 1 - - def test_emulate_power_plugged(self): - # Pretend the AC power cable is connected. - def open_mock(name, *args, **kwargs): - if name.endswith(('AC0/online', 'AC/online')): - return io.BytesIO(b"1") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock) as m: - assert psutil.sensors_battery().power_plugged is True - assert ( - psutil.sensors_battery().secsleft - == psutil.POWER_TIME_UNLIMITED - ) - assert m.called - - def test_emulate_power_plugged_2(self): - # Same as above but pretend /AC0/online does not exist in which - # case code relies on /status file. - def open_mock(name, *args, **kwargs): - if name.endswith(('AC0/online', 'AC/online')): - raise FileNotFoundError - if name.endswith("/status"): - return io.StringIO("charging") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock) as m: - assert psutil.sensors_battery().power_plugged is True - assert m.called - - def test_emulate_power_not_plugged(self): - # Pretend the AC power cable is not connected. - def open_mock(name, *args, **kwargs): - if name.endswith(('AC0/online', 'AC/online')): - return io.BytesIO(b"0") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock) as m: - assert psutil.sensors_battery().power_plugged is False - assert m.called - - def test_emulate_power_not_plugged_2(self): - # Same as above but pretend /AC0/online does not exist in which - # case code relies on /status file. - def open_mock(name, *args, **kwargs): - if name.endswith(('AC0/online', 'AC/online')): - raise FileNotFoundError - if name.endswith("/status"): - return io.StringIO("discharging") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock) as m: - assert psutil.sensors_battery().power_plugged is False - assert m.called - - def test_emulate_power_undetermined(self): - # Pretend we can't know whether the AC power cable not - # connected (assert fallback to False). - def open_mock(name, *args, **kwargs): - if name.startswith(( - '/sys/class/power_supply/AC0/online', - '/sys/class/power_supply/AC/online', - )): - raise FileNotFoundError - if name.startswith("/sys/class/power_supply/BAT0/status"): - return io.BytesIO(b"???") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock) as m: - assert psutil.sensors_battery().power_plugged is None - assert m.called - - def test_emulate_energy_full_0(self): - # Emulate a case where energy_full files returns 0. - with mock_open_content( - {"/sys/class/power_supply/BAT0/energy_full": b"0"} - ) as m: - assert psutil.sensors_battery().percent == 0 - assert m.called - - def test_emulate_energy_full_not_avail(self): - # Emulate a case where energy_full file does not exist. - # Expected fallback on /capacity. - with mock_open_exception( - "/sys/class/power_supply/BAT0/energy_full", - FileNotFoundError, - ): - with mock_open_exception( - "/sys/class/power_supply/BAT0/charge_full", - FileNotFoundError, - ): - with mock_open_content( - {"/sys/class/power_supply/BAT0/capacity": b"88"} - ): - assert psutil.sensors_battery().percent == 88 - - def test_emulate_no_power(self): - # Emulate a case where /AC0/online file nor /BAT0/status exist. - with mock_open_exception( - "/sys/class/power_supply/AC/online", FileNotFoundError - ): - with mock_open_exception( - "/sys/class/power_supply/AC0/online", FileNotFoundError - ): - with mock_open_exception( - "/sys/class/power_supply/BAT0/status", - FileNotFoundError, - ): - assert psutil.sensors_battery().power_plugged is None - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSensorsBatteryEmulated(PsutilTestCase): - def test_it(self): - def open_mock(name, *args, **kwargs): - if name.endswith("/energy_now"): - return io.StringIO("60000000") - elif name.endswith("/power_now"): - return io.StringIO("0") - elif name.endswith("/energy_full"): - return io.StringIO("60000001") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch('os.listdir', return_value=["BAT0"]) as mlistdir: - with mock.patch("builtins.open", side_effect=open_mock) as mopen: - assert psutil.sensors_battery() is not None - assert mlistdir.called - assert mopen.called - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSensorsTemperatures(PsutilTestCase): - def test_emulate_class_hwmon(self): - def open_mock(name, *args, **kwargs): - if name.endswith('/name'): - return io.StringIO("name") - elif name.endswith('/temp1_label'): - return io.StringIO("label") - elif name.endswith('/temp1_input'): - return io.BytesIO(b"30000") - elif name.endswith('/temp1_max'): - return io.BytesIO(b"40000") - elif name.endswith('/temp1_crit'): - return io.BytesIO(b"50000") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock): - # Test case with /sys/class/hwmon - with mock.patch( - 'glob.glob', return_value=['/sys/class/hwmon/hwmon0/temp1'] - ): - temp = psutil.sensors_temperatures()['name'][0] - assert temp.label == 'label' - assert temp.current == 30.0 - assert temp.high == 40.0 - assert temp.critical == 50.0 - - def test_emulate_class_thermal(self): - def open_mock(name, *args, **kwargs): - if name.endswith('0_temp'): - return io.BytesIO(b"50000") - elif name.endswith('temp'): - return io.BytesIO(b"30000") - elif name.endswith('0_type'): - return io.StringIO("critical") - elif name.endswith('type'): - return io.StringIO("name") - else: - return orig_open(name, *args, **kwargs) - - def glob_mock(path): - if path in { - '/sys/class/hwmon/hwmon*/temp*_*', - '/sys/class/hwmon/hwmon*/device/temp*_*', - }: - return [] - elif path == '/sys/class/thermal/thermal_zone*': - return ['/sys/class/thermal/thermal_zone0'] - elif path == '/sys/class/thermal/thermal_zone0/trip_point*': - return [ - '/sys/class/thermal/thermal_zone1/trip_point_0_type', - '/sys/class/thermal/thermal_zone1/trip_point_0_temp', - ] - return [] - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock): - with mock.patch('glob.glob', create=True, side_effect=glob_mock): - temp = psutil.sensors_temperatures()['name'][0] - assert temp.label == '' - assert temp.current == 30.0 - assert temp.high == 50.0 - assert temp.critical == 50.0 - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestSensorsFans(PsutilTestCase): - def test_emulate_data(self): - def open_mock(name, *args, **kwargs): - if name.endswith('/name'): - return io.StringIO("name") - elif name.endswith('/fan1_label'): - return io.StringIO("label") - elif name.endswith('/fan1_input'): - return io.StringIO("2000") - else: - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock): - with mock.patch( - 'glob.glob', return_value=['/sys/class/hwmon/hwmon2/fan1'] - ): - fan = psutil.sensors_fans()['name'][0] - assert fan.label == 'label' - assert fan.current == 2000 - - -# ===================================================================== -# --- test process -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestProcess(PsutilTestCase): - @retry_on_failure() - def test_parse_smaps_vs_memory_maps(self): - sproc = self.spawn_testproc() - uss, pss, swap = psutil._pslinux.Process(sproc.pid)._parse_smaps() - maps = psutil.Process(sproc.pid).memory_maps(grouped=False) - assert ( - abs(uss - sum(x.private_dirty + x.private_clean for x in maps)) - < 4096 - ) - assert abs(pss - sum(x.pss for x in maps)) < 4096 - assert abs(swap - sum(x.swap for x in maps)) < 4096 - - def test_parse_smaps_mocked(self): - # See: https://github.com/giampaolo/psutil/issues/1222 - content = textwrap.dedent("""\ - fffff0 r-xp 00000000 00:00 0 [vsyscall] - Size: 1 kB - Rss: 2 kB - Pss: 3 kB - Shared_Clean: 4 kB - Shared_Dirty: 5 kB - Private_Clean: 6 kB - Private_Dirty: 7 kB - Referenced: 8 kB - Anonymous: 9 kB - LazyFree: 10 kB - AnonHugePages: 11 kB - ShmemPmdMapped: 12 kB - Shared_Hugetlb: 13 kB - Private_Hugetlb: 14 kB - Swap: 15 kB - SwapPss: 16 kB - KernelPageSize: 17 kB - MMUPageSize: 18 kB - Locked: 19 kB - VmFlags: rd ex - """).encode() - with mock_open_content({f"/proc/{os.getpid()}/smaps": content}) as m: - p = psutil._pslinux.Process(os.getpid()) - uss, pss, swap = p._parse_smaps() - assert m.called - assert uss == (6 + 7 + 14) * 1024 - assert pss == 3 * 1024 - assert swap == 15 * 1024 - - # On PYPY file descriptors are not closed fast enough. - @pytest.mark.skipif(PYPY, reason="unreliable on PYPY") - def test_open_files_mode(self): - def get_test_file(fname): - p = psutil.Process() - giveup_at = time.time() + GLOBAL_TIMEOUT - while True: - for file in p.open_files(): - if file.path == os.path.abspath(fname): - return file - elif time.time() > giveup_at: - break - raise RuntimeError("timeout looking for test file") - - testfn = self.get_testfn() - with open(testfn, "w"): - assert get_test_file(testfn).mode == "w" - with open(testfn): - assert get_test_file(testfn).mode == "r" - with open(testfn, "a"): - assert get_test_file(testfn).mode == "a" - with open(testfn, "r+"): - assert get_test_file(testfn).mode == "r+" - with open(testfn, "w+"): - assert get_test_file(testfn).mode == "r+" - with open(testfn, "a+"): - assert get_test_file(testfn).mode == "a+" - - safe_rmpath(testfn) - with open(testfn, "x"): - assert get_test_file(testfn).mode == "w" - safe_rmpath(testfn) - with open(testfn, "x+"): - assert get_test_file(testfn).mode == "r+" - - def test_open_files_file_gone(self): - # simulates a file which gets deleted during open_files() - # execution - p = psutil.Process() - files = p.open_files() - with open(self.get_testfn(), 'w'): - # give the kernel some time to see the new file - call_until(lambda: len(p.open_files()) != len(files)) - with mock.patch( - 'psutil._pslinux.os.readlink', - side_effect=FileNotFoundError, - ) as m: - assert p.open_files() == [] - assert m.called - # also simulate the case where os.readlink() returns EINVAL - # in which case psutil is supposed to 'continue' - with mock.patch( - 'psutil._pslinux.os.readlink', - side_effect=OSError(errno.EINVAL, ""), - ) as m: - assert p.open_files() == [] - assert m.called - - def test_open_files_fd_gone(self): - # Simulate a case where /proc/{pid}/fdinfo/{fd} disappears - # while iterating through fds. - # https://travis-ci.org/giampaolo/psutil/jobs/225694530 - p = psutil.Process() - files = p.open_files() - with open(self.get_testfn(), 'w'): - # give the kernel some time to see the new file - call_until(lambda: len(p.open_files()) != len(files)) - with mock.patch( - "builtins.open", side_effect=FileNotFoundError - ) as m: - assert p.open_files() == [] - assert m.called - - def test_open_files_enametoolong(self): - # Simulate a case where /proc/{pid}/fd/{fd} symlink - # points to a file with full path longer than PATH_MAX, see: - # https://github.com/giampaolo/psutil/issues/1940 - p = psutil.Process() - files = p.open_files() - with open(self.get_testfn(), 'w'): - # give the kernel some time to see the new file - call_until(lambda: len(p.open_files()) != len(files)) - patch_point = 'psutil._pslinux.os.readlink' - with mock.patch( - patch_point, side_effect=OSError(errno.ENAMETOOLONG, "") - ) as m: - with mock.patch("psutil._pslinux.debug"): - assert p.open_files() == [] - assert m.called - - # --- mocked tests - - def test_terminal_mocked(self): - with mock.patch( - 'psutil._pslinux._psposix.get_terminal_map', return_value={} - ) as m: - assert psutil._pslinux.Process(os.getpid()).terminal() is None - assert m.called - - # TODO: re-enable this test. - # def test_num_ctx_switches_mocked(self): - # with mock.patch('psutil._common.open', create=True) as m: - # self.assertRaises( - # NotImplementedError, - # psutil._pslinux.Process(os.getpid()).num_ctx_switches) - # assert m.called - - def test_cmdline_mocked(self): - # see: https://github.com/giampaolo/psutil/issues/639 - p = psutil.Process() - fake_file = io.StringIO('foo\x00bar\x00') - with mock.patch( - 'psutil._common.open', return_value=fake_file, create=True - ) as m: - assert p.cmdline() == ['foo', 'bar'] - assert m.called - fake_file = io.StringIO('foo\x00bar\x00\x00') - with mock.patch( - 'psutil._common.open', return_value=fake_file, create=True - ) as m: - assert p.cmdline() == ['foo', 'bar', ''] - assert m.called - - def test_cmdline_spaces_mocked(self): - # see: https://github.com/giampaolo/psutil/issues/1179 - p = psutil.Process() - fake_file = io.StringIO('foo bar ') - with mock.patch( - 'psutil._common.open', return_value=fake_file, create=True - ) as m: - assert p.cmdline() == ['foo', 'bar'] - assert m.called - fake_file = io.StringIO('foo bar ') - with mock.patch( - 'psutil._common.open', return_value=fake_file, create=True - ) as m: - assert p.cmdline() == ['foo', 'bar', ''] - assert m.called - - def test_cmdline_mixed_separators(self): - # https://github.com/giampaolo/psutil/issues/ - # 1179#issuecomment-552984549 - p = psutil.Process() - fake_file = io.StringIO('foo\x20bar\x00') - with mock.patch( - 'psutil._common.open', return_value=fake_file, create=True - ) as m: - assert p.cmdline() == ['foo', 'bar'] - assert m.called - - def test_readlink_path_deleted_mocked(self): - with mock.patch( - 'psutil._pslinux.os.readlink', return_value='/home/foo (deleted)' - ): - assert psutil.Process().exe() == "/home/foo" - assert psutil.Process().cwd() == "/home/foo" - - def test_threads_mocked(self): - # Test the case where os.listdir() returns a file (thread) - # which no longer exists by the time we open() it (race - # condition). threads() is supposed to ignore that instead - # of raising NSP. - def open_mock_1(name, *args, **kwargs): - if name.startswith(f"/proc/{os.getpid()}/task"): - raise FileNotFoundError - return orig_open(name, *args, **kwargs) - - orig_open = open - with mock.patch("builtins.open", side_effect=open_mock_1) as m: - ret = psutil.Process().threads() - assert m.called - assert ret == [] - - # ...but if it bumps into something != ENOENT we want an - # exception. - def open_mock_2(name, *args, **kwargs): - if name.startswith(f"/proc/{os.getpid()}/task"): - raise PermissionError - return orig_open(name, *args, **kwargs) - - with mock.patch("builtins.open", side_effect=open_mock_2): - with pytest.raises(psutil.AccessDenied): - psutil.Process().threads() - - def test_exe_mocked(self): - with mock.patch( - 'psutil._pslinux.readlink', side_effect=FileNotFoundError - ) as m: - # de-activate guessing from cmdline() - with mock.patch( - 'psutil._pslinux.Process.cmdline', return_value=[] - ): - ret = psutil.Process().exe() - assert m.called - assert ret == "" - - def test_issue_1014(self): - # Emulates a case where smaps file does not exist. In this case - # wrap_exception decorator should not raise NoSuchProcess. - with mock_open_exception( - f"/proc/{os.getpid()}/smaps", FileNotFoundError - ) as m: - p = psutil.Process() - with pytest.raises(FileNotFoundError): - p.memory_maps() - assert m.called - - def test_issue_2418(self): - p = psutil.Process() - with mock_open_exception( - f"/proc/{os.getpid()}/statm", FileNotFoundError - ): - with mock.patch("os.path.exists", return_value=False): - with pytest.raises(psutil.NoSuchProcess): - p.memory_info() - - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit_zombie(self): - # Emulate a case where rlimit() raises ENOSYS, which may - # happen in case of zombie process: - # https://travis-ci.org/giampaolo/psutil/jobs/51368273 - with mock.patch( - "resource.prlimit", side_effect=OSError(errno.ENOSYS, "") - ) as m1: - with mock.patch( - "psutil._pslinux.Process._is_zombie", return_value=True - ) as m2: - p = psutil.Process() - p.name() - with pytest.raises(psutil.ZombieProcess) as cm: - p.rlimit(psutil.RLIMIT_NOFILE) - assert m1.called - assert m2.called - assert cm.value.pid == p.pid - assert cm.value.name == p.name() - - def test_stat_file_parsing(self): - args = [ - "0", # pid - "(cat)", # name - "Z", # status - "1", # ppid - "0", # pgrp - "0", # session - "0", # tty - "0", # tpgid - "0", # flags - "0", # minflt - "0", # cminflt - "0", # majflt - "0", # cmajflt - "2", # utime - "3", # stime - "4", # cutime - "5", # cstime - "0", # priority - "0", # nice - "0", # num_threads - "0", # itrealvalue - "6", # starttime - "0", # vsize - "0", # rss - "0", # rsslim - "0", # startcode - "0", # endcode - "0", # startstack - "0", # kstkesp - "0", # kstkeip - "0", # signal - "0", # blocked - "0", # sigignore - "0", # sigcatch - "0", # wchan - "0", # nswap - "0", # cnswap - "0", # exit_signal - "6", # processor - "0", # rt priority - "0", # policy - "7", # delayacct_blkio_ticks - ] - content = " ".join(args).encode() - with mock_open_content({f"/proc/{os.getpid()}/stat": content}): - p = psutil.Process() - assert p.name() == 'cat' - assert p.status() == psutil.STATUS_ZOMBIE - assert p.ppid() == 1 - assert p.create_time() == 6 / CLOCK_TICKS + psutil.boot_time() - cpu = p.cpu_times() - assert cpu.user == 2 / CLOCK_TICKS - assert cpu.system == 3 / CLOCK_TICKS - assert cpu.children_user == 4 / CLOCK_TICKS - assert cpu.children_system == 5 / CLOCK_TICKS - assert cpu.iowait == 7 / CLOCK_TICKS - assert p.cpu_num() == 6 - - def test_status_file_parsing(self): - content = textwrap.dedent("""\ - Uid:\t1000\t1001\t1002\t1003 - Gid:\t1004\t1005\t1006\t1007 - Threads:\t66 - Cpus_allowed:\tf - Cpus_allowed_list:\t0-7 - voluntary_ctxt_switches:\t12 - nonvoluntary_ctxt_switches:\t13""").encode() - with mock_open_content({f"/proc/{os.getpid()}/status": content}): - p = psutil.Process() - assert p.num_ctx_switches().voluntary == 12 - assert p.num_ctx_switches().involuntary == 13 - assert p.num_threads() == 66 - uids = p.uids() - assert uids.real == 1000 - assert uids.effective == 1001 - assert uids.saved == 1002 - gids = p.gids() - assert gids.real == 1004 - assert gids.effective == 1005 - assert gids.saved == 1006 - assert p._proc._get_eligible_cpus() == list(range(8)) - - def test_net_connections_enametoolong(self): - # Simulate a case where /proc/{pid}/fd/{fd} symlink points to - # a file with full path longer than PATH_MAX, see: - # https://github.com/giampaolo/psutil/issues/1940 - with mock.patch( - 'psutil._pslinux.os.readlink', - side_effect=OSError(errno.ENAMETOOLONG, ""), - ) as m: - p = psutil.Process() - with mock.patch("psutil._pslinux.debug"): - assert p.net_connections() == [] - assert m.called - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestProcessAgainstStatus(PsutilTestCase): - """/proc/pid/stat and /proc/pid/status have many values in common. - Whenever possible, psutil uses /proc/pid/stat (it's faster). - For all those cases we check that the value found in - /proc/pid/stat (by psutil) matches the one found in - /proc/pid/status. - """ - - @classmethod - def setUpClass(cls): - cls.proc = psutil.Process() - - def read_status_file(self, linestart): - with psutil._psplatform.open_text( - f"/proc/{self.proc.pid}/status" - ) as f: - for line in f: - line = line.strip() - if line.startswith(linestart): - value = line.partition('\t')[2] - try: - return int(value) - except ValueError: - return value - raise ValueError(f"can't find {linestart!r}") - - def test_name(self): - value = self.read_status_file("Name:") - assert self.proc.name() == value - - def test_status(self): - value = self.read_status_file("State:") - value = value[value.find('(') + 1 : value.rfind(')')] - value = value.replace(' ', '-') - assert self.proc.status() == value - - def test_ppid(self): - value = self.read_status_file("PPid:") - assert self.proc.ppid() == value - - def test_num_threads(self): - value = self.read_status_file("Threads:") - assert self.proc.num_threads() == value - - def test_uids(self): - value = self.read_status_file("Uid:") - value = tuple(map(int, value.split()[1:4])) - assert self.proc.uids() == value - - def test_gids(self): - value = self.read_status_file("Gid:") - value = tuple(map(int, value.split()[1:4])) - assert self.proc.gids() == value - - @retry_on_failure() - def test_num_ctx_switches(self): - value = self.read_status_file("voluntary_ctxt_switches:") - assert self.proc.num_ctx_switches().voluntary == value - value = self.read_status_file("nonvoluntary_ctxt_switches:") - assert self.proc.num_ctx_switches().involuntary == value - - def test_cpu_affinity(self): - value = self.read_status_file("Cpus_allowed_list:") - if '-' in str(value): - min_, max_ = map(int, value.split('-')) - assert self.proc.cpu_affinity() == list(range(min_, max_ + 1)) - - def test_cpu_affinity_eligible_cpus(self): - value = self.read_status_file("Cpus_allowed_list:") - with mock.patch("psutil._pslinux.per_cpu_times") as m: - self.proc._proc._get_eligible_cpus() - if '-' in str(value): - assert not m.called - else: - assert m.called - - -# ===================================================================== -# --- test utils -# ===================================================================== - - -@pytest.mark.skipif(not LINUX, reason="LINUX only") -class TestUtils(PsutilTestCase): - def test_readlink(self): - with mock.patch("os.readlink", return_value="foo (deleted)") as m: - assert psutil._psplatform.readlink("bar") == "foo" - assert m.called diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_memleaks.py b/PortablePython/Lib/site-packages/psutil/tests/test_memleaks.py deleted file mode 100644 index 7f78fae..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_memleaks.py +++ /dev/null @@ -1,487 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for detecting function memory leaks (typically the ones -implemented in C). It does so by calling a function many times and -checking whether process memory usage keeps increasing between -calls or over time. -Note that this may produce false positives (especially on Windows -for some reason). -PyPy appears to be completely unstable for this framework, probably -because of how its JIT handles memory, so tests are skipped. -""" - - -import functools -import os -import platform - -import psutil -import psutil._common -from psutil import LINUX -from psutil import MACOS -from psutil import OPENBSD -from psutil import POSIX -from psutil import SUNOS -from psutil import WINDOWS -from psutil.tests import HAS_CPU_AFFINITY -from psutil.tests import HAS_CPU_FREQ -from psutil.tests import HAS_ENVIRON -from psutil.tests import HAS_IONICE -from psutil.tests import HAS_MEMORY_MAPS -from psutil.tests import HAS_NET_IO_COUNTERS -from psutil.tests import HAS_PROC_CPU_NUM -from psutil.tests import HAS_PROC_IO_COUNTERS -from psutil.tests import HAS_RLIMIT -from psutil.tests import HAS_SENSORS_BATTERY -from psutil.tests import HAS_SENSORS_FANS -from psutil.tests import HAS_SENSORS_TEMPERATURES -from psutil.tests import TestMemoryLeak -from psutil.tests import create_sockets -from psutil.tests import get_testfn -from psutil.tests import process_namespace -from psutil.tests import pytest -from psutil.tests import skip_on_access_denied -from psutil.tests import spawn_testproc -from psutil.tests import system_namespace -from psutil.tests import terminate - - -cext = psutil._psplatform.cext -thisproc = psutil.Process() -FEW_TIMES = 5 - - -def fewtimes_if_linux(): - """Decorator for those Linux functions which are implemented in pure - Python, and which we want to run faster. - """ - - def decorator(fun): - @functools.wraps(fun) - def wrapper(self, *args, **kwargs): - if LINUX: - before = self.__class__.times - try: - self.__class__.times = FEW_TIMES - return fun(self, *args, **kwargs) - finally: - self.__class__.times = before - else: - return fun(self, *args, **kwargs) - - return wrapper - - return decorator - - -# =================================================================== -# Process class -# =================================================================== - - -class TestProcessObjectLeaks(TestMemoryLeak): - """Test leaks of Process class methods.""" - - proc = thisproc - - def test_coverage(self): - ns = process_namespace(None) - ns.test_class_coverage(self, ns.getters + ns.setters) - - @fewtimes_if_linux() - def test_name(self): - self.execute(self.proc.name) - - @fewtimes_if_linux() - def test_cmdline(self): - self.execute(self.proc.cmdline) - - @fewtimes_if_linux() - def test_exe(self): - self.execute(self.proc.exe) - - @fewtimes_if_linux() - def test_ppid(self): - self.execute(self.proc.ppid) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - @fewtimes_if_linux() - def test_uids(self): - self.execute(self.proc.uids) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - @fewtimes_if_linux() - def test_gids(self): - self.execute(self.proc.gids) - - @fewtimes_if_linux() - def test_status(self): - self.execute(self.proc.status) - - def test_nice(self): - self.execute(self.proc.nice) - - def test_nice_set(self): - niceness = thisproc.nice() - self.execute(lambda: self.proc.nice(niceness)) - - @pytest.mark.skipif(not HAS_IONICE, reason="not supported") - def test_ionice(self): - self.execute(self.proc.ionice) - - @pytest.mark.skipif(not HAS_IONICE, reason="not supported") - def test_ionice_set(self): - if WINDOWS: - value = thisproc.ionice() - self.execute(lambda: self.proc.ionice(value)) - else: - self.execute(lambda: self.proc.ionice(psutil.IOPRIO_CLASS_NONE)) - fun = functools.partial(cext.proc_ioprio_set, os.getpid(), -1, 0) - self.execute_w_exc(OSError, fun) - - @pytest.mark.skipif(not HAS_PROC_IO_COUNTERS, reason="not supported") - @fewtimes_if_linux() - def test_io_counters(self): - self.execute(self.proc.io_counters) - - @pytest.mark.skipif(POSIX, reason="worthless on POSIX") - def test_username(self): - # always open 1 handle on Windows (only once) - psutil.Process().username() - self.execute(self.proc.username) - - @fewtimes_if_linux() - def test_create_time(self): - self.execute(self.proc.create_time) - - @fewtimes_if_linux() - @skip_on_access_denied(only_if=OPENBSD) - def test_num_threads(self): - self.execute(self.proc.num_threads) - - @pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") - def test_num_handles(self): - self.execute(self.proc.num_handles) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - @fewtimes_if_linux() - def test_num_fds(self): - self.execute(self.proc.num_fds) - - @fewtimes_if_linux() - def test_num_ctx_switches(self): - self.execute(self.proc.num_ctx_switches) - - @fewtimes_if_linux() - @skip_on_access_denied(only_if=OPENBSD) - def test_threads(self): - self.execute(self.proc.threads) - - @fewtimes_if_linux() - def test_cpu_times(self): - self.execute(self.proc.cpu_times) - - @fewtimes_if_linux() - @pytest.mark.skipif(not HAS_PROC_CPU_NUM, reason="not supported") - def test_cpu_num(self): - self.execute(self.proc.cpu_num) - - @fewtimes_if_linux() - def test_memory_info(self): - self.execute(self.proc.memory_info) - - @fewtimes_if_linux() - def test_memory_full_info(self): - self.execute(self.proc.memory_full_info) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - @fewtimes_if_linux() - def test_terminal(self): - self.execute(self.proc.terminal) - - def test_resume(self): - times = FEW_TIMES if POSIX else self.times - self.execute(self.proc.resume, times=times) - - @fewtimes_if_linux() - def test_cwd(self): - self.execute(self.proc.cwd) - - @pytest.mark.skipif(not HAS_CPU_AFFINITY, reason="not supported") - def test_cpu_affinity(self): - self.execute(self.proc.cpu_affinity) - - @pytest.mark.skipif(not HAS_CPU_AFFINITY, reason="not supported") - def test_cpu_affinity_set(self): - affinity = thisproc.cpu_affinity() - self.execute(lambda: self.proc.cpu_affinity(affinity)) - self.execute_w_exc(ValueError, lambda: self.proc.cpu_affinity([-1])) - - @fewtimes_if_linux() - def test_open_files(self): - with open(get_testfn(), 'w'): - self.execute(self.proc.open_files) - - @pytest.mark.skipif(not HAS_MEMORY_MAPS, reason="not supported") - @fewtimes_if_linux() - def test_memory_maps(self): - self.execute(self.proc.memory_maps) - - @pytest.mark.skipif(not LINUX, reason="LINUX only") - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit(self): - self.execute(lambda: self.proc.rlimit(psutil.RLIMIT_NOFILE)) - - @pytest.mark.skipif(not LINUX, reason="LINUX only") - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit_set(self): - limit = thisproc.rlimit(psutil.RLIMIT_NOFILE) - self.execute(lambda: self.proc.rlimit(psutil.RLIMIT_NOFILE, limit)) - self.execute_w_exc((OSError, ValueError), lambda: self.proc.rlimit(-1)) - - @fewtimes_if_linux() - # Windows implementation is based on a single system-wide - # function (tested later). - @pytest.mark.skipif(WINDOWS, reason="worthless on WINDOWS") - def test_net_connections(self): - # TODO: UNIX sockets are temporarily implemented by parsing - # 'pfiles' cmd output; we don't want that part of the code to - # be executed. - with create_sockets(): - kind = 'inet' if SUNOS else 'all' - self.execute(lambda: self.proc.net_connections(kind)) - - @pytest.mark.skipif(not HAS_ENVIRON, reason="not supported") - def test_environ(self): - self.execute(self.proc.environ) - - @pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") - def test_proc_info(self): - self.execute(lambda: cext.proc_info(os.getpid())) - - -class TestTerminatedProcessLeaks(TestProcessObjectLeaks): - """Repeat the tests above looking for leaks occurring when dealing - with terminated processes raising NoSuchProcess exception. - The C functions are still invoked but will follow different code - paths. We'll check those code paths. - """ - - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.subp = spawn_testproc() - cls.proc = psutil.Process(cls.subp.pid) - cls.proc.kill() - cls.proc.wait() - - @classmethod - def tearDownClass(cls): - super().tearDownClass() - terminate(cls.subp) - - def call(self, fun): - try: - fun() - except psutil.NoSuchProcess: - pass - - if WINDOWS: - - def test_kill(self): - self.execute(self.proc.kill) - - def test_terminate(self): - self.execute(self.proc.terminate) - - def test_suspend(self): - self.execute(self.proc.suspend) - - def test_resume(self): - self.execute(self.proc.resume) - - def test_wait(self): - self.execute(self.proc.wait) - - def test_proc_info(self): - # test dual implementation - def call(): - try: - return cext.proc_info(self.proc.pid) - except ProcessLookupError: - pass - - self.execute(call) - - -@pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") -class TestProcessDualImplementation(TestMemoryLeak): - def test_cmdline_peb_true(self): - self.execute(lambda: cext.proc_cmdline(os.getpid(), use_peb=True)) - - def test_cmdline_peb_false(self): - self.execute(lambda: cext.proc_cmdline(os.getpid(), use_peb=False)) - - -# =================================================================== -# system APIs -# =================================================================== - - -class TestModuleFunctionsLeaks(TestMemoryLeak): - """Test leaks of psutil module functions.""" - - def test_coverage(self): - ns = system_namespace() - ns.test_class_coverage(self, ns.all) - - # --- cpu - - @fewtimes_if_linux() - def test_cpu_count(self): # logical - self.execute(lambda: psutil.cpu_count(logical=True)) - - @fewtimes_if_linux() - def test_cpu_count_cores(self): - self.execute(lambda: psutil.cpu_count(logical=False)) - - @fewtimes_if_linux() - def test_cpu_times(self): - self.execute(psutil.cpu_times) - - @fewtimes_if_linux() - def test_per_cpu_times(self): - self.execute(lambda: psutil.cpu_times(percpu=True)) - - @fewtimes_if_linux() - def test_cpu_stats(self): - self.execute(psutil.cpu_stats) - - @fewtimes_if_linux() - # TODO: remove this once 1892 is fixed - @pytest.mark.skipif( - MACOS and platform.machine() == 'arm64', reason="skipped due to #1892" - ) - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - def test_cpu_freq(self): - self.execute(psutil.cpu_freq) - - @pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") - def test_getloadavg(self): - psutil.getloadavg() - self.execute(psutil.getloadavg) - - # --- mem - - def test_virtual_memory(self): - self.execute(psutil.virtual_memory) - - # TODO: remove this skip when this gets fixed - @pytest.mark.skipif(SUNOS, reason="worthless on SUNOS (uses a subprocess)") - def test_swap_memory(self): - self.execute(psutil.swap_memory) - - def test_pid_exists(self): - times = FEW_TIMES if POSIX else self.times - self.execute(lambda: psutil.pid_exists(os.getpid()), times=times) - - # --- disk - - def test_disk_usage(self): - times = FEW_TIMES if POSIX else self.times - self.execute(lambda: psutil.disk_usage('.'), times=times) - - def test_disk_partitions(self): - self.execute(psutil.disk_partitions) - - @pytest.mark.skipif( - LINUX and not os.path.exists('/proc/diskstats'), - reason="/proc/diskstats not available on this Linux version", - ) - @fewtimes_if_linux() - def test_disk_io_counters(self): - self.execute(lambda: psutil.disk_io_counters(nowrap=False)) - - # --- proc - - @fewtimes_if_linux() - def test_pids(self): - self.execute(psutil.pids) - - # --- net - - @fewtimes_if_linux() - @pytest.mark.skipif(not HAS_NET_IO_COUNTERS, reason="not supported") - def test_net_io_counters(self): - self.execute(lambda: psutil.net_io_counters(nowrap=False)) - - @fewtimes_if_linux() - @pytest.mark.skipif(MACOS and os.getuid() != 0, reason="need root access") - def test_net_connections(self): - # always opens and handle on Windows() (once) - psutil.net_connections(kind='all') - with create_sockets(): - self.execute(lambda: psutil.net_connections(kind='all')) - - def test_net_if_addrs(self): - # Note: verified that on Windows this was a false positive. - tolerance = 80 * 1024 if WINDOWS else self.tolerance - self.execute(psutil.net_if_addrs, tolerance=tolerance) - - def test_net_if_stats(self): - self.execute(psutil.net_if_stats) - - # --- sensors - - @fewtimes_if_linux() - @pytest.mark.skipif(not HAS_SENSORS_BATTERY, reason="not supported") - def test_sensors_battery(self): - self.execute(psutil.sensors_battery) - - @fewtimes_if_linux() - @pytest.mark.skipif(not HAS_SENSORS_TEMPERATURES, reason="not supported") - def test_sensors_temperatures(self): - self.execute(psutil.sensors_temperatures) - - @fewtimes_if_linux() - @pytest.mark.skipif(not HAS_SENSORS_FANS, reason="not supported") - def test_sensors_fans(self): - self.execute(psutil.sensors_fans) - - # --- others - - @fewtimes_if_linux() - def test_boot_time(self): - self.execute(psutil.boot_time) - - def test_users(self): - self.execute(psutil.users) - - def test_set_debug(self): - self.execute(lambda: psutil._set_debug(False)) - - if WINDOWS: - - # --- win services - - def test_win_service_iter(self): - self.execute(cext.winservice_enumerate) - - def test_win_service_get(self): - pass - - def test_win_service_get_config(self): - name = next(psutil.win_service_iter()).name() - self.execute(lambda: cext.winservice_query_config(name)) - - def test_win_service_get_status(self): - name = next(psutil.win_service_iter()).name() - self.execute(lambda: cext.winservice_query_status(name)) - - def test_win_service_get_description(self): - name = next(psutil.win_service_iter()).name() - self.execute(lambda: cext.winservice_query_descr(name)) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_misc.py b/PortablePython/Lib/site-packages/psutil/tests/test_misc.py deleted file mode 100644 index c484264..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_misc.py +++ /dev/null @@ -1,873 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Miscellaneous tests.""" - -import collections -import contextlib -import io -import json -import os -import pickle -import socket -import sys -from unittest import mock - -import psutil -import psutil.tests -from psutil import WINDOWS -from psutil._common import bcat -from psutil._common import cat -from psutil._common import debug -from psutil._common import isfile_strict -from psutil._common import memoize -from psutil._common import memoize_when_activated -from psutil._common import parse_environ_block -from psutil._common import supports_ipv6 -from psutil._common import wrap_numbers -from psutil.tests import HAS_NET_IO_COUNTERS -from psutil.tests import PsutilTestCase -from psutil.tests import process_namespace -from psutil.tests import pytest -from psutil.tests import reload_module -from psutil.tests import system_namespace - - -# =================================================================== -# --- Test classes' repr(), str(), ... -# =================================================================== - - -class TestSpecialMethods(PsutilTestCase): - def test_check_pid_range(self): - with pytest.raises(OverflowError): - psutil._psplatform.cext.check_pid_range(2**128) - with pytest.raises(psutil.NoSuchProcess): - psutil.Process(2**128) - - def test_process__repr__(self, func=repr): - p = psutil.Process(self.spawn_testproc().pid) - r = func(p) - assert "psutil.Process" in r - assert f"pid={p.pid}" in r - assert f"name='{p.name()}'" in r.replace("name=u'", "name='") - assert "status=" in r - assert "exitcode=" not in r - p.terminate() - p.wait() - r = func(p) - assert "status='terminated'" in r - assert "exitcode=" in r - - with mock.patch.object( - psutil.Process, - "name", - side_effect=psutil.ZombieProcess(os.getpid()), - ): - p = psutil.Process() - r = func(p) - assert f"pid={p.pid}" in r - assert "status='zombie'" in r - assert "name=" not in r - with mock.patch.object( - psutil.Process, - "name", - side_effect=psutil.NoSuchProcess(os.getpid()), - ): - p = psutil.Process() - r = func(p) - assert f"pid={p.pid}" in r - assert "terminated" in r - assert "name=" not in r - with mock.patch.object( - psutil.Process, - "name", - side_effect=psutil.AccessDenied(os.getpid()), - ): - p = psutil.Process() - r = func(p) - assert f"pid={p.pid}" in r - assert "name=" not in r - - def test_process__str__(self): - self.test_process__repr__(func=str) - - def test_error__repr__(self): - assert repr(psutil.Error()) == "psutil.Error()" - - def test_error__str__(self): - assert str(psutil.Error()) == "" - - def test_no_such_process__repr__(self): - assert ( - repr(psutil.NoSuchProcess(321)) - == "psutil.NoSuchProcess(pid=321, msg='process no longer exists')" - ) - assert ( - repr(psutil.NoSuchProcess(321, name="name", msg="msg")) - == "psutil.NoSuchProcess(pid=321, name='name', msg='msg')" - ) - - def test_no_such_process__str__(self): - assert ( - str(psutil.NoSuchProcess(321)) - == "process no longer exists (pid=321)" - ) - assert ( - str(psutil.NoSuchProcess(321, name="name", msg="msg")) - == "msg (pid=321, name='name')" - ) - - def test_zombie_process__repr__(self): - assert ( - repr(psutil.ZombieProcess(321)) - == 'psutil.ZombieProcess(pid=321, msg="PID still ' - 'exists but it\'s a zombie")' - ) - assert ( - repr(psutil.ZombieProcess(321, name="name", ppid=320, msg="foo")) - == "psutil.ZombieProcess(pid=321, ppid=320, name='name'," - " msg='foo')" - ) - - def test_zombie_process__str__(self): - assert ( - str(psutil.ZombieProcess(321)) - == "PID still exists but it's a zombie (pid=321)" - ) - assert ( - str(psutil.ZombieProcess(321, name="name", ppid=320, msg="foo")) - == "foo (pid=321, ppid=320, name='name')" - ) - - def test_access_denied__repr__(self): - assert repr(psutil.AccessDenied(321)) == "psutil.AccessDenied(pid=321)" - assert ( - repr(psutil.AccessDenied(321, name="name", msg="msg")) - == "psutil.AccessDenied(pid=321, name='name', msg='msg')" - ) - - def test_access_denied__str__(self): - assert str(psutil.AccessDenied(321)) == "(pid=321)" - assert ( - str(psutil.AccessDenied(321, name="name", msg="msg")) - == "msg (pid=321, name='name')" - ) - - def test_timeout_expired__repr__(self): - assert ( - repr(psutil.TimeoutExpired(5)) - == "psutil.TimeoutExpired(seconds=5, msg='timeout after 5" - " seconds')" - ) - assert ( - repr(psutil.TimeoutExpired(5, pid=321, name="name")) - == "psutil.TimeoutExpired(pid=321, name='name', seconds=5, " - "msg='timeout after 5 seconds')" - ) - - def test_timeout_expired__str__(self): - assert str(psutil.TimeoutExpired(5)) == "timeout after 5 seconds" - assert ( - str(psutil.TimeoutExpired(5, pid=321, name="name")) - == "timeout after 5 seconds (pid=321, name='name')" - ) - - def test_process__eq__(self): - p1 = psutil.Process() - p2 = psutil.Process() - assert p1 == p2 - p2._ident = (0, 0) - assert p1 != p2 - assert p1 != 'foo' - - def test_process__hash__(self): - s = {psutil.Process(), psutil.Process()} - assert len(s) == 1 - - -# =================================================================== -# --- Misc, generic, corner cases -# =================================================================== - - -class TestMisc(PsutilTestCase): - def test__all__(self): - dir_psutil = dir(psutil) - for name in dir_psutil: - if name in { - 'debug', - 'tests', - 'test', - 'PermissionError', - 'ProcessLookupError', - }: - continue - if not name.startswith('_'): - try: - __import__(name) - except ImportError: - if name not in psutil.__all__: - fun = getattr(psutil, name) - if fun is None: - continue - if ( - fun.__doc__ is not None - and 'deprecated' not in fun.__doc__.lower() - ): - raise self.fail(f"{name!r} not in psutil.__all__") - - # Import 'star' will break if __all__ is inconsistent, see: - # https://github.com/giampaolo/psutil/issues/656 - # Can't do `from psutil import *` as it won't work - # so we simply iterate over __all__. - for name in psutil.__all__: - assert name in dir_psutil - - def test_version(self): - assert ( - '.'.join([str(x) for x in psutil.version_info]) - == psutil.__version__ - ) - - def test_process_as_dict_no_new_names(self): - # See https://github.com/giampaolo/psutil/issues/813 - p = psutil.Process() - p.foo = '1' - assert 'foo' not in p.as_dict() - - def test_serialization(self): - def check(ret): - json.loads(json.dumps(ret)) - - a = pickle.dumps(ret) - b = pickle.loads(a) - assert ret == b - - # --- process APIs - - proc = psutil.Process() - check(psutil.Process().as_dict()) - - ns = process_namespace(proc) - for fun, name in ns.iter(ns.getters, clear_cache=True): - with self.subTest(proc=proc, name=name): - try: - ret = fun() - except psutil.Error: - pass - else: - check(ret) - - # --- system APIs - - ns = system_namespace() - for fun, name in ns.iter(ns.getters): - if name in {"win_service_iter", "win_service_get"}: - continue - with self.subTest(name=name): - try: - ret = fun() - except psutil.AccessDenied: - pass - else: - check(ret) - - # --- exception classes - - b = pickle.loads( - pickle.dumps( - psutil.NoSuchProcess(pid=4567, name='name', msg='msg') - ) - ) - assert isinstance(b, psutil.NoSuchProcess) - assert b.pid == 4567 - assert b.name == 'name' - assert b.msg == 'msg' - - b = pickle.loads( - pickle.dumps( - psutil.ZombieProcess(pid=4567, name='name', ppid=42, msg='msg') - ) - ) - assert isinstance(b, psutil.ZombieProcess) - assert b.pid == 4567 - assert b.ppid == 42 - assert b.name == 'name' - assert b.msg == 'msg' - - b = pickle.loads( - pickle.dumps(psutil.AccessDenied(pid=123, name='name', msg='msg')) - ) - assert isinstance(b, psutil.AccessDenied) - assert b.pid == 123 - assert b.name == 'name' - assert b.msg == 'msg' - - b = pickle.loads( - pickle.dumps( - psutil.TimeoutExpired(seconds=33, pid=4567, name='name') - ) - ) - assert isinstance(b, psutil.TimeoutExpired) - assert b.seconds == 33 - assert b.pid == 4567 - assert b.name == 'name' - - def test_ad_on_process_creation(self): - # We are supposed to be able to instantiate Process also in case - # of zombie processes or access denied. - with mock.patch.object( - psutil.Process, '_get_ident', side_effect=psutil.AccessDenied - ) as meth: - psutil.Process() - assert meth.called - - with mock.patch.object( - psutil.Process, '_get_ident', side_effect=psutil.ZombieProcess(1) - ) as meth: - psutil.Process() - assert meth.called - - with mock.patch.object( - psutil.Process, '_get_ident', side_effect=ValueError - ) as meth: - with pytest.raises(ValueError): - psutil.Process() - assert meth.called - - with mock.patch.object( - psutil.Process, '_get_ident', side_effect=psutil.NoSuchProcess(1) - ) as meth: - with self.assertRaises(psutil.NoSuchProcess): - psutil.Process() - assert meth.called - - def test_sanity_version_check(self): - # see: https://github.com/giampaolo/psutil/issues/564 - with mock.patch( - "psutil._psplatform.cext.version", return_value="0.0.0" - ): - with pytest.raises(ImportError) as cm: - reload_module(psutil) - assert "version conflict" in str(cm.value).lower() - - -# =================================================================== -# --- psutil/_common.py utils -# =================================================================== - - -class TestMemoizeDecorator(PsutilTestCase): - def setUp(self): - self.calls = [] - - tearDown = setUp - - def run_against(self, obj, expected_retval=None): - # no args - for _ in range(2): - ret = obj() - assert self.calls == [((), {})] - if expected_retval is not None: - assert ret == expected_retval - # with args - for _ in range(2): - ret = obj(1) - assert self.calls == [((), {}), ((1,), {})] - if expected_retval is not None: - assert ret == expected_retval - # with args + kwargs - for _ in range(2): - ret = obj(1, bar=2) - assert self.calls == [((), {}), ((1,), {}), ((1,), {'bar': 2})] - if expected_retval is not None: - assert ret == expected_retval - # clear cache - assert len(self.calls) == 3 - obj.cache_clear() - ret = obj() - if expected_retval is not None: - assert ret == expected_retval - assert len(self.calls) == 4 - # docstring - assert obj.__doc__ == "My docstring." - - def test_function(self): - @memoize - def foo(*args, **kwargs): - """My docstring.""" - baseclass.calls.append((args, kwargs)) - return 22 - - baseclass = self - self.run_against(foo, expected_retval=22) - - def test_class(self): - @memoize - class Foo: - """My docstring.""" - - def __init__(self, *args, **kwargs): - baseclass.calls.append((args, kwargs)) - - def bar(self): - return 22 - - baseclass = self - self.run_against(Foo, expected_retval=None) - assert Foo().bar() == 22 - - def test_class_singleton(self): - # @memoize can be used against classes to create singletons - @memoize - class Bar: - def __init__(self, *args, **kwargs): - pass - - assert Bar() is Bar() - assert id(Bar()) == id(Bar()) - assert id(Bar(1)) == id(Bar(1)) - assert id(Bar(1, foo=3)) == id(Bar(1, foo=3)) - assert id(Bar(1)) != id(Bar(2)) - - def test_staticmethod(self): - class Foo: - @staticmethod - @memoize - def bar(*args, **kwargs): - """My docstring.""" - baseclass.calls.append((args, kwargs)) - return 22 - - baseclass = self - self.run_against(Foo().bar, expected_retval=22) - - def test_classmethod(self): - class Foo: - @classmethod - @memoize - def bar(cls, *args, **kwargs): - """My docstring.""" - baseclass.calls.append((args, kwargs)) - return 22 - - baseclass = self - self.run_against(Foo().bar, expected_retval=22) - - def test_original(self): - # This was the original test before I made it dynamic to test it - # against different types. Keeping it anyway. - @memoize - def foo(*args, **kwargs): - """Foo docstring.""" - calls.append(None) - return (args, kwargs) - - calls = [] - # no args - for _ in range(2): - ret = foo() - expected = ((), {}) - assert ret == expected - assert len(calls) == 1 - # with args - for _ in range(2): - ret = foo(1) - expected = ((1,), {}) - assert ret == expected - assert len(calls) == 2 - # with args + kwargs - for _ in range(2): - ret = foo(1, bar=2) - expected = ((1,), {'bar': 2}) - assert ret == expected - assert len(calls) == 3 - # clear cache - foo.cache_clear() - ret = foo() - expected = ((), {}) - assert ret == expected - assert len(calls) == 4 - # docstring - assert foo.__doc__ == "Foo docstring." - - -class TestCommonModule(PsutilTestCase): - def test_memoize_when_activated(self): - class Foo: - @memoize_when_activated - def foo(self): - calls.append(None) - - f = Foo() - calls = [] - f.foo() - f.foo() - assert len(calls) == 2 - - # activate - calls = [] - f.foo.cache_activate(f) - f.foo() - f.foo() - assert len(calls) == 1 - - # deactivate - calls = [] - f.foo.cache_deactivate(f) - f.foo() - f.foo() - assert len(calls) == 2 - - def test_parse_environ_block(self): - def k(s): - return s.upper() if WINDOWS else s - - assert parse_environ_block("a=1\0") == {k("a"): "1"} - assert parse_environ_block("a=1\0b=2\0\0") == { - k("a"): "1", - k("b"): "2", - } - assert parse_environ_block("a=1\0b=\0\0") == {k("a"): "1", k("b"): ""} - # ignore everything after \0\0 - assert parse_environ_block("a=1\0b=2\0\0c=3\0") == { - k("a"): "1", - k("b"): "2", - } - # ignore everything that is not an assignment - assert parse_environ_block("xxx\0a=1\0") == {k("a"): "1"} - assert parse_environ_block("a=1\0=b=2\0") == {k("a"): "1"} - # do not fail if the block is incomplete - assert parse_environ_block("a=1\0b=2") == {k("a"): "1"} - - def test_supports_ipv6(self): - self.addCleanup(supports_ipv6.cache_clear) - if supports_ipv6(): - with mock.patch('psutil._common.socket') as s: - s.has_ipv6 = False - supports_ipv6.cache_clear() - assert not supports_ipv6() - - supports_ipv6.cache_clear() - with mock.patch( - 'psutil._common.socket.socket', side_effect=OSError - ) as s: - assert not supports_ipv6() - assert s.called - - supports_ipv6.cache_clear() - with mock.patch( - 'psutil._common.socket.socket', side_effect=socket.gaierror - ) as s: - assert not supports_ipv6() - supports_ipv6.cache_clear() - assert s.called - - supports_ipv6.cache_clear() - with mock.patch( - 'psutil._common.socket.socket.bind', - side_effect=socket.gaierror, - ) as s: - assert not supports_ipv6() - supports_ipv6.cache_clear() - assert s.called - else: - with pytest.raises(OSError): - sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) - try: - sock.bind(("::1", 0)) - finally: - sock.close() - - def test_isfile_strict(self): - this_file = os.path.abspath(__file__) - assert isfile_strict(this_file) - assert not isfile_strict(os.path.dirname(this_file)) - with mock.patch('psutil._common.os.stat', side_effect=PermissionError): - with pytest.raises(OSError): - isfile_strict(this_file) - with mock.patch( - 'psutil._common.os.stat', side_effect=FileNotFoundError - ): - assert not isfile_strict(this_file) - with mock.patch('psutil._common.stat.S_ISREG', return_value=False): - assert not isfile_strict(this_file) - - def test_debug(self): - with mock.patch.object(psutil._common, "PSUTIL_DEBUG", True): - with contextlib.redirect_stderr(io.StringIO()) as f: - debug("hello") - sys.stderr.flush() - msg = f.getvalue() - assert msg.startswith("psutil-debug"), msg - assert "hello" in msg - assert __file__.replace('.pyc', '.py') in msg - - # supposed to use repr(exc) - with mock.patch.object(psutil._common, "PSUTIL_DEBUG", True): - with contextlib.redirect_stderr(io.StringIO()) as f: - debug(ValueError("this is an error")) - msg = f.getvalue() - assert "ignoring ValueError" in msg - assert "'this is an error'" in msg - - # supposed to use str(exc), because of extra info about file name - with mock.patch.object(psutil._common, "PSUTIL_DEBUG", True): - with contextlib.redirect_stderr(io.StringIO()) as f: - exc = OSError(2, "no such file") - exc.filename = "/foo" - debug(exc) - msg = f.getvalue() - assert "no such file" in msg - assert "/foo" in msg - - def test_cat_bcat(self): - testfn = self.get_testfn() - with open(testfn, "w") as f: - f.write("foo") - assert cat(testfn) == "foo" - assert bcat(testfn) == b"foo" - with pytest.raises(FileNotFoundError): - cat(testfn + '-invalid') - with pytest.raises(FileNotFoundError): - bcat(testfn + '-invalid') - assert cat(testfn + '-invalid', fallback="bar") == "bar" - assert bcat(testfn + '-invalid', fallback="bar") == "bar" - - -# =================================================================== -# --- Tests for wrap_numbers() function. -# =================================================================== - - -nt = collections.namedtuple('foo', 'a b c') - - -class TestWrapNumbers(PsutilTestCase): - def setUp(self): - wrap_numbers.cache_clear() - - tearDown = setUp - - def test_first_call(self): - input = {'disk1': nt(5, 5, 5)} - assert wrap_numbers(input, 'disk_io') == input - - def test_input_hasnt_changed(self): - input = {'disk1': nt(5, 5, 5)} - assert wrap_numbers(input, 'disk_io') == input - assert wrap_numbers(input, 'disk_io') == input - - def test_increase_but_no_wrap(self): - input = {'disk1': nt(5, 5, 5)} - assert wrap_numbers(input, 'disk_io') == input - input = {'disk1': nt(10, 15, 20)} - assert wrap_numbers(input, 'disk_io') == input - input = {'disk1': nt(20, 25, 30)} - assert wrap_numbers(input, 'disk_io') == input - input = {'disk1': nt(20, 25, 30)} - assert wrap_numbers(input, 'disk_io') == input - - def test_wrap(self): - # let's say 100 is the threshold - input = {'disk1': nt(100, 100, 100)} - assert wrap_numbers(input, 'disk_io') == input - # first wrap restarts from 10 - input = {'disk1': nt(100, 100, 10)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(100, 100, 110)} - # then it remains the same - input = {'disk1': nt(100, 100, 10)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(100, 100, 110)} - # then it goes up - input = {'disk1': nt(100, 100, 90)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(100, 100, 190)} - # then it wraps again - input = {'disk1': nt(100, 100, 20)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(100, 100, 210)} - # and remains the same - input = {'disk1': nt(100, 100, 20)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(100, 100, 210)} - # now wrap another num - input = {'disk1': nt(50, 100, 20)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(150, 100, 210)} - # and again - input = {'disk1': nt(40, 100, 20)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(190, 100, 210)} - # keep it the same - input = {'disk1': nt(40, 100, 20)} - assert wrap_numbers(input, 'disk_io') == {'disk1': nt(190, 100, 210)} - - def test_changing_keys(self): - # Emulate a case where the second call to disk_io() - # (or whatever) provides a new disk, then the new disk - # disappears on the third call. - input = {'disk1': nt(5, 5, 5)} - assert wrap_numbers(input, 'disk_io') == input - input = {'disk1': nt(5, 5, 5), 'disk2': nt(7, 7, 7)} - assert wrap_numbers(input, 'disk_io') == input - input = {'disk1': nt(8, 8, 8)} - assert wrap_numbers(input, 'disk_io') == input - - def test_changing_keys_w_wrap(self): - input = {'disk1': nt(50, 50, 50), 'disk2': nt(100, 100, 100)} - assert wrap_numbers(input, 'disk_io') == input - # disk 2 wraps - input = {'disk1': nt(50, 50, 50), 'disk2': nt(100, 100, 10)} - assert wrap_numbers(input, 'disk_io') == { - 'disk1': nt(50, 50, 50), - 'disk2': nt(100, 100, 110), - } - # disk 2 disappears - input = {'disk1': nt(50, 50, 50)} - assert wrap_numbers(input, 'disk_io') == input - - # then it appears again; the old wrap is supposed to be - # gone. - input = {'disk1': nt(50, 50, 50), 'disk2': nt(100, 100, 100)} - assert wrap_numbers(input, 'disk_io') == input - # remains the same - input = {'disk1': nt(50, 50, 50), 'disk2': nt(100, 100, 100)} - assert wrap_numbers(input, 'disk_io') == input - # and then wraps again - input = {'disk1': nt(50, 50, 50), 'disk2': nt(100, 100, 10)} - assert wrap_numbers(input, 'disk_io') == { - 'disk1': nt(50, 50, 50), - 'disk2': nt(100, 100, 110), - } - - def test_real_data(self): - d = { - 'nvme0n1': (300, 508, 640, 1571, 5970, 1987, 2049, 451751, 47048), - 'nvme0n1p1': (1171, 2, 5600256, 1024, 516, 0, 0, 0, 8), - 'nvme0n1p2': (54, 54, 2396160, 5165056, 4, 24, 30, 1207, 28), - 'nvme0n1p3': (2389, 4539, 5154, 150, 4828, 1844, 2019, 398, 348), - } - assert wrap_numbers(d, 'disk_io') == d - assert wrap_numbers(d, 'disk_io') == d - # decrease this ↓ - d = { - 'nvme0n1': (100, 508, 640, 1571, 5970, 1987, 2049, 451751, 47048), - 'nvme0n1p1': (1171, 2, 5600256, 1024, 516, 0, 0, 0, 8), - 'nvme0n1p2': (54, 54, 2396160, 5165056, 4, 24, 30, 1207, 28), - 'nvme0n1p3': (2389, 4539, 5154, 150, 4828, 1844, 2019, 398, 348), - } - out = wrap_numbers(d, 'disk_io') - assert out['nvme0n1'][0] == 400 - - # --- cache tests - - def test_cache_first_call(self): - input = {'disk1': nt(5, 5, 5)} - wrap_numbers(input, 'disk_io') - cache = wrap_numbers.cache_info() - assert cache[0] == {'disk_io': input} - assert cache[1] == {'disk_io': {}} - assert cache[2] == {'disk_io': {}} - - def test_cache_call_twice(self): - input = {'disk1': nt(5, 5, 5)} - wrap_numbers(input, 'disk_io') - input = {'disk1': nt(10, 10, 10)} - wrap_numbers(input, 'disk_io') - cache = wrap_numbers.cache_info() - assert cache[0] == {'disk_io': input} - assert cache[1] == { - 'disk_io': {('disk1', 0): 0, ('disk1', 1): 0, ('disk1', 2): 0} - } - assert cache[2] == {'disk_io': {}} - - def test_cache_wrap(self): - # let's say 100 is the threshold - input = {'disk1': nt(100, 100, 100)} - wrap_numbers(input, 'disk_io') - - # first wrap restarts from 10 - input = {'disk1': nt(100, 100, 10)} - wrap_numbers(input, 'disk_io') - cache = wrap_numbers.cache_info() - assert cache[0] == {'disk_io': input} - assert cache[1] == { - 'disk_io': {('disk1', 0): 0, ('disk1', 1): 0, ('disk1', 2): 100} - } - assert cache[2] == {'disk_io': {'disk1': {('disk1', 2)}}} - - def check_cache_info(): - cache = wrap_numbers.cache_info() - assert cache[1] == { - 'disk_io': { - ('disk1', 0): 0, - ('disk1', 1): 0, - ('disk1', 2): 100, - } - } - assert cache[2] == {'disk_io': {'disk1': {('disk1', 2)}}} - - # then it remains the same - input = {'disk1': nt(100, 100, 10)} - wrap_numbers(input, 'disk_io') - cache = wrap_numbers.cache_info() - assert cache[0] == {'disk_io': input} - check_cache_info() - - # then it goes up - input = {'disk1': nt(100, 100, 90)} - wrap_numbers(input, 'disk_io') - cache = wrap_numbers.cache_info() - assert cache[0] == {'disk_io': input} - check_cache_info() - - # then it wraps again - input = {'disk1': nt(100, 100, 20)} - wrap_numbers(input, 'disk_io') - cache = wrap_numbers.cache_info() - assert cache[0] == {'disk_io': input} - assert cache[1] == { - 'disk_io': {('disk1', 0): 0, ('disk1', 1): 0, ('disk1', 2): 190} - } - assert cache[2] == {'disk_io': {'disk1': {('disk1', 2)}}} - - def test_cache_changing_keys(self): - input = {'disk1': nt(5, 5, 5)} - wrap_numbers(input, 'disk_io') - input = {'disk1': nt(5, 5, 5), 'disk2': nt(7, 7, 7)} - wrap_numbers(input, 'disk_io') - cache = wrap_numbers.cache_info() - assert cache[0] == {'disk_io': input} - assert cache[1] == { - 'disk_io': {('disk1', 0): 0, ('disk1', 1): 0, ('disk1', 2): 0} - } - assert cache[2] == {'disk_io': {}} - - def test_cache_clear(self): - input = {'disk1': nt(5, 5, 5)} - wrap_numbers(input, 'disk_io') - wrap_numbers(input, 'disk_io') - wrap_numbers.cache_clear('disk_io') - assert wrap_numbers.cache_info() == ({}, {}, {}) - wrap_numbers.cache_clear('disk_io') - wrap_numbers.cache_clear('?!?') - - @pytest.mark.skipif(not HAS_NET_IO_COUNTERS, reason="not supported") - def test_cache_clear_public_apis(self): - if not psutil.disk_io_counters() or not psutil.net_io_counters(): - raise pytest.skip("no disks or NICs available") - psutil.disk_io_counters() - psutil.net_io_counters() - caches = wrap_numbers.cache_info() - for cache in caches: - assert 'psutil.disk_io_counters' in cache - assert 'psutil.net_io_counters' in cache - - psutil.disk_io_counters.cache_clear() - caches = wrap_numbers.cache_info() - for cache in caches: - assert 'psutil.net_io_counters' in cache - assert 'psutil.disk_io_counters' not in cache - - psutil.net_io_counters.cache_clear() - caches = wrap_numbers.cache_info() - assert caches == ({}, {}, {}) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_osx.py b/PortablePython/Lib/site-packages/psutil/tests/test_osx.py deleted file mode 100644 index 050418c..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_osx.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""macOS specific tests.""" - -import platform -import re -import time - -import psutil -from psutil import MACOS -from psutil import POSIX -from psutil.tests import CI_TESTING -from psutil.tests import HAS_BATTERY -from psutil.tests import TOLERANCE_DISK_USAGE -from psutil.tests import TOLERANCE_SYS_MEM -from psutil.tests import PsutilTestCase -from psutil.tests import pytest -from psutil.tests import retry_on_failure -from psutil.tests import sh -from psutil.tests import spawn_testproc -from psutil.tests import terminate - - -if POSIX: - from psutil._psutil_posix import getpagesize - - -def sysctl(cmdline): - """Expects a sysctl command with an argument and parse the result - returning only the value of interest. - """ - out = sh(cmdline) - result = out.split()[1] - try: - return int(result) - except ValueError: - return result - - -def vm_stat(field): - """Wrapper around 'vm_stat' cmdline utility.""" - out = sh('vm_stat') - for line in out.split('\n'): - if field in line: - break - else: - raise ValueError("line not found") - return int(re.search(r'\d+', line).group(0)) * getpagesize() - - -@pytest.mark.skipif(not MACOS, reason="MACOS only") -class TestProcess(PsutilTestCase): - @classmethod - def setUpClass(cls): - cls.pid = spawn_testproc().pid - - @classmethod - def tearDownClass(cls): - terminate(cls.pid) - - def test_process_create_time(self): - output = sh(f"ps -o lstart -p {self.pid}") - start_ps = output.replace('STARTED', '').strip() - hhmmss = start_ps.split(' ')[-2] - year = start_ps.split(' ')[-1] - start_psutil = psutil.Process(self.pid).create_time() - assert hhmmss == time.strftime( - "%H:%M:%S", time.localtime(start_psutil) - ) - assert year == time.strftime("%Y", time.localtime(start_psutil)) - - -@pytest.mark.skipif(not MACOS, reason="MACOS only") -class TestSystemAPIs(PsutilTestCase): - - # --- disk - - @retry_on_failure() - def test_disks(self): - # test psutil.disk_usage() and psutil.disk_partitions() - # against "df -a" - def df(path): - out = sh(f'df -k "{path}"').strip() - lines = out.split('\n') - lines.pop(0) - line = lines.pop(0) - dev, total, used, free = line.split()[:4] - if dev == 'none': - dev = '' - total = int(total) * 1024 - used = int(used) * 1024 - free = int(free) * 1024 - return dev, total, used, free - - for part in psutil.disk_partitions(all=False): - usage = psutil.disk_usage(part.mountpoint) - dev, total, used, free = df(part.mountpoint) - assert part.device == dev - assert usage.total == total - assert abs(usage.free - free) < TOLERANCE_DISK_USAGE - assert abs(usage.used - used) < TOLERANCE_DISK_USAGE - - # --- cpu - - def test_cpu_count_logical(self): - num = sysctl("sysctl hw.logicalcpu") - assert num == psutil.cpu_count(logical=True) - - def test_cpu_count_cores(self): - num = sysctl("sysctl hw.physicalcpu") - assert num == psutil.cpu_count(logical=False) - - # TODO: remove this once 1892 is fixed - @pytest.mark.skipif( - MACOS and platform.machine() == 'arm64', reason="skipped due to #1892" - ) - def test_cpu_freq(self): - freq = psutil.cpu_freq() - assert freq.current * 1000 * 1000 == sysctl("sysctl hw.cpufrequency") - assert freq.min * 1000 * 1000 == sysctl("sysctl hw.cpufrequency_min") - assert freq.max * 1000 * 1000 == sysctl("sysctl hw.cpufrequency_max") - - # --- virtual mem - - def test_vmem_total(self): - sysctl_hwphymem = sysctl('sysctl hw.memsize') - assert sysctl_hwphymem == psutil.virtual_memory().total - - @pytest.mark.skipif( - CI_TESTING and MACOS and platform.machine() == 'arm64', - reason="skipped on MACOS + ARM64 + CI_TESTING", - ) - @retry_on_failure() - def test_vmem_free(self): - vmstat_val = vm_stat("free") - psutil_val = psutil.virtual_memory().free - assert abs(psutil_val - vmstat_val) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_active(self): - vmstat_val = vm_stat("active") - psutil_val = psutil.virtual_memory().active - assert abs(psutil_val - vmstat_val) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_inactive(self): - vmstat_val = vm_stat("inactive") - psutil_val = psutil.virtual_memory().inactive - assert abs(psutil_val - vmstat_val) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_vmem_wired(self): - vmstat_val = vm_stat("wired") - psutil_val = psutil.virtual_memory().wired - assert abs(psutil_val - vmstat_val) < TOLERANCE_SYS_MEM - - # --- swap mem - - @retry_on_failure() - def test_swapmem_sin(self): - vmstat_val = vm_stat("Pageins") - psutil_val = psutil.swap_memory().sin - assert abs(psutil_val - vmstat_val) < TOLERANCE_SYS_MEM - - @retry_on_failure() - def test_swapmem_sout(self): - vmstat_val = vm_stat("Pageout") - psutil_val = psutil.swap_memory().sout - assert abs(psutil_val - vmstat_val) < TOLERANCE_SYS_MEM - - # --- network - - def test_net_if_stats(self): - for name, stats in psutil.net_if_stats().items(): - try: - out = sh(f"ifconfig {name}") - except RuntimeError: - pass - else: - assert stats.isup == ('RUNNING' in out), out - assert stats.mtu == int(re.findall(r'mtu (\d+)', out)[0]) - - # --- sensors_battery - - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_sensors_battery(self): - out = sh("pmset -g batt") - percent = re.search(r"(\d+)%", out).group(1) - drawing_from = re.search(r"Now drawing from '([^']+)'", out).group(1) - power_plugged = drawing_from == "AC Power" - psutil_result = psutil.sensors_battery() - assert psutil_result.power_plugged == power_plugged - assert psutil_result.percent == int(percent) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_posix.py b/PortablePython/Lib/site-packages/psutil/tests/test_posix.py deleted file mode 100644 index a784492..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_posix.py +++ /dev/null @@ -1,488 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""POSIX specific tests.""" - -import datetime -import errno -import os -import re -import shutil -import subprocess -import time -from unittest import mock - -import psutil -from psutil import AIX -from psutil import BSD -from psutil import LINUX -from psutil import MACOS -from psutil import OPENBSD -from psutil import POSIX -from psutil import SUNOS -from psutil.tests import AARCH64 -from psutil.tests import HAS_NET_IO_COUNTERS -from psutil.tests import PYTHON_EXE -from psutil.tests import PsutilTestCase -from psutil.tests import pytest -from psutil.tests import retry_on_failure -from psutil.tests import sh -from psutil.tests import skip_on_access_denied -from psutil.tests import spawn_testproc -from psutil.tests import terminate - - -if POSIX: - import mmap - import resource - - from psutil._psutil_posix import getpagesize - - -def ps(fmt, pid=None): - """Wrapper for calling the ps command with a little bit of cross-platform - support for a narrow range of features. - """ - - cmd = ['ps'] - - if LINUX: - cmd.append('--no-headers') - - if pid is not None: - cmd.extend(['-p', str(pid)]) - elif SUNOS or AIX: - cmd.append('-A') - else: - cmd.append('ax') - - if SUNOS: - fmt = fmt.replace("start", "stime") - - cmd.extend(['-o', fmt]) - - output = sh(cmd) - - output = output.splitlines() if LINUX else output.splitlines()[1:] - - all_output = [] - for line in output: - line = line.strip() - - try: - line = int(line) - except ValueError: - pass - - all_output.append(line) - - if pid is None: - return all_output - else: - return all_output[0] - - -# ps "-o" field names differ wildly between platforms. -# "comm" means "only executable name" but is not available on BSD platforms. -# "args" means "command with all its arguments", and is also not available -# on BSD platforms. -# "command" is like "args" on most platforms, but like "comm" on AIX, -# and not available on SUNOS. -# so for the executable name we can use "comm" on Solaris and split "command" -# on other platforms. -# to get the cmdline (with args) we have to use "args" on AIX and -# Solaris, and can use "command" on all others. - - -def ps_name(pid): - field = "command" - if SUNOS: - field = "comm" - command = ps(field, pid).split() - return command[0] - - -def ps_args(pid): - field = "command" - if AIX or SUNOS: - field = "args" - out = ps(field, pid) - # observed on BSD + Github CI: '/usr/local/bin/python3 -E -O (python3.9)' - out = re.sub(r"\(python.*?\)$", "", out) - return out.strip() - - -def ps_rss(pid): - field = "rss" - if AIX: - field = "rssize" - return ps(field, pid) - - -def ps_vsz(pid): - field = "vsz" - if AIX: - field = "vsize" - return ps(field, pid) - - -def df(device): - try: - out = sh(f"df -k {device}").strip() - except RuntimeError as err: - if "device busy" in str(err).lower(): - raise pytest.skip("df returned EBUSY") - raise - line = out.split('\n')[1] - fields = line.split() - sys_total = int(fields[1]) * 1024 - sys_used = int(fields[2]) * 1024 - sys_free = int(fields[3]) * 1024 - sys_percent = float(fields[4].replace('%', '')) - return (sys_total, sys_used, sys_free, sys_percent) - - -@pytest.mark.skipif(not POSIX, reason="POSIX only") -class TestProcess(PsutilTestCase): - """Compare psutil results against 'ps' command line utility (mainly).""" - - @classmethod - def setUpClass(cls): - cls.pid = spawn_testproc( - [PYTHON_EXE, "-E", "-O"], stdin=subprocess.PIPE - ).pid - - @classmethod - def tearDownClass(cls): - terminate(cls.pid) - - def test_ppid(self): - ppid_ps = ps('ppid', self.pid) - ppid_psutil = psutil.Process(self.pid).ppid() - assert ppid_ps == ppid_psutil - - def test_uid(self): - uid_ps = ps('uid', self.pid) - uid_psutil = psutil.Process(self.pid).uids().real - assert uid_ps == uid_psutil - - def test_gid(self): - gid_ps = ps('rgid', self.pid) - gid_psutil = psutil.Process(self.pid).gids().real - assert gid_ps == gid_psutil - - def test_username(self): - username_ps = ps('user', self.pid) - username_psutil = psutil.Process(self.pid).username() - assert username_ps == username_psutil - - def test_username_no_resolution(self): - # Emulate a case where the system can't resolve the uid to - # a username in which case psutil is supposed to return - # the stringified uid. - p = psutil.Process() - with mock.patch("psutil.pwd.getpwuid", side_effect=KeyError) as fun: - assert p.username() == str(p.uids().real) - assert fun.called - - @skip_on_access_denied() - @retry_on_failure() - def test_rss_memory(self): - # give python interpreter some time to properly initialize - # so that the results are the same - time.sleep(0.1) - rss_ps = ps_rss(self.pid) - rss_psutil = psutil.Process(self.pid).memory_info()[0] / 1024 - assert rss_ps == rss_psutil - - @skip_on_access_denied() - @retry_on_failure() - def test_vsz_memory(self): - # give python interpreter some time to properly initialize - # so that the results are the same - time.sleep(0.1) - vsz_ps = ps_vsz(self.pid) - vsz_psutil = psutil.Process(self.pid).memory_info()[1] / 1024 - assert vsz_ps == vsz_psutil - - def test_name(self): - name_ps = ps_name(self.pid) - # remove path if there is any, from the command - name_ps = os.path.basename(name_ps).lower() - name_psutil = psutil.Process(self.pid).name().lower() - # ...because of how we calculate PYTHON_EXE; on MACOS this may - # be "pythonX.Y". - name_ps = re.sub(r"\d.\d", "", name_ps) - name_psutil = re.sub(r"\d.\d", "", name_psutil) - # ...may also be "python.X" - name_ps = re.sub(r"\d", "", name_ps) - name_psutil = re.sub(r"\d", "", name_psutil) - assert name_ps == name_psutil - - def test_name_long(self): - # On UNIX the kernel truncates the name to the first 15 - # characters. In such a case psutil tries to determine the - # full name from the cmdline. - name = "long-program-name" - cmdline = ["long-program-name-extended", "foo", "bar"] - with mock.patch("psutil._psplatform.Process.name", return_value=name): - with mock.patch( - "psutil._psplatform.Process.cmdline", return_value=cmdline - ): - p = psutil.Process() - assert p.name() == "long-program-name-extended" - - def test_name_long_cmdline_ad_exc(self): - # Same as above but emulates a case where cmdline() raises - # AccessDenied in which case psutil is supposed to return - # the truncated name instead of crashing. - name = "long-program-name" - with mock.patch("psutil._psplatform.Process.name", return_value=name): - with mock.patch( - "psutil._psplatform.Process.cmdline", - side_effect=psutil.AccessDenied(0, ""), - ): - p = psutil.Process() - assert p.name() == "long-program-name" - - def test_name_long_cmdline_nsp_exc(self): - # Same as above but emulates a case where cmdline() raises NSP - # which is supposed to propagate. - name = "long-program-name" - with mock.patch("psutil._psplatform.Process.name", return_value=name): - with mock.patch( - "psutil._psplatform.Process.cmdline", - side_effect=psutil.NoSuchProcess(0, ""), - ): - p = psutil.Process() - with pytest.raises(psutil.NoSuchProcess): - p.name() - - @pytest.mark.skipif(MACOS or BSD, reason="ps -o start not available") - def test_create_time(self): - time_ps = ps('start', self.pid) - time_psutil = psutil.Process(self.pid).create_time() - time_psutil_tstamp = datetime.datetime.fromtimestamp( - time_psutil - ).strftime("%H:%M:%S") - # sometimes ps shows the time rounded up instead of down, so we check - # for both possible values - round_time_psutil = round(time_psutil) - round_time_psutil_tstamp = datetime.datetime.fromtimestamp( - round_time_psutil - ).strftime("%H:%M:%S") - assert time_ps in {time_psutil_tstamp, round_time_psutil_tstamp} - - def test_exe(self): - ps_pathname = ps_name(self.pid) - psutil_pathname = psutil.Process(self.pid).exe() - try: - assert ps_pathname == psutil_pathname - except AssertionError: - # certain platforms such as BSD are more accurate returning: - # "/usr/local/bin/python3.7" - # ...instead of: - # "/usr/local/bin/python" - # We do not want to consider this difference in accuracy - # an error. - adjusted_ps_pathname = ps_pathname[: len(ps_pathname)] - assert ps_pathname == adjusted_ps_pathname - - # On macOS the official python installer exposes a python wrapper that - # executes a python executable hidden inside an application bundle inside - # the Python framework. - # There's a race condition between the ps call & the psutil call below - # depending on the completion of the execve call so let's retry on failure - @retry_on_failure() - def test_cmdline(self): - ps_cmdline = ps_args(self.pid) - psutil_cmdline = " ".join(psutil.Process(self.pid).cmdline()) - if AARCH64 and len(ps_cmdline) < len(psutil_cmdline): - assert psutil_cmdline.startswith(ps_cmdline) - else: - assert ps_cmdline == psutil_cmdline - - # On SUNOS "ps" reads niceness /proc/pid/psinfo which returns an - # incorrect value (20); the real deal is getpriority(2) which - # returns 0; psutil relies on it, see: - # https://github.com/giampaolo/psutil/issues/1082 - # AIX has the same issue - @pytest.mark.skipif(SUNOS, reason="not reliable on SUNOS") - @pytest.mark.skipif(AIX, reason="not reliable on AIX") - def test_nice(self): - ps_nice = ps('nice', self.pid) - psutil_nice = psutil.Process().nice() - assert ps_nice == psutil_nice - - -@pytest.mark.skipif(not POSIX, reason="POSIX only") -class TestSystemAPIs(PsutilTestCase): - """Test some system APIs.""" - - @retry_on_failure() - def test_pids(self): - # Note: this test might fail if the OS is starting/killing - # other processes in the meantime - pids_ps = sorted(ps("pid")) - pids_psutil = psutil.pids() - - # on MACOS and OPENBSD ps doesn't show pid 0 - if MACOS or (OPENBSD and 0 not in pids_ps): - pids_ps.insert(0, 0) - - # There will often be one more process in pids_ps for ps itself - if len(pids_ps) - len(pids_psutil) > 1: - difference = [x for x in pids_psutil if x not in pids_ps] + [ - x for x in pids_ps if x not in pids_psutil - ] - raise self.fail("difference: " + str(difference)) - - # for some reason ifconfig -a does not report all interfaces - # returned by psutil - @pytest.mark.skipif(SUNOS, reason="unreliable on SUNOS") - @pytest.mark.skipif(not shutil.which("ifconfig"), reason="no ifconfig cmd") - @pytest.mark.skipif(not HAS_NET_IO_COUNTERS, reason="not supported") - def test_nic_names(self): - output = sh("ifconfig -a") - for nic in psutil.net_io_counters(pernic=True): - for line in output.split(): - if line.startswith(nic): - break - else: - raise self.fail( - f"couldn't find {nic} nic in 'ifconfig -a'" - f" output\n{output}" - ) - - # @pytest.mark.skipif(CI_TESTING and not psutil.users(), - # reason="unreliable on CI") - @retry_on_failure() - def test_users(self): - out = sh("who -u") - if not out.strip(): - raise pytest.skip("no users on this system") - lines = out.split('\n') - users = [x.split()[0] for x in lines] - terminals = [x.split()[1] for x in lines] - assert len(users) == len(psutil.users()) - with self.subTest(psutil=psutil.users(), who=out): - for idx, u in enumerate(psutil.users()): - assert u.name == users[idx] - assert u.terminal == terminals[idx] - if u.pid is not None: # None on OpenBSD - psutil.Process(u.pid) - - @retry_on_failure() - def test_users_started(self): - out = sh("who -u") - if not out.strip(): - raise pytest.skip("no users on this system") - tstamp = None - # '2023-04-11 09:31' (Linux) - started = re.findall(r"\d\d\d\d-\d\d-\d\d \d\d:\d\d", out) - if started: - tstamp = "%Y-%m-%d %H:%M" - else: - # 'Apr 10 22:27' (macOS) - started = re.findall(r"[A-Z][a-z][a-z] \d\d \d\d:\d\d", out) - if started: - tstamp = "%b %d %H:%M" - else: - # 'Apr 10' - started = re.findall(r"[A-Z][a-z][a-z] \d\d", out) - if started: - tstamp = "%b %d" - else: - # 'apr 10' (sunOS) - started = re.findall(r"[a-z][a-z][a-z] \d\d", out) - if started: - tstamp = "%b %d" - started = [x.capitalize() for x in started] - - if not tstamp: - raise pytest.skip(f"cannot interpret tstamp in who output\n{out}") - - with self.subTest(psutil=psutil.users(), who=out): - for idx, u in enumerate(psutil.users()): - psutil_value = datetime.datetime.fromtimestamp( - u.started - ).strftime(tstamp) - assert psutil_value == started[idx] - - def test_pid_exists_let_raise(self): - # According to "man 2 kill" possible error values for kill - # are (EINVAL, EPERM, ESRCH). Test that any other errno - # results in an exception. - with mock.patch( - "psutil._psposix.os.kill", side_effect=OSError(errno.EBADF, "") - ) as m: - with pytest.raises(OSError): - psutil._psposix.pid_exists(os.getpid()) - assert m.called - - def test_os_waitpid_let_raise(self): - # os.waitpid() is supposed to catch EINTR and ECHILD only. - # Test that any other errno results in an exception. - with mock.patch( - "psutil._psposix.os.waitpid", side_effect=OSError(errno.EBADF, "") - ) as m: - with pytest.raises(OSError): - psutil._psposix.wait_pid(os.getpid()) - assert m.called - - def test_os_waitpid_eintr(self): - # os.waitpid() is supposed to "retry" on EINTR. - with mock.patch( - "psutil._psposix.os.waitpid", side_effect=OSError(errno.EINTR, "") - ) as m: - with pytest.raises(psutil._psposix.TimeoutExpired): - psutil._psposix.wait_pid(os.getpid(), timeout=0.01) - assert m.called - - def test_os_waitpid_bad_ret_status(self): - # Simulate os.waitpid() returning a bad status. - with mock.patch( - "psutil._psposix.os.waitpid", return_value=(1, -1) - ) as m: - with pytest.raises(ValueError): - psutil._psposix.wait_pid(os.getpid()) - assert m.called - - # AIX can return '-' in df output instead of numbers, e.g. for /proc - @pytest.mark.skipif(AIX, reason="unreliable on AIX") - @retry_on_failure() - def test_disk_usage(self): - tolerance = 4 * 1024 * 1024 # 4MB - for part in psutil.disk_partitions(all=False): - usage = psutil.disk_usage(part.mountpoint) - try: - sys_total, sys_used, sys_free, sys_percent = df(part.device) - except RuntimeError as err: - # see: - # https://travis-ci.org/giampaolo/psutil/jobs/138338464 - # https://travis-ci.org/giampaolo/psutil/jobs/138343361 - err = str(err).lower() - if ( - "no such file or directory" in err - or "raw devices not supported" in err - or "permission denied" in err - ): - continue - raise - else: - assert abs(usage.total - sys_total) < tolerance - assert abs(usage.used - sys_used) < tolerance - assert abs(usage.free - sys_free) < tolerance - assert abs(usage.percent - sys_percent) <= 1 - - -@pytest.mark.skipif(not POSIX, reason="POSIX only") -class TestMisc(PsutilTestCase): - def test_getpagesize(self): - pagesize = getpagesize() - assert pagesize > 0 - assert pagesize == resource.getpagesize() - assert pagesize == mmap.PAGESIZE diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_process.py b/PortablePython/Lib/site-packages/psutil/tests/test_process.py deleted file mode 100644 index 9ba1ba0..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_process.py +++ /dev/null @@ -1,1667 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for psutil.Process class.""" - -import collections -import contextlib -import errno -import getpass -import io -import itertools -import os -import signal -import socket -import stat -import string -import subprocess -import sys -import textwrap -import time -from unittest import mock - -import psutil -from psutil import AIX -from psutil import BSD -from psutil import LINUX -from psutil import MACOS -from psutil import NETBSD -from psutil import OPENBSD -from psutil import OSX -from psutil import POSIX -from psutil import WINDOWS -from psutil._common import open_text -from psutil.tests import CI_TESTING -from psutil.tests import GITHUB_ACTIONS -from psutil.tests import GLOBAL_TIMEOUT -from psutil.tests import HAS_CPU_AFFINITY -from psutil.tests import HAS_ENVIRON -from psutil.tests import HAS_IONICE -from psutil.tests import HAS_MEMORY_MAPS -from psutil.tests import HAS_PROC_CPU_NUM -from psutil.tests import HAS_PROC_IO_COUNTERS -from psutil.tests import HAS_RLIMIT -from psutil.tests import HAS_THREADS -from psutil.tests import MACOS_11PLUS -from psutil.tests import PYPY -from psutil.tests import PYTHON_EXE -from psutil.tests import PYTHON_EXE_ENV -from psutil.tests import PsutilTestCase -from psutil.tests import ThreadTask -from psutil.tests import call_until -from psutil.tests import copyload_shared_lib -from psutil.tests import create_c_exe -from psutil.tests import create_py_exe -from psutil.tests import process_namespace -from psutil.tests import pytest -from psutil.tests import reap_children -from psutil.tests import retry_on_failure -from psutil.tests import sh -from psutil.tests import skip_on_access_denied -from psutil.tests import skip_on_not_implemented -from psutil.tests import wait_for_pid - - -# =================================================================== -# --- psutil.Process class tests -# =================================================================== - - -class TestProcess(PsutilTestCase): - """Tests for psutil.Process class.""" - - def spawn_psproc(self, *args, **kwargs): - sproc = self.spawn_testproc(*args, **kwargs) - try: - return psutil.Process(sproc.pid) - except psutil.NoSuchProcess: - self.assertPidGone(sproc.pid) - raise - - # --- - - def test_pid(self): - p = psutil.Process() - assert p.pid == os.getpid() - with pytest.raises(AttributeError): - p.pid = 33 - - def test_kill(self): - p = self.spawn_psproc() - p.kill() - code = p.wait() - if WINDOWS: - assert code == signal.SIGTERM - else: - assert code == -signal.SIGKILL - self.assertProcessGone(p) - - def test_terminate(self): - p = self.spawn_psproc() - p.terminate() - code = p.wait() - if WINDOWS: - assert code == signal.SIGTERM - else: - assert code == -signal.SIGTERM - self.assertProcessGone(p) - - def test_send_signal(self): - sig = signal.SIGKILL if POSIX else signal.SIGTERM - p = self.spawn_psproc() - p.send_signal(sig) - code = p.wait() - if WINDOWS: - assert code == sig - else: - assert code == -sig - self.assertProcessGone(p) - - @pytest.mark.skipif(not POSIX, reason="not POSIX") - def test_send_signal_mocked(self): - sig = signal.SIGTERM - p = self.spawn_psproc() - with mock.patch('psutil.os.kill', side_effect=ProcessLookupError): - with pytest.raises(psutil.NoSuchProcess): - p.send_signal(sig) - - p = self.spawn_psproc() - with mock.patch('psutil.os.kill', side_effect=PermissionError): - with pytest.raises(psutil.AccessDenied): - p.send_signal(sig) - - def test_wait_exited(self): - # Test waitpid() + WIFEXITED -> WEXITSTATUS. - # normal return, same as exit(0) - cmd = [PYTHON_EXE, "-c", "pass"] - p = self.spawn_psproc(cmd) - code = p.wait() - assert code == 0 - self.assertProcessGone(p) - # exit(1), implicit in case of error - cmd = [PYTHON_EXE, "-c", "1 / 0"] - p = self.spawn_psproc(cmd, stderr=subprocess.PIPE) - code = p.wait() - assert code == 1 - self.assertProcessGone(p) - # via sys.exit() - cmd = [PYTHON_EXE, "-c", "import sys; sys.exit(5);"] - p = self.spawn_psproc(cmd) - code = p.wait() - assert code == 5 - self.assertProcessGone(p) - # via os._exit() - cmd = [PYTHON_EXE, "-c", "import os; os._exit(5);"] - p = self.spawn_psproc(cmd) - code = p.wait() - assert code == 5 - self.assertProcessGone(p) - - @pytest.mark.skipif(NETBSD, reason="fails on NETBSD") - def test_wait_stopped(self): - p = self.spawn_psproc() - if POSIX: - # Test waitpid() + WIFSTOPPED and WIFCONTINUED. - # Note: if a process is stopped it ignores SIGTERM. - p.send_signal(signal.SIGSTOP) - with pytest.raises(psutil.TimeoutExpired): - p.wait(timeout=0.001) - p.send_signal(signal.SIGCONT) - with pytest.raises(psutil.TimeoutExpired): - p.wait(timeout=0.001) - p.send_signal(signal.SIGTERM) - assert p.wait() == -signal.SIGTERM - assert p.wait() == -signal.SIGTERM - else: - p.suspend() - with pytest.raises(psutil.TimeoutExpired): - p.wait(timeout=0.001) - p.resume() - with pytest.raises(psutil.TimeoutExpired): - p.wait(timeout=0.001) - p.terminate() - assert p.wait() == signal.SIGTERM - assert p.wait() == signal.SIGTERM - - def test_wait_non_children(self): - # Test wait() against a process which is not our direct - # child. - child, grandchild = self.spawn_children_pair() - with pytest.raises(psutil.TimeoutExpired): - child.wait(0.01) - with pytest.raises(psutil.TimeoutExpired): - grandchild.wait(0.01) - # We also terminate the direct child otherwise the - # grandchild will hang until the parent is gone. - child.terminate() - grandchild.terminate() - child_ret = child.wait() - grandchild_ret = grandchild.wait() - if POSIX: - assert child_ret == -signal.SIGTERM - # For processes which are not our children we're supposed - # to get None. - assert grandchild_ret is None - else: - assert child_ret == signal.SIGTERM - assert child_ret == signal.SIGTERM - - def test_wait_timeout(self): - p = self.spawn_psproc() - p.name() - with pytest.raises(psutil.TimeoutExpired): - p.wait(0.01) - with pytest.raises(psutil.TimeoutExpired): - p.wait(0) - with pytest.raises(ValueError): - p.wait(-1) - - def test_wait_timeout_nonblocking(self): - p = self.spawn_psproc() - with pytest.raises(psutil.TimeoutExpired): - p.wait(0) - p.kill() - stop_at = time.time() + GLOBAL_TIMEOUT - while time.time() < stop_at: - try: - code = p.wait(0) - break - except psutil.TimeoutExpired: - pass - else: - raise self.fail('timeout') - if POSIX: - assert code == -signal.SIGKILL - else: - assert code == signal.SIGTERM - self.assertProcessGone(p) - - def test_cpu_percent(self): - p = psutil.Process() - p.cpu_percent(interval=0.001) - p.cpu_percent(interval=0.001) - for _ in range(100): - percent = p.cpu_percent(interval=None) - assert isinstance(percent, float) - assert percent >= 0.0 - with pytest.raises(ValueError): - p.cpu_percent(interval=-1) - - def test_cpu_percent_numcpus_none(self): - # See: https://github.com/giampaolo/psutil/issues/1087 - with mock.patch('psutil.cpu_count', return_value=None) as m: - psutil.Process().cpu_percent() - assert m.called - - def test_cpu_times(self): - times = psutil.Process().cpu_times() - assert times.user >= 0.0, times - assert times.system >= 0.0, times - assert times.children_user >= 0.0, times - assert times.children_system >= 0.0, times - if LINUX: - assert times.iowait >= 0.0, times - # make sure returned values can be pretty printed with strftime - for name in times._fields: - time.strftime("%H:%M:%S", time.localtime(getattr(times, name))) - - def test_cpu_times_2(self): - def waste_cpu(): - stop_at = os.times().user + 0.2 - while os.times().user < stop_at: - for x in range(100000): - x **= 2 - - waste_cpu() - a = psutil.Process().cpu_times() - b = os.times() - self.assertAlmostEqual(a.user, b.user, delta=0.1) - self.assertAlmostEqual(a.system, b.system, delta=0.1) - - @pytest.mark.skipif(not HAS_PROC_CPU_NUM, reason="not supported") - def test_cpu_num(self): - p = psutil.Process() - num = p.cpu_num() - assert num >= 0 - if psutil.cpu_count() == 1: - assert num == 0 - assert p.cpu_num() in range(psutil.cpu_count()) - - def test_create_time(self): - p = self.spawn_psproc() - now = time.time() - create_time = p.create_time() - - # Use time.time() as base value to compare our result using a - # tolerance of +/- 1 second. - # It will fail if the difference between the values is > 2s. - difference = abs(create_time - now) - if difference > 2: - raise self.fail( - f"expected: {now}, found: {create_time}, difference:" - f" {difference}" - ) - - # make sure returned value can be pretty printed with strftime - time.strftime("%Y %m %d %H:%M:%S", time.localtime(p.create_time())) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_terminal(self): - terminal = psutil.Process().terminal() - if terminal is not None: - try: - tty = os.path.realpath(sh('tty')) - except RuntimeError: - # Note: happens if pytest is run without the `-s` opt. - raise pytest.skip("can't rely on `tty` CLI") - else: - assert terminal == tty - - @pytest.mark.skipif(not HAS_PROC_IO_COUNTERS, reason="not supported") - @skip_on_not_implemented(only_if=LINUX) - def test_io_counters(self): - p = psutil.Process() - # test reads - io1 = p.io_counters() - with open(PYTHON_EXE, 'rb') as f: - f.read() - io2 = p.io_counters() - if not BSD and not AIX: - assert io2.read_count > io1.read_count - assert io2.write_count == io1.write_count - if LINUX: - assert io2.read_chars > io1.read_chars - assert io2.write_chars == io1.write_chars - else: - assert io2.read_bytes >= io1.read_bytes - assert io2.write_bytes >= io1.write_bytes - - # test writes - io1 = p.io_counters() - with open(self.get_testfn(), 'wb') as f: - f.write(bytes("x" * 1000000, 'ascii')) - io2 = p.io_counters() - assert io2.write_count >= io1.write_count - assert io2.write_bytes >= io1.write_bytes - assert io2.read_count >= io1.read_count - assert io2.read_bytes >= io1.read_bytes - if LINUX: - assert io2.write_chars > io1.write_chars - assert io2.read_chars >= io1.read_chars - - # sanity check - for i in range(len(io2)): - if BSD and i >= 2: - # On BSD read_bytes and write_bytes are always set to -1. - continue - assert io2[i] >= 0 - assert io2[i] >= 0 - - @pytest.mark.skipif(not HAS_IONICE, reason="not supported") - @pytest.mark.skipif(not LINUX, reason="linux only") - def test_ionice_linux(self): - def cleanup(init): - ioclass, value = init - if ioclass == psutil.IOPRIO_CLASS_NONE: - value = 0 - p.ionice(ioclass, value) - - p = psutil.Process() - if not CI_TESTING: - assert p.ionice()[0] == psutil.IOPRIO_CLASS_NONE - assert psutil.IOPRIO_CLASS_NONE == 0 - assert psutil.IOPRIO_CLASS_RT == 1 # high - assert psutil.IOPRIO_CLASS_BE == 2 # normal - assert psutil.IOPRIO_CLASS_IDLE == 3 # low - init = p.ionice() - self.addCleanup(cleanup, init) - - # low - p.ionice(psutil.IOPRIO_CLASS_IDLE) - assert tuple(p.ionice()) == (psutil.IOPRIO_CLASS_IDLE, 0) - with pytest.raises(ValueError): # accepts no value - p.ionice(psutil.IOPRIO_CLASS_IDLE, value=7) - # normal - p.ionice(psutil.IOPRIO_CLASS_BE) - assert tuple(p.ionice()) == (psutil.IOPRIO_CLASS_BE, 0) - p.ionice(psutil.IOPRIO_CLASS_BE, value=7) - assert tuple(p.ionice()) == (psutil.IOPRIO_CLASS_BE, 7) - with pytest.raises(ValueError): - p.ionice(psutil.IOPRIO_CLASS_BE, value=8) - try: - p.ionice(psutil.IOPRIO_CLASS_RT, value=7) - except psutil.AccessDenied: - pass - # errs - with pytest.raises(ValueError, match="ioclass accepts no value"): - p.ionice(psutil.IOPRIO_CLASS_NONE, 1) - with pytest.raises(ValueError, match="ioclass accepts no value"): - p.ionice(psutil.IOPRIO_CLASS_IDLE, 1) - with pytest.raises( - ValueError, match="'ioclass' argument must be specified" - ): - p.ionice(value=1) - - @pytest.mark.skipif(not HAS_IONICE, reason="not supported") - @pytest.mark.skipif( - not WINDOWS, reason="not supported on this win version" - ) - def test_ionice_win(self): - p = psutil.Process() - if not CI_TESTING: - assert p.ionice() == psutil.IOPRIO_NORMAL - init = p.ionice() - self.addCleanup(p.ionice, init) - - # base - p.ionice(psutil.IOPRIO_VERYLOW) - assert p.ionice() == psutil.IOPRIO_VERYLOW - p.ionice(psutil.IOPRIO_LOW) - assert p.ionice() == psutil.IOPRIO_LOW - try: - p.ionice(psutil.IOPRIO_HIGH) - except psutil.AccessDenied: - pass - else: - assert p.ionice() == psutil.IOPRIO_HIGH - # errs - with pytest.raises( - TypeError, match="value argument not accepted on Windows" - ): - p.ionice(psutil.IOPRIO_NORMAL, value=1) - with pytest.raises(ValueError, match="is not a valid priority"): - p.ionice(psutil.IOPRIO_HIGH + 1) - - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit_get(self): - import resource - - p = psutil.Process(os.getpid()) - names = [x for x in dir(psutil) if x.startswith('RLIMIT')] - assert names, names - for name in names: - value = getattr(psutil, name) - assert value >= 0 - if name in dir(resource): - assert value == getattr(resource, name) - # XXX - On PyPy RLIMIT_INFINITY returned by - # resource.getrlimit() is reported as a very big long - # number instead of -1. It looks like a bug with PyPy. - if PYPY: - continue - assert p.rlimit(value) == resource.getrlimit(value) - else: - ret = p.rlimit(value) - assert len(ret) == 2 - assert ret[0] >= -1 - assert ret[1] >= -1 - - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit_set(self): - p = self.spawn_psproc() - p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) - assert p.rlimit(psutil.RLIMIT_NOFILE) == (5, 5) - # If pid is 0 prlimit() applies to the calling process and - # we don't want that. - if LINUX: - with pytest.raises(ValueError, match="can't use prlimit"): - psutil._psplatform.Process(0).rlimit(0) - with pytest.raises(ValueError): - p.rlimit(psutil.RLIMIT_NOFILE, (5, 5, 5)) - - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit(self): - p = psutil.Process() - testfn = self.get_testfn() - soft, hard = p.rlimit(psutil.RLIMIT_FSIZE) - try: - p.rlimit(psutil.RLIMIT_FSIZE, (1024, hard)) - with open(testfn, "wb") as f: - f.write(b"X" * 1024) - # write() or flush() doesn't always cause the exception - # but close() will. - with pytest.raises(OSError) as exc: - with open(testfn, "wb") as f: - f.write(b"X" * 1025) - assert exc.value.errno == errno.EFBIG - finally: - p.rlimit(psutil.RLIMIT_FSIZE, (soft, hard)) - assert p.rlimit(psutil.RLIMIT_FSIZE) == (soft, hard) - - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit_infinity(self): - # First set a limit, then re-set it by specifying INFINITY - # and assume we overridden the previous limit. - p = psutil.Process() - soft, hard = p.rlimit(psutil.RLIMIT_FSIZE) - try: - p.rlimit(psutil.RLIMIT_FSIZE, (1024, hard)) - p.rlimit(psutil.RLIMIT_FSIZE, (psutil.RLIM_INFINITY, hard)) - with open(self.get_testfn(), "wb") as f: - f.write(b"X" * 2048) - finally: - p.rlimit(psutil.RLIMIT_FSIZE, (soft, hard)) - assert p.rlimit(psutil.RLIMIT_FSIZE) == (soft, hard) - - @pytest.mark.skipif(not HAS_RLIMIT, reason="not supported") - def test_rlimit_infinity_value(self): - # RLIMIT_FSIZE should be RLIM_INFINITY, which will be a really - # big number on a platform with large file support. On these - # platforms we need to test that the get/setrlimit functions - # properly convert the number to a C long long and that the - # conversion doesn't raise an error. - p = psutil.Process() - soft, hard = p.rlimit(psutil.RLIMIT_FSIZE) - assert hard == psutil.RLIM_INFINITY - p.rlimit(psutil.RLIMIT_FSIZE, (soft, hard)) - - def test_num_threads(self): - # on certain platforms such as Linux we might test for exact - # thread number, since we always have with 1 thread per process, - # but this does not apply across all platforms (MACOS, Windows) - p = psutil.Process() - if OPENBSD: - try: - step1 = p.num_threads() - except psutil.AccessDenied: - raise pytest.skip("on OpenBSD this requires root access") - else: - step1 = p.num_threads() - - with ThreadTask(): - step2 = p.num_threads() - assert step2 == step1 + 1 - - @pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") - def test_num_handles(self): - # a better test is done later into test/_windows.py - p = psutil.Process() - assert p.num_handles() > 0 - - @pytest.mark.skipif(not HAS_THREADS, reason="not supported") - def test_threads(self): - p = psutil.Process() - if OPENBSD: - try: - step1 = p.threads() - except psutil.AccessDenied: - raise pytest.skip("on OpenBSD this requires root access") - else: - step1 = p.threads() - - with ThreadTask(): - step2 = p.threads() - assert len(step2) == len(step1) + 1 - athread = step2[0] - # test named tuple - assert athread.id == athread[0] - assert athread.user_time == athread[1] - assert athread.system_time == athread[2] - - @retry_on_failure() - @skip_on_access_denied(only_if=MACOS) - @pytest.mark.skipif(not HAS_THREADS, reason="not supported") - def test_threads_2(self): - p = self.spawn_psproc() - if OPENBSD: - try: - p.threads() - except psutil.AccessDenied: - raise pytest.skip("on OpenBSD this requires root access") - assert ( - abs(p.cpu_times().user - sum(x.user_time for x in p.threads())) - < 0.1 - ) - assert ( - abs(p.cpu_times().system - sum(x.system_time for x in p.threads())) - < 0.1 - ) - - @retry_on_failure() - def test_memory_info(self): - p = psutil.Process() - - # step 1 - get a base value to compare our results - rss1, vms1 = p.memory_info()[:2] - percent1 = p.memory_percent() - assert rss1 > 0 - assert vms1 > 0 - - # step 2 - allocate some memory - memarr = [None] * 1500000 - - rss2, vms2 = p.memory_info()[:2] - percent2 = p.memory_percent() - - # step 3 - make sure that the memory usage bumped up - assert rss2 > rss1 - assert vms2 >= vms1 # vms might be equal - assert percent2 > percent1 - del memarr - - if WINDOWS: - mem = p.memory_info() - assert mem.rss == mem.wset - assert mem.vms == mem.pagefile - - mem = p.memory_info() - for name in mem._fields: - assert getattr(mem, name) >= 0 - - def test_memory_full_info(self): - p = psutil.Process() - total = psutil.virtual_memory().total - mem = p.memory_full_info() - for name in mem._fields: - value = getattr(mem, name) - assert value >= 0 - if (name == "vms" and OSX) or LINUX: - continue - assert value <= total - if LINUX or WINDOWS or MACOS: - assert mem.uss >= 0 - if LINUX: - assert mem.pss >= 0 - assert mem.swap >= 0 - - @pytest.mark.skipif(not HAS_MEMORY_MAPS, reason="not supported") - def test_memory_maps(self): - p = psutil.Process() - maps = p.memory_maps() - assert len(maps) == len(set(maps)) - ext_maps = p.memory_maps(grouped=False) - - for nt in maps: - if nt.path.startswith('['): - continue - if BSD and nt.path == "pvclock": - continue - assert os.path.isabs(nt.path), nt.path - - if POSIX: - try: - assert os.path.exists(nt.path) or os.path.islink( - nt.path - ), nt.path - except AssertionError: - if not LINUX: - raise - # https://github.com/giampaolo/psutil/issues/759 - with open_text('/proc/self/smaps') as f: - data = f.read() - if f"{nt.path} (deleted)" not in data: - raise - elif '64' not in os.path.basename(nt.path): - # XXX - On Windows we have this strange behavior with - # 64 bit dlls: they are visible via explorer but cannot - # be accessed via os.stat() (wtf?). - try: - st = os.stat(nt.path) - except FileNotFoundError: - pass - else: - assert stat.S_ISREG(st.st_mode), nt.path - - for nt in ext_maps: - for fname in nt._fields: - value = getattr(nt, fname) - if fname == 'path': - continue - if fname in {'addr', 'perms'}: - assert value, value - else: - assert isinstance(value, int) - assert value >= 0, value - - @pytest.mark.skipif(not HAS_MEMORY_MAPS, reason="not supported") - def test_memory_maps_lists_lib(self): - # Make sure a newly loaded shared lib is listed. - p = psutil.Process() - with copyload_shared_lib() as path: - - def normpath(p): - return os.path.realpath(os.path.normcase(p)) - - libpaths = [normpath(x.path) for x in p.memory_maps()] - assert normpath(path) in libpaths - - def test_memory_percent(self): - p = psutil.Process() - p.memory_percent() - with pytest.raises(ValueError): - p.memory_percent(memtype="?!?") - if LINUX or MACOS or WINDOWS: - p.memory_percent(memtype='uss') - - def test_is_running(self): - p = self.spawn_psproc() - assert p.is_running() - assert p.is_running() - p.kill() - p.wait() - assert not p.is_running() - assert not p.is_running() - - def test_exe(self): - p = self.spawn_psproc() - exe = p.exe() - try: - assert exe == PYTHON_EXE - except AssertionError: - if WINDOWS and len(exe) == len(PYTHON_EXE): - # on Windows we don't care about case sensitivity - normcase = os.path.normcase - assert normcase(exe) == normcase(PYTHON_EXE) - else: - # certain platforms such as BSD are more accurate returning: - # "/usr/local/bin/python3.7" - # ...instead of: - # "/usr/local/bin/python" - # We do not want to consider this difference in accuracy - # an error. - ver = f"{sys.version_info[0]}.{sys.version_info[1]}" - try: - assert exe.replace(ver, '') == PYTHON_EXE.replace(ver, '') - except AssertionError: - # Typically MACOS. Really not sure what to do here. - pass - - out = sh([exe, "-c", "import os; print('hey')"]) - assert out == 'hey' - - def test_cmdline(self): - cmdline = [ - PYTHON_EXE, - "-c", - "import time; [time.sleep(0.1) for x in range(100)]", - ] - p = self.spawn_psproc(cmdline) - - if NETBSD and p.cmdline() == []: - # https://github.com/giampaolo/psutil/issues/2250 - raise pytest.skip("OPENBSD: returned EBUSY") - - # XXX - most of the times the underlying sysctl() call on Net - # and Open BSD returns a truncated string. - # Also /proc/pid/cmdline behaves the same so it looks - # like this is a kernel bug. - # XXX - AIX truncates long arguments in /proc/pid/cmdline - if NETBSD or OPENBSD or AIX: - assert p.cmdline()[0] == PYTHON_EXE - else: - if MACOS and CI_TESTING: - pyexe = p.cmdline()[0] - if pyexe != PYTHON_EXE: - assert ' '.join(p.cmdline()[1:]) == ' '.join(cmdline[1:]) - return - assert ' '.join(p.cmdline()) == ' '.join(cmdline) - - @pytest.mark.skipif(PYPY, reason="broken on PYPY") - def test_long_cmdline(self): - cmdline = [PYTHON_EXE] - cmdline.extend(["-v"] * 50) - cmdline.extend( - ["-c", "import time; [time.sleep(0.1) for x in range(100)]"] - ) - p = self.spawn_psproc(cmdline) - if OPENBSD: - # XXX: for some reason the test process may turn into a - # zombie (don't know why). - try: - assert p.cmdline() == cmdline - except psutil.ZombieProcess: - raise pytest.skip("OPENBSD: process turned into zombie") - else: - ret = p.cmdline() - if NETBSD and ret == []: - # https://github.com/giampaolo/psutil/issues/2250 - raise pytest.skip("OPENBSD: returned EBUSY") - assert ret == cmdline - - def test_name(self): - p = self.spawn_psproc() - name = p.name().lower() - pyexe = os.path.basename(os.path.realpath(sys.executable)).lower() - assert pyexe.startswith(name), (pyexe, name) - - @pytest.mark.skipif(PYPY, reason="unreliable on PYPY") - def test_long_name(self): - pyexe = create_py_exe(self.get_testfn(suffix=string.digits * 2)) - cmdline = [ - pyexe, - "-c", - "import time; [time.sleep(0.1) for x in range(100)]", - ] - p = self.spawn_psproc(cmdline) - if OPENBSD: - # XXX: for some reason the test process may turn into a - # zombie (don't know why). Because the name() is long, all - # UNIX kernels truncate it to 15 chars, so internally psutil - # tries to guess the full name() from the cmdline(). But the - # cmdline() of a zombie on OpenBSD fails (internally), so we - # just compare the first 15 chars. Full explanation: - # https://github.com/giampaolo/psutil/issues/2239 - try: - assert p.name() == os.path.basename(pyexe) - except AssertionError: - if p.status() == psutil.STATUS_ZOMBIE: - assert os.path.basename(pyexe).startswith(p.name()) - else: - raise - else: - assert p.name() == os.path.basename(pyexe) - - # XXX: fails too often - # @pytest.mark.skipif(SUNOS, reason="broken on SUNOS") - # @pytest.mark.skipif(AIX, reason="broken on AIX") - # @pytest.mark.skipif(PYPY, reason="broken on PYPY") - # def test_prog_w_funky_name(self): - # # Test that name(), exe() and cmdline() correctly handle programs - # # with funky chars such as spaces and ")", see: - # # https://github.com/giampaolo/psutil/issues/628 - # pyexe = create_py_exe(self.get_testfn(suffix='foo bar )')) - # cmdline = [ - # pyexe, - # "-c", - # "import time; [time.sleep(0.1) for x in range(100)]", - # ] - # p = self.spawn_psproc(cmdline) - # assert p.cmdline() == cmdline - # assert p.name() == os.path.basename(pyexe) - # assert os.path.normcase(p.exe()) == os.path.normcase(pyexe) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_uids(self): - p = psutil.Process() - real, effective, _saved = p.uids() - # os.getuid() refers to "real" uid - assert real == os.getuid() - # os.geteuid() refers to "effective" uid - assert effective == os.geteuid() - # No such thing as os.getsuid() ("saved" uid), but we have - # os.getresuid() which returns all of them. - if hasattr(os, "getresuid"): - assert os.getresuid() == p.uids() - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_gids(self): - p = psutil.Process() - real, effective, _saved = p.gids() - # os.getuid() refers to "real" uid - assert real == os.getgid() - # os.geteuid() refers to "effective" uid - assert effective == os.getegid() - # No such thing as os.getsgid() ("saved" gid), but we have - # os.getresgid() which returns all of them. - if hasattr(os, "getresuid"): - assert os.getresgid() == p.gids() - - def test_nice(self): - def cleanup(init): - try: - p.nice(init) - except psutil.AccessDenied: - pass - - p = psutil.Process() - with pytest.raises(TypeError): - p.nice("str") - init = p.nice() - self.addCleanup(cleanup, init) - - if WINDOWS: - highest_prio = None - for prio in [ - psutil.IDLE_PRIORITY_CLASS, - psutil.BELOW_NORMAL_PRIORITY_CLASS, - psutil.NORMAL_PRIORITY_CLASS, - psutil.ABOVE_NORMAL_PRIORITY_CLASS, - psutil.HIGH_PRIORITY_CLASS, - psutil.REALTIME_PRIORITY_CLASS, - ]: - with self.subTest(prio=prio): - try: - p.nice(prio) - except psutil.AccessDenied: - pass - else: - new_prio = p.nice() - # The OS may limit our maximum priority, - # even if the function succeeds. For higher - # priorities, we match either the expected - # value or the highest so far. - if prio in { - psutil.ABOVE_NORMAL_PRIORITY_CLASS, - psutil.HIGH_PRIORITY_CLASS, - psutil.REALTIME_PRIORITY_CLASS, - }: - if new_prio == prio or highest_prio is None: - highest_prio = prio - assert new_prio == highest_prio - else: - assert new_prio == prio - else: - try: - if hasattr(os, "getpriority"): - assert ( - os.getpriority(os.PRIO_PROCESS, os.getpid()) - == p.nice() - ) - p.nice(1) - assert p.nice() == 1 - if hasattr(os, "getpriority"): - assert ( - os.getpriority(os.PRIO_PROCESS, os.getpid()) - == p.nice() - ) - # XXX - going back to previous nice value raises - # AccessDenied on MACOS - if not MACOS: - p.nice(0) - assert p.nice() == 0 - except psutil.AccessDenied: - pass - - def test_status(self): - p = psutil.Process() - assert p.status() == psutil.STATUS_RUNNING - - def test_username(self): - p = self.spawn_psproc() - username = p.username() - if WINDOWS: - domain, username = username.split('\\') - getpass_user = getpass.getuser() - if getpass_user.endswith('$'): - # When running as a service account (most likely to be - # NetworkService), these user name calculations don't produce - # the same result, causing the test to fail. - raise pytest.skip('running as service account') - assert username == getpass_user - if 'USERDOMAIN' in os.environ: - assert domain == os.environ['USERDOMAIN'] - else: - assert username == getpass.getuser() - - def test_cwd(self): - p = self.spawn_psproc() - assert p.cwd() == os.getcwd() - - def test_cwd_2(self): - cmd = [ - PYTHON_EXE, - "-c", - ( - "import os, time; os.chdir('..'); [time.sleep(0.1) for x in" - " range(100)]" - ), - ] - p = self.spawn_psproc(cmd) - call_until(lambda: p.cwd() == os.path.dirname(os.getcwd())) - - @pytest.mark.skipif(not HAS_CPU_AFFINITY, reason="not supported") - def test_cpu_affinity(self): - p = psutil.Process() - initial = p.cpu_affinity() - assert initial, initial - self.addCleanup(p.cpu_affinity, initial) - - if hasattr(os, "sched_getaffinity"): - assert initial == list(os.sched_getaffinity(p.pid)) - assert len(initial) == len(set(initial)) - - all_cpus = list(range(len(psutil.cpu_percent(percpu=True)))) - for n in all_cpus: - p.cpu_affinity([n]) - assert p.cpu_affinity() == [n] - if hasattr(os, "sched_getaffinity"): - assert p.cpu_affinity() == list(os.sched_getaffinity(p.pid)) - # also test num_cpu() - if hasattr(p, "num_cpu"): - assert p.cpu_affinity()[0] == p.num_cpu() - - # [] is an alias for "all eligible CPUs"; on Linux this may - # not be equal to all available CPUs, see: - # https://github.com/giampaolo/psutil/issues/956 - p.cpu_affinity([]) - if LINUX: - assert p.cpu_affinity() == p._proc._get_eligible_cpus() - else: - assert p.cpu_affinity() == all_cpus - if hasattr(os, "sched_getaffinity"): - assert p.cpu_affinity() == list(os.sched_getaffinity(p.pid)) - - with pytest.raises(TypeError): - p.cpu_affinity(1) - p.cpu_affinity(initial) - # it should work with all iterables, not only lists - p.cpu_affinity(set(all_cpus)) - p.cpu_affinity(tuple(all_cpus)) - - @pytest.mark.skipif(not HAS_CPU_AFFINITY, reason="not supported") - def test_cpu_affinity_errs(self): - p = self.spawn_psproc() - invalid_cpu = [len(psutil.cpu_times(percpu=True)) + 10] - with pytest.raises(ValueError): - p.cpu_affinity(invalid_cpu) - with pytest.raises(ValueError): - p.cpu_affinity(range(10000, 11000)) - with pytest.raises((TypeError, ValueError)): - p.cpu_affinity([0, "1"]) - with pytest.raises(ValueError): - p.cpu_affinity([0, -1]) - - @pytest.mark.skipif(not HAS_CPU_AFFINITY, reason="not supported") - def test_cpu_affinity_all_combinations(self): - p = psutil.Process() - initial = p.cpu_affinity() - assert initial, initial - self.addCleanup(p.cpu_affinity, initial) - - # All possible CPU set combinations. - if len(initial) > 12: - initial = initial[:12] # ...otherwise it will take forever - combos = [] - for i in range(len(initial) + 1): - combos.extend( - list(subset) - for subset in itertools.combinations(initial, i) - if subset - ) - - for combo in combos: - p.cpu_affinity(combo) - assert sorted(p.cpu_affinity()) == sorted(combo) - - # TODO: #595 - @pytest.mark.skipif(BSD, reason="broken on BSD") - def test_open_files(self): - p = psutil.Process() - testfn = self.get_testfn() - files = p.open_files() - assert testfn not in files - with open(testfn, 'wb') as f: - f.write(b'x' * 1024) - f.flush() - # give the kernel some time to see the new file - call_until(lambda: len(p.open_files()) != len(files)) - files = p.open_files() - filenames = [os.path.normcase(x.path) for x in files] - assert os.path.normcase(testfn) in filenames - if LINUX: - for file in files: - if file.path == testfn: - assert file.position == 1024 - for file in files: - assert os.path.isfile(file.path), file - - # another process - cmdline = ( - f"import time; f = open(r'{testfn}', 'r'); [time.sleep(0.1) for x" - " in range(100)];" - ) - p = self.spawn_psproc([PYTHON_EXE, "-c", cmdline]) - - for x in range(100): - filenames = [os.path.normcase(x.path) for x in p.open_files()] - if testfn in filenames: - break - time.sleep(0.01) - else: - assert os.path.normcase(testfn) in filenames - for file in filenames: - assert os.path.isfile(file), file - - # TODO: #595 - @pytest.mark.skipif(BSD, reason="broken on BSD") - def test_open_files_2(self): - # test fd and path fields - p = psutil.Process() - normcase = os.path.normcase - testfn = self.get_testfn() - with open(testfn, 'w') as fileobj: - for file in p.open_files(): - if ( - normcase(file.path) == normcase(fileobj.name) - or file.fd == fileobj.fileno() - ): - break - else: - raise self.fail(f"no file found; files={p.open_files()!r}") - assert normcase(file.path) == normcase(fileobj.name) - if WINDOWS: - assert file.fd == -1 - else: - assert file.fd == fileobj.fileno() - # test positions - ntuple = p.open_files()[0] - assert ntuple[0] == ntuple.path - assert ntuple[1] == ntuple.fd - # test file is gone - assert fileobj.name not in p.open_files() - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_num_fds(self): - p = psutil.Process() - testfn = self.get_testfn() - start = p.num_fds() - file = open(testfn, 'w') # noqa: SIM115 - self.addCleanup(file.close) - assert p.num_fds() == start + 1 - sock = socket.socket() - self.addCleanup(sock.close) - assert p.num_fds() == start + 2 - file.close() - sock.close() - assert p.num_fds() == start - - @skip_on_not_implemented(only_if=LINUX) - @pytest.mark.skipif( - OPENBSD or NETBSD, reason="not reliable on OPENBSD & NETBSD" - ) - def test_num_ctx_switches(self): - p = psutil.Process() - before = sum(p.num_ctx_switches()) - for _ in range(2): - time.sleep(0.05) # this shall ensure a context switch happens - after = sum(p.num_ctx_switches()) - if after > before: - return - raise self.fail("num ctx switches still the same after 2 iterations") - - def test_ppid(self): - p = psutil.Process() - if hasattr(os, 'getppid'): - assert p.ppid() == os.getppid() - p = self.spawn_psproc() - assert p.ppid() == os.getpid() - - def test_parent(self): - p = self.spawn_psproc() - assert p.parent().pid == os.getpid() - - lowest_pid = psutil.pids()[0] - assert psutil.Process(lowest_pid).parent() is None - - def test_parent_multi(self): - parent = psutil.Process() - child, grandchild = self.spawn_children_pair() - assert grandchild.parent() == child - assert child.parent() == parent - - @retry_on_failure() - def test_parents(self): - parent = psutil.Process() - assert parent.parents() - child, grandchild = self.spawn_children_pair() - assert child.parents()[0] == parent - assert grandchild.parents()[0] == child - assert grandchild.parents()[1] == parent - - def test_children(self): - parent = psutil.Process() - assert not parent.children() - assert not parent.children(recursive=True) - # On Windows we set the flag to 0 in order to cancel out the - # CREATE_NO_WINDOW flag (enabled by default) which creates - # an extra "conhost.exe" child. - child = self.spawn_psproc(creationflags=0) - children1 = parent.children() - children2 = parent.children(recursive=True) - for children in (children1, children2): - assert len(children) == 1 - assert children[0].pid == child.pid - assert children[0].ppid() == parent.pid - - def test_children_recursive(self): - # Test children() against two sub processes, p1 and p2, where - # p1 (our child) spawned p2 (our grandchild). - parent = psutil.Process() - child, grandchild = self.spawn_children_pair() - assert parent.children() == [child] - assert parent.children(recursive=True) == [child, grandchild] - # If the intermediate process is gone there's no way for - # children() to recursively find it. - child.terminate() - child.wait() - assert not parent.children(recursive=True) - - def test_children_duplicates(self): - # find the process which has the highest number of children - table = collections.defaultdict(int) - for p in psutil.process_iter(): - try: - table[p.ppid()] += 1 - except psutil.Error: - pass - # this is the one, now let's make sure there are no duplicates - pid = max(table.items(), key=lambda x: x[1])[0] - if LINUX and pid == 0: - raise pytest.skip("PID 0") - p = psutil.Process(pid) - try: - c = p.children(recursive=True) - except psutil.AccessDenied: # windows - pass - else: - assert len(c) == len(set(c)) - - def test_parents_and_children(self): - parent = psutil.Process() - child, grandchild = self.spawn_children_pair() - # forward - children = parent.children(recursive=True) - assert len(children) == 2 - assert children[0] == child - assert children[1] == grandchild - # backward - parents = grandchild.parents() - assert parents[0] == child - assert parents[1] == parent - - def test_suspend_resume(self): - p = self.spawn_psproc() - p.suspend() - for _ in range(100): - if p.status() == psutil.STATUS_STOPPED: - break - time.sleep(0.01) - p.resume() - assert p.status() != psutil.STATUS_STOPPED - - def test_invalid_pid(self): - with pytest.raises(TypeError): - psutil.Process("1") - with pytest.raises(ValueError): - psutil.Process(-1) - - def test_as_dict(self): - p = psutil.Process() - d = p.as_dict(attrs=['exe', 'name']) - assert sorted(d.keys()) == ['exe', 'name'] - - p = psutil.Process(min(psutil.pids())) - d = p.as_dict(attrs=['net_connections'], ad_value='foo') - if not isinstance(d['net_connections'], list): - assert d['net_connections'] == 'foo' - - # Test ad_value is set on AccessDenied. - with mock.patch( - 'psutil.Process.nice', create=True, side_effect=psutil.AccessDenied - ): - assert p.as_dict(attrs=["nice"], ad_value=1) == {"nice": 1} - - # Test that NoSuchProcess bubbles up. - with mock.patch( - 'psutil.Process.nice', - create=True, - side_effect=psutil.NoSuchProcess(p.pid, "name"), - ): - with pytest.raises(psutil.NoSuchProcess): - p.as_dict(attrs=["nice"]) - - # Test that ZombieProcess is swallowed. - with mock.patch( - 'psutil.Process.nice', - create=True, - side_effect=psutil.ZombieProcess(p.pid, "name"), - ): - assert p.as_dict(attrs=["nice"], ad_value="foo") == {"nice": "foo"} - - # By default APIs raising NotImplementedError are - # supposed to be skipped. - with mock.patch( - 'psutil.Process.nice', create=True, side_effect=NotImplementedError - ): - d = p.as_dict() - assert 'nice' not in list(d.keys()) - # ...unless the user explicitly asked for some attr. - with pytest.raises(NotImplementedError): - p.as_dict(attrs=["nice"]) - - # errors - with pytest.raises(TypeError): - p.as_dict('name') - with pytest.raises(ValueError): - p.as_dict(['foo']) - with pytest.raises(ValueError): - p.as_dict(['foo', 'bar']) - - def test_oneshot(self): - p = psutil.Process() - with mock.patch("psutil._psplatform.Process.cpu_times") as m: - with p.oneshot(): - p.cpu_times() - p.cpu_times() - assert m.call_count == 1 - - with mock.patch("psutil._psplatform.Process.cpu_times") as m: - p.cpu_times() - p.cpu_times() - assert m.call_count == 2 - - def test_oneshot_twice(self): - # Test the case where the ctx manager is __enter__ed twice. - # The second __enter__ is supposed to resut in a NOOP. - p = psutil.Process() - with mock.patch("psutil._psplatform.Process.cpu_times") as m1: - with mock.patch("psutil._psplatform.Process.oneshot_enter") as m2: - with p.oneshot(): - p.cpu_times() - p.cpu_times() - with p.oneshot(): - p.cpu_times() - p.cpu_times() - assert m1.call_count == 1 - assert m2.call_count == 1 - - with mock.patch("psutil._psplatform.Process.cpu_times") as m: - p.cpu_times() - p.cpu_times() - assert m.call_count == 2 - - def test_oneshot_cache(self): - # Make sure oneshot() cache is nonglobal. Instead it's - # supposed to be bound to the Process instance, see: - # https://github.com/giampaolo/psutil/issues/1373 - p1, p2 = self.spawn_children_pair() - p1_ppid = p1.ppid() - p2_ppid = p2.ppid() - assert p1_ppid != p2_ppid - with p1.oneshot(): - assert p1.ppid() == p1_ppid - assert p2.ppid() == p2_ppid - with p2.oneshot(): - assert p1.ppid() == p1_ppid - assert p2.ppid() == p2_ppid - - def test_halfway_terminated_process(self): - # Test that NoSuchProcess exception gets raised in case the - # process dies after we create the Process object. - # Example: - # >>> proc = Process(1234) - # >>> time.sleep(2) # time-consuming task, process dies in meantime - # >>> proc.name() - # Refers to Issue #15 - def assert_raises_nsp(fun, fun_name): - try: - ret = fun() - except psutil.ZombieProcess: # differentiate from NSP - raise - except psutil.NoSuchProcess: - pass - except psutil.AccessDenied: - if OPENBSD and fun_name in {'threads', 'num_threads'}: - return - raise - else: - # NtQuerySystemInformation succeeds even if process is gone. - if WINDOWS and fun_name in {'exe', 'name'}: - return - raise self.fail( - f"{fun!r} didn't raise NSP and returned {ret!r} instead" - ) - - p = self.spawn_psproc() - p.terminate() - p.wait() - if WINDOWS: # XXX - call_until(lambda: p.pid not in psutil.pids()) - self.assertProcessGone(p) - - ns = process_namespace(p) - for fun, name in ns.iter(ns.all): - assert_raises_nsp(fun, name) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_zombie_process(self): - _parent, zombie = self.spawn_zombie() - self.assertProcessZombie(zombie) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_zombie_process_is_running_w_exc(self): - # Emulate a case where internally is_running() raises - # ZombieProcess. - p = psutil.Process() - with mock.patch( - "psutil.Process", side_effect=psutil.ZombieProcess(0) - ) as m: - assert p.is_running() - assert m.called - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_zombie_process_status_w_exc(self): - # Emulate a case where internally status() raises - # ZombieProcess. - p = psutil.Process() - with mock.patch( - "psutil._psplatform.Process.status", - side_effect=psutil.ZombieProcess(0), - ) as m: - assert p.status() == psutil.STATUS_ZOMBIE - assert m.called - - def test_reused_pid(self): - # Emulate a case where PID has been reused by another process. - subp = self.spawn_testproc() - p = psutil.Process(subp.pid) - p._ident = (p.pid, p.create_time() + 100) - - list(psutil.process_iter()) - assert p.pid in psutil._pmap - assert not p.is_running() - - # make sure is_running() removed PID from process_iter() - # internal cache - with mock.patch.object(psutil._common, "PSUTIL_DEBUG", True): - with contextlib.redirect_stderr(io.StringIO()) as f: - list(psutil.process_iter()) - assert ( - f"refreshing Process instance for reused PID {p.pid}" - in f.getvalue() - ) - assert p.pid not in psutil._pmap - - assert p != psutil.Process(subp.pid) - msg = "process no longer exists and its PID has been reused" - ns = process_namespace(p) - for fun, name in ns.iter(ns.setters + ns.killers, clear_cache=False): - with self.subTest(name=name): - with pytest.raises(psutil.NoSuchProcess, match=msg): - fun() - - assert "terminated + PID reused" in str(p) - assert "terminated + PID reused" in repr(p) - - with pytest.raises(psutil.NoSuchProcess, match=msg): - p.ppid() - with pytest.raises(psutil.NoSuchProcess, match=msg): - p.parent() - with pytest.raises(psutil.NoSuchProcess, match=msg): - p.parents() - with pytest.raises(psutil.NoSuchProcess, match=msg): - p.children() - - def test_pid_0(self): - # Process(0) is supposed to work on all platforms except Linux - if 0 not in psutil.pids(): - with pytest.raises(psutil.NoSuchProcess): - psutil.Process(0) - # These 2 are a contradiction, but "ps" says PID 1's parent - # is PID 0. - assert not psutil.pid_exists(0) - assert psutil.Process(1).ppid() == 0 - return - - p = psutil.Process(0) - exc = psutil.AccessDenied if WINDOWS else ValueError - with pytest.raises(exc): - p.wait() - with pytest.raises(exc): - p.terminate() - with pytest.raises(exc): - p.suspend() - with pytest.raises(exc): - p.resume() - with pytest.raises(exc): - p.kill() - with pytest.raises(exc): - p.send_signal(signal.SIGTERM) - - # test all methods - ns = process_namespace(p) - for fun, name in ns.iter(ns.getters + ns.setters): - try: - ret = fun() - except psutil.AccessDenied: - pass - else: - if name in {"uids", "gids"}: - assert ret.real == 0 - elif name == "username": - user = 'NT AUTHORITY\\SYSTEM' if WINDOWS else 'root' - assert p.username() == user - elif name == "name": - assert name, name - - if not OPENBSD: - assert 0 in psutil.pids() - assert psutil.pid_exists(0) - - @pytest.mark.skipif(not HAS_ENVIRON, reason="not supported") - def test_environ(self): - def clean_dict(d): - exclude = ["PLAT", "HOME", "PYTEST_CURRENT_TEST", "PYTEST_VERSION"] - if MACOS: - exclude.extend([ - "__CF_USER_TEXT_ENCODING", - "VERSIONER_PYTHON_PREFER_32_BIT", - "VERSIONER_PYTHON_VERSION", - "VERSIONER_PYTHON_VERSION", - ]) - for name in exclude: - d.pop(name, None) - return { - k.replace("\r", "").replace("\n", ""): v.replace( - "\r", "" - ).replace("\n", "") - for k, v in d.items() - } - - self.maxDiff = None - p = psutil.Process() - d1 = clean_dict(p.environ()) - d2 = clean_dict(os.environ.copy()) - if not OSX and GITHUB_ACTIONS: - assert d1 == d2 - - @pytest.mark.skipif(not HAS_ENVIRON, reason="not supported") - @pytest.mark.skipif(not POSIX, reason="POSIX only") - @pytest.mark.skipif( - MACOS_11PLUS, - reason="macOS 11+ can't get another process environment, issue #2084", - ) - @pytest.mark.skipif( - NETBSD, reason="sometimes fails on `assert is_running()`" - ) - def test_weird_environ(self): - # environment variables can contain values without an equals sign - code = textwrap.dedent(""" - #include - #include - - char * const argv[] = {"cat", 0}; - char * const envp[] = {"A=1", "X", "C=3", 0}; - - int main(void) { - // Close stderr on exec so parent can wait for the - // execve to finish. - if (fcntl(2, F_SETFD, FD_CLOEXEC) != 0) - return 0; - return execve("/bin/cat", argv, envp); - } - """) - cexe = create_c_exe(self.get_testfn(), c_code=code) - sproc = self.spawn_testproc( - [cexe], stdin=subprocess.PIPE, stderr=subprocess.PIPE - ) - p = psutil.Process(sproc.pid) - wait_for_pid(p.pid) - assert p.is_running() - # Wait for process to exec or exit. - assert sproc.stderr.read() == b"" - if MACOS and CI_TESTING: - try: - env = p.environ() - except psutil.AccessDenied: - # XXX: fails sometimes with: - # PermissionError from 'sysctl(KERN_PROCARGS2) -> EIO' - return - else: - env = p.environ() - assert env == {"A": "1", "C": "3"} - sproc.communicate() - assert sproc.returncode == 0 - - -# =================================================================== -# --- psutil.Popen tests -# =================================================================== - - -class TestPopen(PsutilTestCase): - """Tests for psutil.Popen class.""" - - @classmethod - def tearDownClass(cls): - reap_children() - - def test_misc(self): - # XXX this test causes a ResourceWarning because - # psutil.__subproc instance doesn't get properly freed. - # Not sure what to do though. - cmd = [ - PYTHON_EXE, - "-c", - "import time; [time.sleep(0.1) for x in range(100)];", - ] - with psutil.Popen( - cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=PYTHON_EXE_ENV, - ) as proc: - proc.name() - proc.cpu_times() - proc.stdin # noqa: B018 - assert dir(proc) - with pytest.raises(AttributeError): - proc.foo # noqa: B018 - proc.terminate() - if POSIX: - assert proc.wait(5) == -signal.SIGTERM - else: - assert proc.wait(5) == signal.SIGTERM - - def test_ctx_manager(self): - with psutil.Popen( - [PYTHON_EXE, "-V"], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - stdin=subprocess.PIPE, - env=PYTHON_EXE_ENV, - ) as proc: - proc.communicate() - assert proc.stdout.closed - assert proc.stderr.closed - assert proc.stdin.closed - assert proc.returncode == 0 - - def test_kill_terminate(self): - # subprocess.Popen()'s terminate(), kill() and send_signal() do - # not raise exception after the process is gone. psutil.Popen - # diverges from that. - cmd = [ - PYTHON_EXE, - "-c", - "import time; [time.sleep(0.1) for x in range(100)];", - ] - with psutil.Popen( - cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=PYTHON_EXE_ENV, - ) as proc: - proc.terminate() - proc.wait() - with pytest.raises(psutil.NoSuchProcess): - proc.terminate() - with pytest.raises(psutil.NoSuchProcess): - proc.kill() - with pytest.raises(psutil.NoSuchProcess): - proc.send_signal(signal.SIGTERM) - if WINDOWS: - with pytest.raises(psutil.NoSuchProcess): - proc.send_signal(signal.CTRL_C_EVENT) - with pytest.raises(psutil.NoSuchProcess): - proc.send_signal(signal.CTRL_BREAK_EVENT) - - def test__getattribute__(self): - cmd = [ - PYTHON_EXE, - "-c", - "import time; [time.sleep(0.1) for x in range(100)];", - ] - with psutil.Popen( - cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=PYTHON_EXE_ENV, - ) as proc: - proc.terminate() - proc.wait() - with pytest.raises(AttributeError): - proc.foo # noqa: B018 diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_process_all.py b/PortablePython/Lib/site-packages/psutil/tests/test_process_all.py deleted file mode 100644 index aaa3fa0..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_process_all.py +++ /dev/null @@ -1,535 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Iterate over all process PIDs and for each one of them invoke and -test all psutil.Process() methods. -""" - -import enum -import errno -import multiprocessing -import os -import stat -import time -import traceback - -import psutil -from psutil import AIX -from psutil import BSD -from psutil import FREEBSD -from psutil import LINUX -from psutil import MACOS -from psutil import NETBSD -from psutil import OPENBSD -from psutil import OSX -from psutil import POSIX -from psutil import WINDOWS -from psutil.tests import CI_TESTING -from psutil.tests import PYTEST_PARALLEL -from psutil.tests import VALID_PROC_STATUSES -from psutil.tests import PsutilTestCase -from psutil.tests import check_connection_ntuple -from psutil.tests import create_sockets -from psutil.tests import is_namedtuple -from psutil.tests import is_win_secure_system_proc -from psutil.tests import process_namespace -from psutil.tests import pytest - - -# Cuts the time in half, but (e.g.) on macOS the process pool stays -# alive after join() (multiprocessing bug?), messing up other tests. -USE_PROC_POOL = LINUX and not CI_TESTING and not PYTEST_PARALLEL - - -def proc_info(pid): - tcase = PsutilTestCase() - - def check_exception(exc, proc, name, ppid): - tcase.assertEqual(exc.pid, pid) - if exc.name is not None: - tcase.assertEqual(exc.name, name) - if isinstance(exc, psutil.ZombieProcess): - tcase.assertProcessZombie(proc) - if exc.ppid is not None: - tcase.assertGreaterEqual(exc.ppid, 0) - tcase.assertEqual(exc.ppid, ppid) - elif isinstance(exc, psutil.NoSuchProcess): - tcase.assertProcessGone(proc) - str(exc) - repr(exc) - - def do_wait(): - if pid != 0: - try: - proc.wait(0) - except psutil.Error as exc: - check_exception(exc, proc, name, ppid) - - try: - proc = psutil.Process(pid) - except psutil.NoSuchProcess: - tcase.assertPidGone(pid) - return {} - try: - d = proc.as_dict(['ppid', 'name']) - except psutil.NoSuchProcess: - tcase.assertProcessGone(proc) - else: - name, ppid = d['name'], d['ppid'] - info = {'pid': proc.pid} - ns = process_namespace(proc) - # We don't use oneshot() because in order not to fool - # check_exception() in case of NSP. - for fun, fun_name in ns.iter(ns.getters, clear_cache=False): - try: - info[fun_name] = fun() - except psutil.Error as exc: - check_exception(exc, proc, name, ppid) - continue - do_wait() - return info - - -class TestFetchAllProcesses(PsutilTestCase): - """Test which iterates over all running processes and performs - some sanity checks against Process API's returned values. - Uses a process pool to get info about all processes. - """ - - def setUp(self): - psutil._set_debug(False) - # Using a pool in a CI env may result in deadlock, see: - # https://github.com/giampaolo/psutil/issues/2104 - if USE_PROC_POOL: - self.pool = multiprocessing.Pool() - - def tearDown(self): - psutil._set_debug(True) - if USE_PROC_POOL: - self.pool.terminate() - self.pool.join() - - def iter_proc_info(self): - # Fixes "can't pickle : it's not the - # same object as test_process_all.proc_info". - from psutil.tests.test_process_all import proc_info - - if USE_PROC_POOL: - return self.pool.imap_unordered(proc_info, psutil.pids()) - else: - ls = [proc_info(pid) for pid in psutil.pids()] - return ls - - def test_all(self): - failures = [] - for info in self.iter_proc_info(): - for name, value in info.items(): - meth = getattr(self, name) - try: - meth(value, info) - except Exception: # noqa: BLE001 - s = '\n' + '=' * 70 + '\n' - s += ( - "FAIL: name=test_{}, pid={}, ret={}\ninfo={}\n".format( - name, - info['pid'], - repr(value), - info, - ) - ) - s += '-' * 70 - s += f"\n{traceback.format_exc()}" - s = "\n".join((" " * 4) + i for i in s.splitlines()) + "\n" - failures.append(s) - else: - if value not in (0, 0.0, [], None, '', {}): - assert value, value - if failures: - raise self.fail(''.join(failures)) - - def cmdline(self, ret, info): - assert isinstance(ret, list) - for part in ret: - assert isinstance(part, str) - - def exe(self, ret, info): - assert isinstance(ret, str) - assert ret.strip() == ret - if ret: - if WINDOWS and not ret.endswith('.exe'): - return # May be "Registry", "MemCompression", ... - assert os.path.isabs(ret), ret - # Note: os.stat() may return False even if the file is there - # hence we skip the test, see: - # http://stackoverflow.com/questions/3112546/os-path-exists-lies - if POSIX and os.path.isfile(ret): - if hasattr(os, 'access') and hasattr(os, "X_OK"): - # XXX: may fail on MACOS - try: - assert os.access(ret, os.X_OK) - except AssertionError: - if os.path.exists(ret) and not CI_TESTING: - raise - - def pid(self, ret, info): - assert isinstance(ret, int) - assert ret >= 0 - - def ppid(self, ret, info): - assert isinstance(ret, int) - assert ret >= 0 - proc_info(ret) - - def name(self, ret, info): - assert isinstance(ret, str) - if WINDOWS and not ret and is_win_secure_system_proc(info['pid']): - # https://github.com/giampaolo/psutil/issues/2338 - return - # on AIX, "" processes don't have names - if not AIX: - assert ret, repr(ret) - - def create_time(self, ret, info): - assert isinstance(ret, float) - try: - assert ret >= 0 - except AssertionError: - # XXX - if OPENBSD and info['status'] == psutil.STATUS_ZOMBIE: - pass - else: - raise - # this can't be taken for granted on all platforms - # self.assertGreaterEqual(ret, psutil.boot_time()) - # make sure returned value can be pretty printed - # with strftime - time.strftime("%Y %m %d %H:%M:%S", time.localtime(ret)) - - def uids(self, ret, info): - assert is_namedtuple(ret) - for uid in ret: - assert isinstance(uid, int) - assert uid >= 0 - - def gids(self, ret, info): - assert is_namedtuple(ret) - # note: testing all gids as above seems not to be reliable for - # gid == 30 (nodoby); not sure why. - for gid in ret: - assert isinstance(gid, int) - if not MACOS and not NETBSD: - assert gid >= 0 - - def username(self, ret, info): - assert isinstance(ret, str) - assert ret.strip() == ret - assert ret.strip() - - def status(self, ret, info): - assert isinstance(ret, str) - assert ret, ret - assert ret != '?' # XXX - assert ret in VALID_PROC_STATUSES - - def io_counters(self, ret, info): - assert is_namedtuple(ret) - for field in ret: - assert isinstance(field, int) - if field != -1: - assert field >= 0 - - def ionice(self, ret, info): - if LINUX: - assert isinstance(ret.ioclass, int) - assert isinstance(ret.value, int) - assert ret.ioclass >= 0 - assert ret.value >= 0 - else: # Windows, Cygwin - choices = [ - psutil.IOPRIO_VERYLOW, - psutil.IOPRIO_LOW, - psutil.IOPRIO_NORMAL, - psutil.IOPRIO_HIGH, - ] - assert isinstance(ret, int) - assert ret >= 0 - assert ret in choices - - def num_threads(self, ret, info): - assert isinstance(ret, int) - if WINDOWS and ret == 0 and is_win_secure_system_proc(info['pid']): - # https://github.com/giampaolo/psutil/issues/2338 - return - assert ret >= 1 - - def threads(self, ret, info): - assert isinstance(ret, list) - for t in ret: - assert is_namedtuple(t) - assert t.id >= 0 - assert t.user_time >= 0 - assert t.system_time >= 0 - for field in t: - assert isinstance(field, (int, float)) - - def cpu_times(self, ret, info): - assert is_namedtuple(ret) - for n in ret: - assert isinstance(n, float) - assert n >= 0 - # TODO: check ntuple fields - - def cpu_percent(self, ret, info): - assert isinstance(ret, float) - assert 0.0 <= ret <= 100.0, ret - - def cpu_num(self, ret, info): - assert isinstance(ret, int) - if FREEBSD and ret == -1: - return - assert ret >= 0 - if psutil.cpu_count() == 1: - assert ret == 0 - assert ret in list(range(psutil.cpu_count())) - - def memory_info(self, ret, info): - assert is_namedtuple(ret) - for value in ret: - assert isinstance(value, int) - assert value >= 0 - if WINDOWS: - assert ret.peak_wset >= ret.wset - assert ret.peak_paged_pool >= ret.paged_pool - assert ret.peak_nonpaged_pool >= ret.nonpaged_pool - assert ret.peak_pagefile >= ret.pagefile - - def memory_full_info(self, ret, info): - assert is_namedtuple(ret) - total = psutil.virtual_memory().total - for name in ret._fields: - value = getattr(ret, name) - assert isinstance(value, int) - assert value >= 0 - if LINUX or (OSX and name in {'vms', 'data'}): - # On Linux there are processes (e.g. 'goa-daemon') whose - # VMS is incredibly high for some reason. - continue - assert value <= total, name - - if LINUX: - assert ret.pss >= ret.uss - - def open_files(self, ret, info): - assert isinstance(ret, list) - for f in ret: - assert isinstance(f.fd, int) - assert isinstance(f.path, str) - assert f.path.strip() == f.path - if WINDOWS: - assert f.fd == -1 - elif LINUX: - assert isinstance(f.position, int) - assert isinstance(f.mode, str) - assert isinstance(f.flags, int) - assert f.position >= 0 - assert f.mode in {'r', 'w', 'a', 'r+', 'a+'} - assert f.flags > 0 - elif BSD and not f.path: - # XXX see: https://github.com/giampaolo/psutil/issues/595 - continue - assert os.path.isabs(f.path), f - try: - st = os.stat(f.path) - except FileNotFoundError: - pass - else: - assert stat.S_ISREG(st.st_mode), f - - def num_fds(self, ret, info): - assert isinstance(ret, int) - assert ret >= 0 - - def net_connections(self, ret, info): - with create_sockets(): - assert len(ret) == len(set(ret)) - for conn in ret: - assert is_namedtuple(conn) - check_connection_ntuple(conn) - - def cwd(self, ret, info): - assert isinstance(ret, str) - assert ret.strip() == ret - if ret: - assert os.path.isabs(ret), ret - try: - st = os.stat(ret) - except OSError as err: - if WINDOWS and psutil._psplatform.is_permission_err(err): - pass - # directory has been removed in mean time - elif err.errno != errno.ENOENT: - raise - else: - assert stat.S_ISDIR(st.st_mode) - - def memory_percent(self, ret, info): - assert isinstance(ret, float) - assert 0 <= ret <= 100, ret - - def is_running(self, ret, info): - assert isinstance(ret, bool) - - def cpu_affinity(self, ret, info): - assert isinstance(ret, list) - assert ret != [] - cpus = list(range(psutil.cpu_count())) - for n in ret: - assert isinstance(n, int) - assert n in cpus - - def terminal(self, ret, info): - assert isinstance(ret, (str, type(None))) - if ret is not None: - assert os.path.isabs(ret), ret - assert os.path.exists(ret), ret - - def memory_maps(self, ret, info): - for nt in ret: - assert isinstance(nt.addr, str) - assert isinstance(nt.perms, str) - assert isinstance(nt.path, str) - for fname in nt._fields: - value = getattr(nt, fname) - if fname == 'path': - if value.startswith(("[", "anon_inode:")): # linux - continue - if BSD and value == "pvclock": # seen on FreeBSD - continue - assert os.path.isabs(nt.path), nt.path - # commented as on Linux we might get - # '/foo/bar (deleted)' - # assert os.path.exists(nt.path), nt.path - elif fname == 'addr': - assert value, repr(value) - elif fname == 'perms': - if not WINDOWS: - assert value, repr(value) - else: - assert isinstance(value, int) - assert value >= 0 - - def num_handles(self, ret, info): - assert isinstance(ret, int) - assert ret >= 0 - - def nice(self, ret, info): - assert isinstance(ret, int) - if POSIX: - assert -20 <= ret <= 20, ret - else: - priorities = [ - getattr(psutil, x) - for x in dir(psutil) - if x.endswith('_PRIORITY_CLASS') - ] - assert ret in priorities - assert isinstance(ret, enum.IntEnum) - - def num_ctx_switches(self, ret, info): - assert is_namedtuple(ret) - for value in ret: - assert isinstance(value, int) - assert value >= 0 - - def rlimit(self, ret, info): - assert isinstance(ret, tuple) - assert len(ret) == 2 - assert ret[0] >= -1 - assert ret[1] >= -1 - - def environ(self, ret, info): - assert isinstance(ret, dict) - for k, v in ret.items(): - assert isinstance(k, str) - assert isinstance(v, str) - - -class TestPidsRange(PsutilTestCase): - """Given pid_exists() return value for a range of PIDs which may or - may not exist, make sure that psutil.Process() and psutil.pids() - agree with pid_exists(). This guarantees that the 3 APIs are all - consistent with each other. See: - https://github.com/giampaolo/psutil/issues/2359 - - XXX - Note about Windows: it turns out there are some "hidden" PIDs - which are not returned by psutil.pids() and are also not revealed - by taskmgr.exe and ProcessHacker, still they can be instantiated by - psutil.Process() and queried. One of such PIDs is "conhost.exe". - Running as_dict() for it reveals that some Process() APIs - erroneously raise NoSuchProcess, so we know we have problem there. - Let's ignore this for now, since it's quite a corner case (who even - imagined hidden PIDs existed on Windows?). - """ - - def setUp(self): - psutil._set_debug(False) - - def tearDown(self): - psutil._set_debug(True) - - def test_it(self): - def is_linux_tid(pid): - try: - f = open(f"/proc/{pid}/status", "rb") # noqa: SIM115 - except FileNotFoundError: - return False - else: - with f: - for line in f: - if line.startswith(b"Tgid:"): - tgid = int(line.split()[1]) - # If tgid and pid are different then we're - # dealing with a process TID. - return tgid != pid - raise ValueError("'Tgid' line not found") - - def check(pid): - # In case of failure retry up to 3 times in order to avoid - # race conditions, especially when running in a CI - # environment where PIDs may appear and disappear at any - # time. - x = 3 - while True: - exists = psutil.pid_exists(pid) - try: - if exists: - psutil.Process(pid) - if not WINDOWS: # see docstring - assert pid in psutil.pids() - else: - # On OpenBSD thread IDs can be instantiated, - # and oneshot() succeeds, but other APIs fail - # with EINVAL. - if not OPENBSD: - with pytest.raises(psutil.NoSuchProcess): - psutil.Process(pid) - if not WINDOWS: # see docstring - assert pid not in psutil.pids() - except (psutil.Error, AssertionError): - x -= 1 - if x == 0: - raise - else: - return - - for pid in range(1, 3000): - if LINUX and is_linux_tid(pid): - # On Linux a TID (thread ID) can be passed to the - # Process class and is querable like a PID (process - # ID). Skip it. - continue - with self.subTest(pid=pid): - check(pid) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_scripts.py b/PortablePython/Lib/site-packages/psutil/tests/test_scripts.py deleted file mode 100644 index de0ad2a..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_scripts.py +++ /dev/null @@ -1,240 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Test various scripts.""" - -import ast -import os -import shutil -import stat -import subprocess - -import pytest - -from psutil import POSIX -from psutil import WINDOWS -from psutil.tests import CI_TESTING -from psutil.tests import HAS_BATTERY -from psutil.tests import HAS_MEMORY_MAPS -from psutil.tests import HAS_SENSORS_BATTERY -from psutil.tests import HAS_SENSORS_FANS -from psutil.tests import HAS_SENSORS_TEMPERATURES -from psutil.tests import PYTHON_EXE -from psutil.tests import PYTHON_EXE_ENV -from psutil.tests import ROOT_DIR -from psutil.tests import SCRIPTS_DIR -from psutil.tests import PsutilTestCase -from psutil.tests import import_module_by_path -from psutil.tests import psutil -from psutil.tests import sh - - -INTERNAL_SCRIPTS_DIR = os.path.join(SCRIPTS_DIR, "internal") -SETUP_PY = os.path.join(ROOT_DIR, 'setup.py') - - -# =================================================================== -# --- Tests scripts in scripts/ directory -# =================================================================== - - -@pytest.mark.skipif( - CI_TESTING and not os.path.exists(SCRIPTS_DIR), - reason="can't find scripts/ directory", -) -class TestExampleScripts(PsutilTestCase): - @staticmethod - def assert_stdout(exe, *args, **kwargs): - kwargs.setdefault("env", PYTHON_EXE_ENV) - exe = os.path.join(SCRIPTS_DIR, exe) - cmd = [PYTHON_EXE, exe] - for arg in args: - cmd.append(arg) - try: - out = sh(cmd, **kwargs).strip() - except RuntimeError as err: - if 'AccessDenied' in str(err): - return str(err) - else: - raise - assert out, out - return out - - @staticmethod - def assert_syntax(exe): - exe = os.path.join(SCRIPTS_DIR, exe) - with open(exe, encoding="utf8") as f: - src = f.read() - ast.parse(src) - - def test_coverage(self): - # make sure all example scripts have a test method defined - meths = dir(self) - for name in os.listdir(SCRIPTS_DIR): - if name.endswith('.py'): - if 'test_' + os.path.splitext(name)[0] not in meths: - # self.assert_stdout(name) - raise self.fail( - "no test defined for" - f" {os.path.join(SCRIPTS_DIR, name)!r} script" - ) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_executable(self): - for root, dirs, files in os.walk(SCRIPTS_DIR): - for file in files: - if file.endswith('.py'): - path = os.path.join(root, file) - if not stat.S_IXUSR & os.stat(path)[stat.ST_MODE]: - raise self.fail(f"{path!r} is not executable") - - def test_disk_usage(self): - self.assert_stdout('disk_usage.py') - - def test_free(self): - self.assert_stdout('free.py') - - def test_meminfo(self): - self.assert_stdout('meminfo.py') - - def test_procinfo(self): - self.assert_stdout('procinfo.py', str(os.getpid())) - - @pytest.mark.skipif(CI_TESTING and not psutil.users(), reason="no users") - def test_who(self): - self.assert_stdout('who.py') - - def test_ps(self): - self.assert_stdout('ps.py') - - def test_pstree(self): - self.assert_stdout('pstree.py') - - def test_netstat(self): - self.assert_stdout('netstat.py') - - def test_ifconfig(self): - self.assert_stdout('ifconfig.py') - - @pytest.mark.skipif(not HAS_MEMORY_MAPS, reason="not supported") - def test_pmap(self): - self.assert_stdout('pmap.py', str(os.getpid())) - - def test_procsmem(self): - if 'uss' not in psutil.Process().memory_full_info()._fields: - raise pytest.skip("not supported") - self.assert_stdout('procsmem.py') - - def test_killall(self): - self.assert_syntax('killall.py') - - def test_nettop(self): - self.assert_syntax('nettop.py') - - def test_top(self): - self.assert_syntax('top.py') - - def test_iotop(self): - self.assert_syntax('iotop.py') - - def test_pidof(self): - output = self.assert_stdout('pidof.py', psutil.Process().name()) - assert str(os.getpid()) in output - - @pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") - def test_winservices(self): - self.assert_stdout('winservices.py') - - def test_cpu_distribution(self): - self.assert_syntax('cpu_distribution.py') - - @pytest.mark.skipif(not HAS_SENSORS_TEMPERATURES, reason="not supported") - def test_temperatures(self): - if not psutil.sensors_temperatures(): - raise pytest.skip("no temperatures") - self.assert_stdout('temperatures.py') - - @pytest.mark.skipif(not HAS_SENSORS_FANS, reason="not supported") - def test_fans(self): - if not psutil.sensors_fans(): - raise pytest.skip("no fans") - self.assert_stdout('fans.py') - - @pytest.mark.skipif(not HAS_SENSORS_BATTERY, reason="not supported") - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_battery(self): - self.assert_stdout('battery.py') - - @pytest.mark.skipif(not HAS_SENSORS_BATTERY, reason="not supported") - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_sensors(self): - self.assert_stdout('sensors.py') - - -# =================================================================== -# --- Tests scripts in scripts/internal/ directory -# =================================================================== - - -@pytest.mark.skipif( - CI_TESTING and not os.path.exists(INTERNAL_SCRIPTS_DIR), - reason="can't find scripts/internal/ directory", -) -class TestInternalScripts(PsutilTestCase): - @staticmethod - def ls(): - for name in os.listdir(INTERNAL_SCRIPTS_DIR): - if name.endswith(".py"): - yield os.path.join(INTERNAL_SCRIPTS_DIR, name) - - def test_syntax_all(self): - for path in self.ls(): - with open(path, encoding="utf8") as f: - data = f.read() - ast.parse(data) - - @pytest.mark.skipif(CI_TESTING, reason="not on CI") - def test_import_all(self): - for path in self.ls(): - try: - import_module_by_path(path) - except SystemExit: - pass - - -# =================================================================== -# --- Tests for setup.py script -# =================================================================== - - -@pytest.mark.skipif( - CI_TESTING and not os.path.exists(SETUP_PY), reason="can't find setup.py" -) -class TestSetupScript(PsutilTestCase): - def test_invocation(self): - module = import_module_by_path(SETUP_PY) - with pytest.raises(SystemExit): - module.setup() - assert module.get_version() == psutil.__version__ - - @pytest.mark.skipif( - not shutil.which("python2.7"), reason="python2.7 not installed" - ) - def test_python2(self): - # There's a duplicate of this test in scripts/internal - # directory, which is only executed by CI. We replicate it here - # to run it when developing locally. - p = subprocess.Popen( - [shutil.which("python2.7"), SETUP_PY], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - universal_newlines=True, - ) - stdout, stderr = p.communicate() - assert p.wait() == 1 - assert not stdout - assert "psutil no longer supports Python 2.7" in stderr - assert "Latest version supporting Python 2.7 is" in stderr diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_sunos.py b/PortablePython/Lib/site-packages/psutil/tests/test_sunos.py deleted file mode 100644 index b5d9d35..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_sunos.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Sun OS specific tests.""" - -import os - -import psutil -from psutil import SUNOS -from psutil.tests import PsutilTestCase -from psutil.tests import pytest -from psutil.tests import sh - - -@pytest.mark.skipif(not SUNOS, reason="SUNOS only") -class SunOSSpecificTestCase(PsutilTestCase): - def test_swap_memory(self): - out = sh(f"env PATH=/usr/sbin:/sbin:{os.environ['PATH']} swap -l") - lines = out.strip().split('\n')[1:] - if not lines: - raise ValueError('no swap device(s) configured') - total = free = 0 - for line in lines: - fields = line.split() - total = int(fields[3]) * 512 - free = int(fields[4]) * 512 - used = total - free - - psutil_swap = psutil.swap_memory() - assert psutil_swap.total == total - assert psutil_swap.used == used - assert psutil_swap.free == free - - def test_cpu_count(self): - out = sh("/usr/sbin/psrinfo") - assert psutil.cpu_count() == len(out.split('\n')) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_system.py b/PortablePython/Lib/site-packages/psutil/tests/test_system.py deleted file mode 100644 index b961e1f..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_system.py +++ /dev/null @@ -1,979 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for system APIS.""" - -import datetime -import enum -import errno -import os -import platform -import pprint -import shutil -import signal -import socket -import sys -import time -from unittest import mock - -import psutil -from psutil import AIX -from psutil import BSD -from psutil import FREEBSD -from psutil import LINUX -from psutil import MACOS -from psutil import NETBSD -from psutil import OPENBSD -from psutil import POSIX -from psutil import SUNOS -from psutil import WINDOWS -from psutil._common import broadcast_addr -from psutil.tests import AARCH64 -from psutil.tests import ASCII_FS -from psutil.tests import CI_TESTING -from psutil.tests import GITHUB_ACTIONS -from psutil.tests import GLOBAL_TIMEOUT -from psutil.tests import HAS_BATTERY -from psutil.tests import HAS_CPU_FREQ -from psutil.tests import HAS_GETLOADAVG -from psutil.tests import HAS_NET_IO_COUNTERS -from psutil.tests import HAS_SENSORS_BATTERY -from psutil.tests import HAS_SENSORS_FANS -from psutil.tests import HAS_SENSORS_TEMPERATURES -from psutil.tests import IS_64BIT -from psutil.tests import MACOS_12PLUS -from psutil.tests import PYPY -from psutil.tests import UNICODE_SUFFIX -from psutil.tests import PsutilTestCase -from psutil.tests import check_net_address -from psutil.tests import pytest -from psutil.tests import retry_on_failure - - -# =================================================================== -# --- System-related API tests -# =================================================================== - - -class TestProcessIter(PsutilTestCase): - def test_pid_presence(self): - assert os.getpid() in [x.pid for x in psutil.process_iter()] - sproc = self.spawn_testproc() - assert sproc.pid in [x.pid for x in psutil.process_iter()] - p = psutil.Process(sproc.pid) - p.kill() - p.wait() - assert sproc.pid not in [x.pid for x in psutil.process_iter()] - - def test_no_duplicates(self): - ls = list(psutil.process_iter()) - assert sorted(ls, key=lambda x: x.pid) == sorted( - set(ls), key=lambda x: x.pid - ) - - def test_emulate_nsp(self): - list(psutil.process_iter()) # populate cache - for x in range(2): - with mock.patch( - 'psutil.Process.as_dict', - side_effect=psutil.NoSuchProcess(os.getpid()), - ): - assert not list(psutil.process_iter(attrs=["cpu_times"])) - psutil.process_iter.cache_clear() # repeat test without cache - - def test_emulate_access_denied(self): - list(psutil.process_iter()) # populate cache - for x in range(2): - with mock.patch( - 'psutil.Process.as_dict', - side_effect=psutil.AccessDenied(os.getpid()), - ): - with pytest.raises(psutil.AccessDenied): - list(psutil.process_iter(attrs=["cpu_times"])) - psutil.process_iter.cache_clear() # repeat test without cache - - def test_attrs(self): - for p in psutil.process_iter(attrs=['pid']): - assert list(p.info.keys()) == ['pid'] - # yield again - for p in psutil.process_iter(attrs=['pid']): - assert list(p.info.keys()) == ['pid'] - with pytest.raises(ValueError): - list(psutil.process_iter(attrs=['foo'])) - with mock.patch( - "psutil._psplatform.Process.cpu_times", - side_effect=psutil.AccessDenied(0, ""), - ) as m: - for p in psutil.process_iter(attrs=["pid", "cpu_times"]): - assert p.info['cpu_times'] is None - assert p.info['pid'] >= 0 - assert m.called - with mock.patch( - "psutil._psplatform.Process.cpu_times", - side_effect=psutil.AccessDenied(0, ""), - ) as m: - flag = object() - for p in psutil.process_iter( - attrs=["pid", "cpu_times"], ad_value=flag - ): - assert p.info['cpu_times'] is flag - assert p.info['pid'] >= 0 - assert m.called - - def test_cache_clear(self): - list(psutil.process_iter()) # populate cache - assert psutil._pmap - psutil.process_iter.cache_clear() - assert not psutil._pmap - - -class TestProcessAPIs(PsutilTestCase): - @pytest.mark.skipif( - PYPY and WINDOWS, - reason="spawn_testproc() unreliable on PYPY + WINDOWS", - ) - def test_wait_procs(self): - def callback(p): - pids.append(p.pid) - - pids = [] - sproc1 = self.spawn_testproc() - sproc2 = self.spawn_testproc() - sproc3 = self.spawn_testproc() - procs = [psutil.Process(x.pid) for x in (sproc1, sproc2, sproc3)] - with pytest.raises(ValueError): - psutil.wait_procs(procs, timeout=-1) - with pytest.raises(TypeError): - psutil.wait_procs(procs, callback=1) - t = time.time() - gone, alive = psutil.wait_procs(procs, timeout=0.01, callback=callback) - - assert time.time() - t < 0.5 - assert not gone - assert len(alive) == 3 - assert not pids - for p in alive: - assert not hasattr(p, 'returncode') - - @retry_on_failure(30) - def test_1(procs, callback): - gone, alive = psutil.wait_procs( - procs, timeout=0.03, callback=callback - ) - assert len(gone) == 1 - assert len(alive) == 2 - return gone, alive - - sproc3.terminate() - gone, alive = test_1(procs, callback) - assert sproc3.pid in [x.pid for x in gone] - if POSIX: - assert gone.pop().returncode == -signal.SIGTERM - else: - assert gone.pop().returncode == 1 - assert pids == [sproc3.pid] - for p in alive: - assert not hasattr(p, 'returncode') - - @retry_on_failure(30) - def test_2(procs, callback): - gone, alive = psutil.wait_procs( - procs, timeout=0.03, callback=callback - ) - assert len(gone) == 3 - assert len(alive) == 0 - return gone, alive - - sproc1.terminate() - sproc2.terminate() - gone, alive = test_2(procs, callback) - assert set(pids) == {sproc1.pid, sproc2.pid, sproc3.pid} - for p in gone: - assert hasattr(p, 'returncode') - - @pytest.mark.skipif( - PYPY and WINDOWS, - reason="spawn_testproc() unreliable on PYPY + WINDOWS", - ) - def test_wait_procs_no_timeout(self): - sproc1 = self.spawn_testproc() - sproc2 = self.spawn_testproc() - sproc3 = self.spawn_testproc() - procs = [psutil.Process(x.pid) for x in (sproc1, sproc2, sproc3)] - for p in procs: - p.terminate() - psutil.wait_procs(procs) - - def test_pid_exists(self): - sproc = self.spawn_testproc() - assert psutil.pid_exists(sproc.pid) - p = psutil.Process(sproc.pid) - p.kill() - p.wait() - assert not psutil.pid_exists(sproc.pid) - assert not psutil.pid_exists(-1) - assert psutil.pid_exists(0) == (0 in psutil.pids()) - - def test_pid_exists_2(self): - pids = psutil.pids() - for pid in pids: - try: - assert psutil.pid_exists(pid) - except AssertionError: - # in case the process disappeared in meantime fail only - # if it is no longer in psutil.pids() - time.sleep(0.1) - assert pid not in psutil.pids() - pids = range(max(pids) + 15000, max(pids) + 16000) - for pid in pids: - assert not psutil.pid_exists(pid) - - -class TestMiscAPIs(PsutilTestCase): - def test_boot_time(self): - bt = psutil.boot_time() - assert isinstance(bt, float) - assert bt > 0 - assert bt < time.time() - - @pytest.mark.skipif( - CI_TESTING and not psutil.users(), reason="unreliable on CI" - ) - def test_users(self): - users = psutil.users() - assert users - for user in users: - with self.subTest(user=user): - assert user.name - assert isinstance(user.name, str) - assert isinstance(user.terminal, (str, type(None))) - if user.host is not None: - assert isinstance(user.host, (str, type(None))) - user.terminal # noqa: B018 - user.host # noqa: B018 - assert user.started > 0.0 - datetime.datetime.fromtimestamp(user.started) - if WINDOWS or OPENBSD: - assert user.pid is None - else: - psutil.Process(user.pid) - - def test_os_constants(self): - names = [ - "POSIX", - "WINDOWS", - "LINUX", - "MACOS", - "FREEBSD", - "OPENBSD", - "NETBSD", - "BSD", - "SUNOS", - ] - for name in names: - assert isinstance(getattr(psutil, name), bool), name - - if os.name == 'posix': - assert psutil.POSIX - assert not psutil.WINDOWS - names.remove("POSIX") - if "linux" in sys.platform.lower(): - assert psutil.LINUX - names.remove("LINUX") - elif "bsd" in sys.platform.lower(): - assert psutil.BSD - assert [psutil.FREEBSD, psutil.OPENBSD, psutil.NETBSD].count( - True - ) == 1 - names.remove("BSD") - names.remove("FREEBSD") - names.remove("OPENBSD") - names.remove("NETBSD") - elif ( - "sunos" in sys.platform.lower() - or "solaris" in sys.platform.lower() - ): - assert psutil.SUNOS - names.remove("SUNOS") - elif "darwin" in sys.platform.lower(): - assert psutil.MACOS - names.remove("MACOS") - else: - assert psutil.WINDOWS - assert not psutil.POSIX - names.remove("WINDOWS") - - # assert all other constants are set to False - for name in names: - assert not getattr(psutil, name), name - - -class TestMemoryAPIs(PsutilTestCase): - def test_virtual_memory(self): - mem = psutil.virtual_memory() - assert mem.total > 0, mem - assert mem.available > 0, mem - assert 0 <= mem.percent <= 100, mem - assert mem.used > 0, mem - assert mem.free >= 0, mem - for name in mem._fields: - value = getattr(mem, name) - if name != 'percent': - assert isinstance(value, int) - if name != 'total': - if not value >= 0: - raise self.fail(f"{name!r} < 0 ({value})") - if value > mem.total: - raise self.fail( - f"{name!r} > total (total={mem.total}, {name}={value})" - ) - - def test_swap_memory(self): - mem = psutil.swap_memory() - assert mem._fields == ( - 'total', - 'used', - 'free', - 'percent', - 'sin', - 'sout', - ) - - assert mem.total >= 0, mem - assert mem.used >= 0, mem - if mem.total > 0: - # likely a system with no swap partition - assert mem.free > 0, mem - else: - assert mem.free == 0, mem - assert 0 <= mem.percent <= 100, mem - assert mem.sin >= 0, mem - assert mem.sout >= 0, mem - - -class TestCpuAPIs(PsutilTestCase): - def test_cpu_count_logical(self): - logical = psutil.cpu_count() - assert logical is not None - assert logical == len(psutil.cpu_times(percpu=True)) - assert logical >= 1 - - if os.path.exists("/proc/cpuinfo"): - with open("/proc/cpuinfo") as fd: - cpuinfo_data = fd.read() - if "physical id" not in cpuinfo_data: - raise pytest.skip("cpuinfo doesn't include physical id") - - def test_cpu_count_cores(self): - logical = psutil.cpu_count() - cores = psutil.cpu_count(logical=False) - if cores is None: - raise pytest.skip("cpu_count_cores() is None") - if WINDOWS and sys.getwindowsversion()[:2] <= (6, 1): # <= Vista - assert cores is None - else: - assert cores >= 1 - assert logical >= cores - - def test_cpu_count_none(self): - # https://github.com/giampaolo/psutil/issues/1085 - for val in (-1, 0, None): - with mock.patch( - 'psutil._psplatform.cpu_count_logical', return_value=val - ) as m: - assert psutil.cpu_count() is None - assert m.called - with mock.patch( - 'psutil._psplatform.cpu_count_cores', return_value=val - ) as m: - assert psutil.cpu_count(logical=False) is None - assert m.called - - def test_cpu_times(self): - # Check type, value >= 0, str(). - total = 0 - times = psutil.cpu_times() - sum(times) - for cp_time in times: - assert isinstance(cp_time, float) - assert cp_time >= 0.0 - total += cp_time - assert round(abs(total - sum(times)), 6) == 0 - str(times) - # CPU times are always supposed to increase over time - # or at least remain the same and that's because time - # cannot go backwards. - # Surprisingly sometimes this might not be the case (at - # least on Windows and Linux), see: - # https://github.com/giampaolo/psutil/issues/392 - # https://github.com/giampaolo/psutil/issues/645 - # if not WINDOWS: - # last = psutil.cpu_times() - # for x in range(100): - # new = psutil.cpu_times() - # for field in new._fields: - # new_t = getattr(new, field) - # last_t = getattr(last, field) - # self.assertGreaterEqual( - # new_t, last_t, - # msg="{} {}".format(new_t, last_t)) - # last = new - - def test_cpu_times_time_increases(self): - # Make sure time increases between calls. - t1 = sum(psutil.cpu_times()) - stop_at = time.time() + GLOBAL_TIMEOUT - while time.time() < stop_at: - t2 = sum(psutil.cpu_times()) - if t2 > t1: - return - raise self.fail("time remained the same") - - def test_per_cpu_times(self): - # Check type, value >= 0, str(). - for times in psutil.cpu_times(percpu=True): - total = 0 - sum(times) - for cp_time in times: - assert isinstance(cp_time, float) - assert cp_time >= 0.0 - total += cp_time - assert round(abs(total - sum(times)), 6) == 0 - str(times) - assert len(psutil.cpu_times(percpu=True)[0]) == len( - psutil.cpu_times(percpu=False) - ) - - # Note: in theory CPU times are always supposed to increase over - # time or remain the same but never go backwards. In practice - # sometimes this is not the case. - # This issue seemd to be afflict Windows: - # https://github.com/giampaolo/psutil/issues/392 - # ...but it turns out also Linux (rarely) behaves the same. - # last = psutil.cpu_times(percpu=True) - # for x in range(100): - # new = psutil.cpu_times(percpu=True) - # for index in range(len(new)): - # newcpu = new[index] - # lastcpu = last[index] - # for field in newcpu._fields: - # new_t = getattr(newcpu, field) - # last_t = getattr(lastcpu, field) - # self.assertGreaterEqual( - # new_t, last_t, msg="{} {}".format(lastcpu, newcpu)) - # last = new - - def test_per_cpu_times_2(self): - # Simulate some work load then make sure time have increased - # between calls. - tot1 = psutil.cpu_times(percpu=True) - giveup_at = time.time() + GLOBAL_TIMEOUT - while True: - if time.time() >= giveup_at: - return self.fail("timeout") - tot2 = psutil.cpu_times(percpu=True) - for t1, t2 in zip(tot1, tot2): - t1, t2 = psutil._cpu_busy_time(t1), psutil._cpu_busy_time(t2) - difference = t2 - t1 - if difference >= 0.05: - return None - - @pytest.mark.skipif( - CI_TESTING and OPENBSD, reason="unreliable on OPENBSD + CI" - ) - @retry_on_failure(30) - def test_cpu_times_comparison(self): - # Make sure the sum of all per cpu times is almost equal to - # base "one cpu" times. On OpenBSD the sum of per-CPUs is - # higher for some reason. - base = psutil.cpu_times() - per_cpu = psutil.cpu_times(percpu=True) - summed_values = base._make([sum(num) for num in zip(*per_cpu)]) - for field in base._fields: - with self.subTest(field=field, base=base, per_cpu=per_cpu): - assert ( - abs(getattr(base, field) - getattr(summed_values, field)) - < 2 - ) - - def _test_cpu_percent(self, percent, last_ret, new_ret): - try: - assert isinstance(percent, float) - assert percent >= 0.0 - assert percent <= 100.0 * psutil.cpu_count() - except AssertionError as err: - raise AssertionError( - "\n{}\nlast={}\nnew={}".format( - err, pprint.pformat(last_ret), pprint.pformat(new_ret) - ) - ) - - def test_cpu_percent(self): - last = psutil.cpu_percent(interval=0.001) - for _ in range(100): - new = psutil.cpu_percent(interval=None) - self._test_cpu_percent(new, last, new) - last = new - with pytest.raises(ValueError): - psutil.cpu_percent(interval=-1) - - def test_per_cpu_percent(self): - last = psutil.cpu_percent(interval=0.001, percpu=True) - assert len(last) == psutil.cpu_count() - for _ in range(100): - new = psutil.cpu_percent(interval=None, percpu=True) - for percent in new: - self._test_cpu_percent(percent, last, new) - last = new - with pytest.raises(ValueError): - psutil.cpu_percent(interval=-1, percpu=True) - - def test_cpu_times_percent(self): - last = psutil.cpu_times_percent(interval=0.001) - for _ in range(100): - new = psutil.cpu_times_percent(interval=None) - for percent in new: - self._test_cpu_percent(percent, last, new) - self._test_cpu_percent(sum(new), last, new) - last = new - with pytest.raises(ValueError): - psutil.cpu_times_percent(interval=-1) - - def test_per_cpu_times_percent(self): - last = psutil.cpu_times_percent(interval=0.001, percpu=True) - assert len(last) == psutil.cpu_count() - for _ in range(100): - new = psutil.cpu_times_percent(interval=None, percpu=True) - for cpu in new: - for percent in cpu: - self._test_cpu_percent(percent, last, new) - self._test_cpu_percent(sum(cpu), last, new) - last = new - - def test_per_cpu_times_percent_negative(self): - # see: https://github.com/giampaolo/psutil/issues/645 - psutil.cpu_times_percent(percpu=True) - zero_times = [ - x._make([0 for x in range(len(x._fields))]) - for x in psutil.cpu_times(percpu=True) - ] - with mock.patch('psutil.cpu_times', return_value=zero_times): - for cpu in psutil.cpu_times_percent(percpu=True): - for percent in cpu: - self._test_cpu_percent(percent, None, None) - - def test_cpu_stats(self): - # Tested more extensively in per-platform test modules. - infos = psutil.cpu_stats() - assert infos._fields == ( - 'ctx_switches', - 'interrupts', - 'soft_interrupts', - 'syscalls', - ) - for name in infos._fields: - value = getattr(infos, name) - assert value >= 0 - # on AIX, ctx_switches is always 0 - if not AIX and name in {'ctx_switches', 'interrupts'}: - assert value > 0 - - # TODO: remove this once 1892 is fixed - @pytest.mark.skipif( - MACOS and platform.machine() == 'arm64', reason="skipped due to #1892" - ) - @pytest.mark.skipif(not HAS_CPU_FREQ, reason="not supported") - def test_cpu_freq(self): - def check_ls(ls): - for nt in ls: - assert nt._fields == ('current', 'min', 'max') - if nt.max != 0.0: - assert nt.current <= nt.max - for name in nt._fields: - value = getattr(nt, name) - assert isinstance(value, (int, float)) - assert value >= 0 - - ls = psutil.cpu_freq(percpu=True) - if (FREEBSD or AARCH64) and not ls: - raise pytest.skip( - "returns empty list on FreeBSD and Linux aarch64" - ) - - assert ls, ls - check_ls([psutil.cpu_freq(percpu=False)]) - - if LINUX: - assert len(ls) == psutil.cpu_count() - - @pytest.mark.skipif(not HAS_GETLOADAVG, reason="not supported") - def test_getloadavg(self): - loadavg = psutil.getloadavg() - assert len(loadavg) == 3 - for load in loadavg: - assert isinstance(load, float) - assert load >= 0.0 - - -class TestDiskAPIs(PsutilTestCase): - @pytest.mark.skipif( - PYPY and not IS_64BIT, reason="unreliable on PYPY32 + 32BIT" - ) - def test_disk_usage(self): - usage = psutil.disk_usage(os.getcwd()) - assert usage._fields == ('total', 'used', 'free', 'percent') - - assert usage.total > 0, usage - assert usage.used > 0, usage - assert usage.free > 0, usage - assert usage.total > usage.used, usage - assert usage.total > usage.free, usage - assert 0 <= usage.percent <= 100, usage.percent - if hasattr(shutil, 'disk_usage'): - # py >= 3.3, see: http://bugs.python.org/issue12442 - shutil_usage = shutil.disk_usage(os.getcwd()) - tolerance = 5 * 1024 * 1024 # 5MB - assert usage.total == shutil_usage.total - assert abs(usage.free - shutil_usage.free) < tolerance - if not MACOS_12PLUS: - # see https://github.com/giampaolo/psutil/issues/2147 - assert abs(usage.used - shutil_usage.used) < tolerance - - # if path does not exist OSError ENOENT is expected across - # all platforms - fname = self.get_testfn() - with pytest.raises(FileNotFoundError): - psutil.disk_usage(fname) - - @pytest.mark.skipif(not ASCII_FS, reason="not an ASCII fs") - def test_disk_usage_unicode(self): - # See: https://github.com/giampaolo/psutil/issues/416 - with pytest.raises(UnicodeEncodeError): - psutil.disk_usage(UNICODE_SUFFIX) - - def test_disk_usage_bytes(self): - psutil.disk_usage(b'.') - - def test_disk_partitions(self): - def check_ntuple(nt): - assert isinstance(nt.device, str) - assert isinstance(nt.mountpoint, str) - assert isinstance(nt.fstype, str) - assert isinstance(nt.opts, str) - - # all = False - ls = psutil.disk_partitions(all=False) - assert ls - for disk in ls: - check_ntuple(disk) - if WINDOWS and 'cdrom' in disk.opts: - continue - if not POSIX: - assert os.path.exists(disk.device), disk - else: - # we cannot make any assumption about this, see: - # http://goo.gl/p9c43 - disk.device # noqa: B018 - # on modern systems mount points can also be files - assert os.path.exists(disk.mountpoint), disk - assert disk.fstype, disk - - # all = True - ls = psutil.disk_partitions(all=True) - assert ls - for disk in psutil.disk_partitions(all=True): - check_ntuple(disk) - if not WINDOWS and disk.mountpoint: - try: - os.stat(disk.mountpoint) - except OSError as err: - if GITHUB_ACTIONS and MACOS and err.errno == errno.EIO: - continue - # http://mail.python.org/pipermail/python-dev/ - # 2012-June/120787.html - if err.errno not in {errno.EPERM, errno.EACCES}: - raise - else: - assert os.path.exists(disk.mountpoint), disk - - # --- - - def find_mount_point(path): - path = os.path.abspath(path) - while not os.path.ismount(path): - path = os.path.dirname(path) - return path.lower() - - mount = find_mount_point(__file__) - mounts = [ - x.mountpoint.lower() - for x in psutil.disk_partitions(all=True) - if x.mountpoint - ] - assert mount in mounts - - @pytest.mark.skipif( - LINUX and not os.path.exists('/proc/diskstats'), - reason="/proc/diskstats not available on this linux version", - ) - @pytest.mark.skipif( - CI_TESTING and not psutil.disk_io_counters(), reason="unreliable on CI" - ) # no visible disks - def test_disk_io_counters(self): - def check_ntuple(nt): - assert nt[0] == nt.read_count - assert nt[1] == nt.write_count - assert nt[2] == nt.read_bytes - assert nt[3] == nt.write_bytes - if not (OPENBSD or NETBSD): - assert nt[4] == nt.read_time - assert nt[5] == nt.write_time - if LINUX: - assert nt[6] == nt.read_merged_count - assert nt[7] == nt.write_merged_count - assert nt[8] == nt.busy_time - elif FREEBSD: - assert nt[6] == nt.busy_time - for name in nt._fields: - assert getattr(nt, name) >= 0, nt - - ret = psutil.disk_io_counters(perdisk=False) - assert ret is not None, "no disks on this system?" - check_ntuple(ret) - ret = psutil.disk_io_counters(perdisk=True) - # make sure there are no duplicates - assert len(ret) == len(set(ret)) - for key in ret: - assert key, key - check_ntuple(ret[key]) - - def test_disk_io_counters_no_disks(self): - # Emulate a case where no disks are installed, see: - # https://github.com/giampaolo/psutil/issues/1062 - with mock.patch( - 'psutil._psplatform.disk_io_counters', return_value={} - ) as m: - assert psutil.disk_io_counters(perdisk=False) is None - assert psutil.disk_io_counters(perdisk=True) == {} - assert m.called - - -class TestNetAPIs(PsutilTestCase): - @pytest.mark.skipif(not HAS_NET_IO_COUNTERS, reason="not supported") - def test_net_io_counters(self): - def check_ntuple(nt): - assert nt[0] == nt.bytes_sent - assert nt[1] == nt.bytes_recv - assert nt[2] == nt.packets_sent - assert nt[3] == nt.packets_recv - assert nt[4] == nt.errin - assert nt[5] == nt.errout - assert nt[6] == nt.dropin - assert nt[7] == nt.dropout - assert nt.bytes_sent >= 0, nt - assert nt.bytes_recv >= 0, nt - assert nt.packets_sent >= 0, nt - assert nt.packets_recv >= 0, nt - assert nt.errin >= 0, nt - assert nt.errout >= 0, nt - assert nt.dropin >= 0, nt - assert nt.dropout >= 0, nt - - ret = psutil.net_io_counters(pernic=False) - check_ntuple(ret) - ret = psutil.net_io_counters(pernic=True) - assert ret != [] - for key in ret: - assert key - assert isinstance(key, str) - check_ntuple(ret[key]) - - @pytest.mark.skipif(not HAS_NET_IO_COUNTERS, reason="not supported") - def test_net_io_counters_no_nics(self): - # Emulate a case where no NICs are installed, see: - # https://github.com/giampaolo/psutil/issues/1062 - with mock.patch( - 'psutil._psplatform.net_io_counters', return_value={} - ) as m: - assert psutil.net_io_counters(pernic=False) is None - assert psutil.net_io_counters(pernic=True) == {} - assert m.called - - def test_net_if_addrs(self): - nics = psutil.net_if_addrs() - assert nics, nics - - nic_stats = psutil.net_if_stats() - - # Not reliable on all platforms (net_if_addrs() reports more - # interfaces). - # self.assertEqual(sorted(nics.keys()), - # sorted(psutil.net_io_counters(pernic=True).keys())) - - families = {socket.AF_INET, socket.AF_INET6, psutil.AF_LINK} - for nic, addrs in nics.items(): - assert isinstance(nic, str) - assert len(set(addrs)) == len(addrs) - for addr in addrs: - assert isinstance(addr.family, int) - assert isinstance(addr.address, str) - assert isinstance(addr.netmask, (str, type(None))) - assert isinstance(addr.broadcast, (str, type(None))) - assert addr.family in families - assert isinstance(addr.family, enum.IntEnum) - if nic_stats[nic].isup: - # Do not test binding to addresses of interfaces - # that are down - if addr.family == socket.AF_INET: - with socket.socket(addr.family) as s: - s.bind((addr.address, 0)) - elif addr.family == socket.AF_INET6: - info = socket.getaddrinfo( - addr.address, - 0, - socket.AF_INET6, - socket.SOCK_STREAM, - 0, - socket.AI_PASSIVE, - )[0] - af, socktype, proto, _canonname, sa = info - with socket.socket(af, socktype, proto) as s: - s.bind(sa) - for ip in ( - addr.address, - addr.netmask, - addr.broadcast, - addr.ptp, - ): - if ip is not None: - # TODO: skip AF_INET6 for now because I get: - # AddressValueError: Only hex digits permitted in - # u'c6f3%lxcbr0' in u'fe80::c8e0:fff:fe54:c6f3%lxcbr0' - if addr.family != socket.AF_INET6: - check_net_address(ip, addr.family) - # broadcast and ptp addresses are mutually exclusive - if addr.broadcast: - assert addr.ptp is None - elif addr.ptp: - assert addr.broadcast is None - - # check broadcast address - if ( - addr.broadcast - and addr.netmask - and addr.family in {socket.AF_INET, socket.AF_INET6} - ): - assert addr.broadcast == broadcast_addr(addr) - - if BSD or MACOS or SUNOS: - if hasattr(socket, "AF_LINK"): - assert psutil.AF_LINK == socket.AF_LINK - elif LINUX: - assert psutil.AF_LINK == socket.AF_PACKET - elif WINDOWS: - assert psutil.AF_LINK == -1 - - def test_net_if_addrs_mac_null_bytes(self): - # Simulate that the underlying C function returns an incomplete - # MAC address. psutil is supposed to fill it with null bytes. - # https://github.com/giampaolo/psutil/issues/786 - if POSIX: - ret = [('em1', psutil.AF_LINK, '06:3d:29', None, None, None)] - else: - ret = [('em1', -1, '06-3d-29', None, None, None)] - with mock.patch( - 'psutil._psplatform.net_if_addrs', return_value=ret - ) as m: - addr = psutil.net_if_addrs()['em1'][0] - assert m.called - if POSIX: - assert addr.address == '06:3d:29:00:00:00' - else: - assert addr.address == '06-3d-29-00-00-00' - - def test_net_if_stats(self): - nics = psutil.net_if_stats() - assert nics, nics - all_duplexes = ( - psutil.NIC_DUPLEX_FULL, - psutil.NIC_DUPLEX_HALF, - psutil.NIC_DUPLEX_UNKNOWN, - ) - for name, stats in nics.items(): - assert isinstance(name, str) - isup, duplex, speed, mtu, flags = stats - assert isinstance(isup, bool) - assert duplex in all_duplexes - assert duplex in all_duplexes - assert speed >= 0 - assert mtu >= 0 - assert isinstance(flags, str) - - @pytest.mark.skipif( - not (LINUX or BSD or MACOS), reason="LINUX or BSD or MACOS specific" - ) - def test_net_if_stats_enodev(self): - # See: https://github.com/giampaolo/psutil/issues/1279 - with mock.patch( - 'psutil._psutil_posix.net_if_mtu', - side_effect=OSError(errno.ENODEV, ""), - ) as m: - ret = psutil.net_if_stats() - assert ret == {} - assert m.called - - -class TestSensorsAPIs(PsutilTestCase): - @pytest.mark.skipif(not HAS_SENSORS_TEMPERATURES, reason="not supported") - def test_sensors_temperatures(self): - temps = psutil.sensors_temperatures() - for name, entries in temps.items(): - assert isinstance(name, str) - for entry in entries: - assert isinstance(entry.label, str) - if entry.current is not None: - assert entry.current >= 0 - if entry.high is not None: - assert entry.high >= 0 - if entry.critical is not None: - assert entry.critical >= 0 - - @pytest.mark.skipif(not HAS_SENSORS_TEMPERATURES, reason="not supported") - def test_sensors_temperatures_fahreneit(self): - d = {'coretemp': [('label', 50.0, 60.0, 70.0)]} - with mock.patch( - "psutil._psplatform.sensors_temperatures", return_value=d - ) as m: - temps = psutil.sensors_temperatures(fahrenheit=True)['coretemp'][0] - assert m.called - assert temps.current == 122.0 - assert temps.high == 140.0 - assert temps.critical == 158.0 - - @pytest.mark.skipif(not HAS_SENSORS_BATTERY, reason="not supported") - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_sensors_battery(self): - ret = psutil.sensors_battery() - assert ret.percent >= 0 - assert ret.percent <= 100 - if ret.secsleft not in { - psutil.POWER_TIME_UNKNOWN, - psutil.POWER_TIME_UNLIMITED, - }: - assert ret.secsleft >= 0 - elif ret.secsleft == psutil.POWER_TIME_UNLIMITED: - assert ret.power_plugged - assert isinstance(ret.power_plugged, bool) - - @pytest.mark.skipif(not HAS_SENSORS_FANS, reason="not supported") - def test_sensors_fans(self): - fans = psutil.sensors_fans() - for name, entries in fans.items(): - assert isinstance(name, str) - for entry in entries: - assert isinstance(entry.label, str) - assert isinstance(entry.current, int) - assert entry.current >= 0 diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_testutils.py b/PortablePython/Lib/site-packages/psutil/tests/test_testutils.py deleted file mode 100644 index 6db66e5..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_testutils.py +++ /dev/null @@ -1,577 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Tests for testing utils (psutil.tests namespace).""" - -import collections -import errno -import os -import socket -import stat -import subprocess -import textwrap -import unittest -import warnings -from unittest import mock - -import psutil -import psutil.tests -from psutil import FREEBSD -from psutil import NETBSD -from psutil import POSIX -from psutil._common import open_binary -from psutil._common import open_text -from psutil._common import supports_ipv6 -from psutil.tests import CI_TESTING -from psutil.tests import COVERAGE -from psutil.tests import HAS_NET_CONNECTIONS_UNIX -from psutil.tests import HERE -from psutil.tests import PYTHON_EXE -from psutil.tests import PYTHON_EXE_ENV -from psutil.tests import PsutilTestCase -from psutil.tests import TestMemoryLeak -from psutil.tests import bind_socket -from psutil.tests import bind_unix_socket -from psutil.tests import call_until -from psutil.tests import chdir -from psutil.tests import create_sockets -from psutil.tests import fake_pytest -from psutil.tests import filter_proc_net_connections -from psutil.tests import get_free_port -from psutil.tests import is_namedtuple -from psutil.tests import process_namespace -from psutil.tests import pytest -from psutil.tests import reap_children -from psutil.tests import retry -from psutil.tests import retry_on_failure -from psutil.tests import safe_mkdir -from psutil.tests import safe_rmpath -from psutil.tests import system_namespace -from psutil.tests import tcp_socketpair -from psutil.tests import terminate -from psutil.tests import unix_socketpair -from psutil.tests import wait_for_file -from psutil.tests import wait_for_pid - - -# =================================================================== -# --- Unit tests for test utilities. -# =================================================================== - - -class TestRetryDecorator(PsutilTestCase): - @mock.patch('time.sleep') - def test_retry_success(self, sleep): - # Fail 3 times out of 5; make sure the decorated fun returns. - - @retry(retries=5, interval=1, logfun=None) - def foo(): - while queue: - queue.pop() - 1 / 0 # noqa: B018 - return 1 - - queue = list(range(3)) - assert foo() == 1 - assert sleep.call_count == 3 - - @mock.patch('time.sleep') - def test_retry_failure(self, sleep): - # Fail 6 times out of 5; th function is supposed to raise exc. - @retry(retries=5, interval=1, logfun=None) - def foo(): - while queue: - queue.pop() - 1 / 0 # noqa: B018 - return 1 - - queue = list(range(6)) - with pytest.raises(ZeroDivisionError): - foo() - assert sleep.call_count == 5 - - @mock.patch('time.sleep') - def test_exception_arg(self, sleep): - @retry(exception=ValueError, interval=1) - def foo(): - raise TypeError - - with pytest.raises(TypeError): - foo() - assert sleep.call_count == 0 - - @mock.patch('time.sleep') - def test_no_interval_arg(self, sleep): - # if interval is not specified sleep is not supposed to be called - - @retry(retries=5, interval=None, logfun=None) - def foo(): - 1 / 0 # noqa: B018 - - with pytest.raises(ZeroDivisionError): - foo() - assert sleep.call_count == 0 - - @mock.patch('time.sleep') - def test_retries_arg(self, sleep): - @retry(retries=5, interval=1, logfun=None) - def foo(): - 1 / 0 # noqa: B018 - - with pytest.raises(ZeroDivisionError): - foo() - assert sleep.call_count == 5 - - @mock.patch('time.sleep') - def test_retries_and_timeout_args(self, sleep): - with pytest.raises(ValueError): - retry(retries=5, timeout=1) - - -class TestSyncTestUtils(PsutilTestCase): - def test_wait_for_pid(self): - wait_for_pid(os.getpid()) - nopid = max(psutil.pids()) + 99999 - with mock.patch('psutil.tests.retry.__iter__', return_value=iter([0])): - with pytest.raises(psutil.NoSuchProcess): - wait_for_pid(nopid) - - def test_wait_for_file(self): - testfn = self.get_testfn() - with open(testfn, 'w') as f: - f.write('foo') - wait_for_file(testfn) - assert not os.path.exists(testfn) - - def test_wait_for_file_empty(self): - testfn = self.get_testfn() - with open(testfn, 'w'): - pass - wait_for_file(testfn, empty=True) - assert not os.path.exists(testfn) - - def test_wait_for_file_no_file(self): - testfn = self.get_testfn() - with mock.patch('psutil.tests.retry.__iter__', return_value=iter([0])): - with pytest.raises(OSError): - wait_for_file(testfn) - - def test_wait_for_file_no_delete(self): - testfn = self.get_testfn() - with open(testfn, 'w') as f: - f.write('foo') - wait_for_file(testfn, delete=False) - assert os.path.exists(testfn) - - def test_call_until(self): - call_until(lambda: 1) - # TODO: test for timeout - - -class TestFSTestUtils(PsutilTestCase): - def test_open_text(self): - with open_text(__file__) as f: - assert f.mode == 'r' - - def test_open_binary(self): - with open_binary(__file__) as f: - assert f.mode == 'rb' - - def test_safe_mkdir(self): - testfn = self.get_testfn() - safe_mkdir(testfn) - assert os.path.isdir(testfn) - safe_mkdir(testfn) - assert os.path.isdir(testfn) - - def test_safe_rmpath(self): - # test file is removed - testfn = self.get_testfn() - open(testfn, 'w').close() - safe_rmpath(testfn) - assert not os.path.exists(testfn) - # test no exception if path does not exist - safe_rmpath(testfn) - # test dir is removed - os.mkdir(testfn) - safe_rmpath(testfn) - assert not os.path.exists(testfn) - # test other exceptions are raised - with mock.patch( - 'psutil.tests.os.stat', side_effect=OSError(errno.EINVAL, "") - ) as m: - with pytest.raises(OSError): - safe_rmpath(testfn) - assert m.called - - def test_chdir(self): - testfn = self.get_testfn() - base = os.getcwd() - os.mkdir(testfn) - with chdir(testfn): - assert os.getcwd() == os.path.join(base, testfn) - assert os.getcwd() == base - - -class TestProcessUtils(PsutilTestCase): - def test_reap_children(self): - subp = self.spawn_testproc() - p = psutil.Process(subp.pid) - assert p.is_running() - reap_children() - assert not p.is_running() - assert not psutil.tests._pids_started - assert not psutil.tests._subprocesses_started - - def test_spawn_children_pair(self): - child, grandchild = self.spawn_children_pair() - assert child.pid != grandchild.pid - assert child.is_running() - assert grandchild.is_running() - children = psutil.Process().children() - assert children == [child] - children = psutil.Process().children(recursive=True) - assert len(children) == 2 - assert child in children - assert grandchild in children - assert child.ppid() == os.getpid() - assert grandchild.ppid() == child.pid - - terminate(child) - assert not child.is_running() - assert grandchild.is_running() - - terminate(grandchild) - assert not grandchild.is_running() - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_spawn_zombie(self): - _parent, zombie = self.spawn_zombie() - assert zombie.status() == psutil.STATUS_ZOMBIE - - def test_terminate(self): - # by subprocess.Popen - p = self.spawn_testproc() - terminate(p) - self.assertPidGone(p.pid) - terminate(p) - # by psutil.Process - p = psutil.Process(self.spawn_testproc().pid) - terminate(p) - self.assertPidGone(p.pid) - terminate(p) - # by psutil.Popen - cmd = [ - PYTHON_EXE, - "-c", - "import time; [time.sleep(0.1) for x in range(100)];", - ] - p = psutil.Popen( - cmd, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=PYTHON_EXE_ENV, - ) - terminate(p) - self.assertPidGone(p.pid) - terminate(p) - # by PID - pid = self.spawn_testproc().pid - terminate(pid) - self.assertPidGone(p.pid) - terminate(pid) - # zombie - if POSIX: - parent, zombie = self.spawn_zombie() - terminate(parent) - terminate(zombie) - self.assertPidGone(parent.pid) - self.assertPidGone(zombie.pid) - - -class TestNetUtils(PsutilTestCase): - def bind_socket(self): - port = get_free_port() - with bind_socket(addr=('', port)) as s: - assert s.getsockname()[1] == port - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_bind_unix_socket(self): - name = self.get_testfn() - with bind_unix_socket(name) as sock: - assert sock.family == socket.AF_UNIX - assert sock.type == socket.SOCK_STREAM - assert sock.getsockname() == name - assert os.path.exists(name) - assert stat.S_ISSOCK(os.stat(name).st_mode) - # UDP - name = self.get_testfn() - with bind_unix_socket(name, type=socket.SOCK_DGRAM) as sock: - assert sock.type == socket.SOCK_DGRAM - - def test_tcp_socketpair(self): - addr = ("127.0.0.1", get_free_port()) - server, client = tcp_socketpair(socket.AF_INET, addr=addr) - with server, client: - # Ensure they are connected and the positions are correct. - assert server.getsockname() == addr - assert client.getpeername() == addr - assert client.getsockname() != addr - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - @pytest.mark.skipif( - NETBSD or FREEBSD, reason="/var/run/log UNIX socket opened by default" - ) - def test_unix_socketpair(self): - p = psutil.Process() - num_fds = p.num_fds() - assert not filter_proc_net_connections(p.net_connections(kind='unix')) - name = self.get_testfn() - server, client = unix_socketpair(name) - try: - assert os.path.exists(name) - assert stat.S_ISSOCK(os.stat(name).st_mode) - assert p.num_fds() - num_fds == 2 - assert ( - len( - filter_proc_net_connections(p.net_connections(kind='unix')) - ) - == 2 - ) - assert server.getsockname() == name - assert client.getpeername() == name - finally: - client.close() - server.close() - - def test_create_sockets(self): - with create_sockets() as socks: - fams = collections.defaultdict(int) - types = collections.defaultdict(int) - for s in socks: - fams[s.family] += 1 - # work around http://bugs.python.org/issue30204 - types[s.getsockopt(socket.SOL_SOCKET, socket.SO_TYPE)] += 1 - assert fams[socket.AF_INET] >= 2 - if supports_ipv6(): - assert fams[socket.AF_INET6] >= 2 - if POSIX and HAS_NET_CONNECTIONS_UNIX: - assert fams[socket.AF_UNIX] >= 2 - assert types[socket.SOCK_STREAM] >= 2 - assert types[socket.SOCK_DGRAM] >= 2 - - -@pytest.mark.xdist_group(name="serial") -class TestMemLeakClass(TestMemoryLeak): - @retry_on_failure() - def test_times(self): - def fun(): - cnt['cnt'] += 1 - - cnt = {'cnt': 0} - self.execute(fun, times=10, warmup_times=15) - assert cnt['cnt'] == 26 - - def test_param_err(self): - with pytest.raises(ValueError): - self.execute(lambda: 0, times=0) - with pytest.raises(ValueError): - self.execute(lambda: 0, times=-1) - with pytest.raises(ValueError): - self.execute(lambda: 0, warmup_times=-1) - with pytest.raises(ValueError): - self.execute(lambda: 0, tolerance=-1) - with pytest.raises(ValueError): - self.execute(lambda: 0, retries=-1) - - @retry_on_failure() - @pytest.mark.skipif(CI_TESTING, reason="skipped on CI") - @pytest.mark.skipif(COVERAGE, reason="skipped during test coverage") - def test_leak_mem(self): - ls = [] - - def fun(ls=ls): - ls.append("x" * 248 * 1024) - - try: - # will consume around 60M in total - with pytest.raises(AssertionError, match="extra-mem"): - self.execute(fun, times=100) - finally: - del ls - - def test_unclosed_files(self): - def fun(): - f = open(__file__) # noqa: SIM115 - self.addCleanup(f.close) - box.append(f) - - box = [] - kind = "fd" if POSIX else "handle" - with pytest.raises(AssertionError, match="unclosed " + kind): - self.execute(fun) - - def test_tolerance(self): - def fun(): - ls.append("x" * 24 * 1024) - - ls = [] - times = 100 - self.execute( - fun, times=times, warmup_times=0, tolerance=200 * 1024 * 1024 - ) - assert len(ls) == times + 1 - - def test_execute_w_exc(self): - def fun_1(): - 1 / 0 # noqa: B018 - - self.execute_w_exc(ZeroDivisionError, fun_1) - with pytest.raises(ZeroDivisionError): - self.execute_w_exc(OSError, fun_1) - - def fun_2(): - pass - - with pytest.raises(AssertionError): - self.execute_w_exc(ZeroDivisionError, fun_2) - - -class TestFakePytest(PsutilTestCase): - def run_test_class(self, klass): - suite = unittest.TestSuite() - suite.addTest(klass) - runner = unittest.TextTestRunner() - result = runner.run(suite) - return result - - def test_raises(self): - with fake_pytest.raises(ZeroDivisionError) as cm: - 1 / 0 # noqa: B018 - assert isinstance(cm.value, ZeroDivisionError) - - with fake_pytest.raises(ValueError, match="foo") as cm: - raise ValueError("foo") - - try: - with fake_pytest.raises(ValueError, match="foo") as cm: - raise ValueError("bar") - except AssertionError as err: - assert str(err) == '"foo" does not match "bar"' - else: - raise self.fail("exception not raised") - - def test_mark(self): - @fake_pytest.mark.xdist_group(name="serial") - def foo(): - return 1 - - assert foo() == 1 - - @fake_pytest.mark.xdist_group(name="serial") - class Foo: - def bar(self): - return 1 - - assert Foo().bar() == 1 - - def test_skipif(self): - class TestCase(unittest.TestCase): - @fake_pytest.mark.skipif(True, reason="reason") - def foo(self): - assert 1 == 1 # noqa: PLR0133 - - result = self.run_test_class(TestCase("foo")) - assert result.wasSuccessful() - assert len(result.skipped) == 1 - assert result.skipped[0][1] == "reason" - - class TestCase(unittest.TestCase): - @fake_pytest.mark.skipif(False, reason="reason") - def foo(self): - assert 1 == 1 # noqa: PLR0133 - - result = self.run_test_class(TestCase("foo")) - assert result.wasSuccessful() - assert len(result.skipped) == 0 - - def test_skip(self): - class TestCase(unittest.TestCase): - def foo(self): - fake_pytest.skip("reason") - assert 1 == 0 # noqa: PLR0133 - - result = self.run_test_class(TestCase("foo")) - assert result.wasSuccessful() - assert len(result.skipped) == 1 - assert result.skipped[0][1] == "reason" - - def test_main(self): - tmpdir = self.get_testfn(dir=HERE) - os.mkdir(tmpdir) - with open(os.path.join(tmpdir, "__init__.py"), "w"): - pass - with open(os.path.join(tmpdir, "test_file.py"), "w") as f: - f.write(textwrap.dedent("""\ - import unittest - - class TestCase(unittest.TestCase): - def test_passed(self): - pass - """).lstrip()) - with mock.patch.object(psutil.tests, "HERE", tmpdir): - with self.assertWarnsRegex( - UserWarning, "Fake pytest module was used" - ): - suite = fake_pytest.main() - assert suite.countTestCases() == 1 - - def test_warns(self): - # success - with fake_pytest.warns(UserWarning): - warnings.warn("foo", UserWarning, stacklevel=1) - - # failure - try: - with fake_pytest.warns(UserWarning): - warnings.warn("foo", DeprecationWarning, stacklevel=1) - except AssertionError: - pass - else: - raise self.fail("exception not raised") - - # match success - with fake_pytest.warns(UserWarning, match="foo"): - warnings.warn("foo", UserWarning, stacklevel=1) - - # match failure - try: - with fake_pytest.warns(UserWarning, match="foo"): - warnings.warn("bar", UserWarning, stacklevel=1) - except AssertionError: - pass - else: - raise self.fail("exception not raised") - - -class TestTestingUtils(PsutilTestCase): - def test_process_namespace(self): - p = psutil.Process() - ns = process_namespace(p) - ns.test() - fun = next(x for x in ns.iter(ns.getters) if x[1] == 'ppid')[0] - assert fun() == p.ppid() - - def test_system_namespace(self): - ns = system_namespace() - fun = next(x for x in ns.iter(ns.getters) if x[1] == 'net_if_addrs')[0] - assert fun() == psutil.net_if_addrs() - - -class TestOtherUtils(PsutilTestCase): - def test_is_namedtuple(self): - assert is_namedtuple(collections.namedtuple('foo', 'a b c')(1, 2, 3)) - assert not is_namedtuple(tuple()) diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_unicode.py b/PortablePython/Lib/site-packages/psutil/tests/test_unicode.py deleted file mode 100644 index d8a8c4b..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_unicode.py +++ /dev/null @@ -1,313 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Notes about unicode handling in psutil -======================================. - -Starting from version 5.3.0 psutil adds unicode support, see: -https://github.com/giampaolo/psutil/issues/1040 -The notes below apply to *any* API returning a string such as -process exe(), cwd() or username(): - -* all strings are encoded by using the OS filesystem encoding - (sys.getfilesystemencoding()) which varies depending on the platform - (e.g. "UTF-8" on macOS, "mbcs" on Win) -* no API call is supposed to crash with UnicodeDecodeError -* instead, in case of badly encoded data returned by the OS, the - following error handlers are used to replace the corrupted characters in - the string: - * sys.getfilesystemencodeerrors() or "surrogatescape" on POSIX and - "replace" on Windows. - -For a detailed explanation of how psutil handles unicode see #1040. - -Tests -===== - -List of APIs returning or dealing with a string: -('not tested' means they are not tested to deal with non-ASCII strings): - -* Process.cmdline() -* Process.cwd() -* Process.environ() -* Process.exe() -* Process.memory_maps() -* Process.name() -* Process.net_connections('unix') -* Process.open_files() -* Process.username() (not tested) - -* disk_io_counters() (not tested) -* disk_partitions() (not tested) -* disk_usage(str) -* net_connections('unix') -* net_if_addrs() (not tested) -* net_if_stats() (not tested) -* net_io_counters() (not tested) -* sensors_fans() (not tested) -* sensors_temperatures() (not tested) -* users() (not tested) - -* WindowsService.binpath() (not tested) -* WindowsService.description() (not tested) -* WindowsService.display_name() (not tested) -* WindowsService.name() (not tested) -* WindowsService.status() (not tested) -* WindowsService.username() (not tested) - -In here we create a unicode path with a funky non-ASCII name and (where -possible) make psutil return it back (e.g. on name(), exe(), open_files(), -etc.) and make sure that: - -* psutil never crashes with UnicodeDecodeError -* the returned path matches -""" - -import os -import shutil -import warnings -from contextlib import closing - -import psutil -from psutil import BSD -from psutil import POSIX -from psutil import WINDOWS -from psutil.tests import ASCII_FS -from psutil.tests import CI_TESTING -from psutil.tests import HAS_ENVIRON -from psutil.tests import HAS_MEMORY_MAPS -from psutil.tests import HAS_NET_CONNECTIONS_UNIX -from psutil.tests import INVALID_UNICODE_SUFFIX -from psutil.tests import PYPY -from psutil.tests import TESTFN_PREFIX -from psutil.tests import UNICODE_SUFFIX -from psutil.tests import PsutilTestCase -from psutil.tests import bind_unix_socket -from psutil.tests import chdir -from psutil.tests import copyload_shared_lib -from psutil.tests import create_py_exe -from psutil.tests import get_testfn -from psutil.tests import pytest -from psutil.tests import safe_mkdir -from psutil.tests import safe_rmpath -from psutil.tests import skip_on_access_denied -from psutil.tests import spawn_testproc -from psutil.tests import terminate - - -def try_unicode(suffix): - """Return True if both the fs and the subprocess module can - deal with a unicode file name. - """ - sproc = None - testfn = get_testfn(suffix=suffix) - try: - safe_rmpath(testfn) - create_py_exe(testfn) - sproc = spawn_testproc(cmd=[testfn]) - shutil.copyfile(testfn, testfn + '-2') - safe_rmpath(testfn + '-2') - except (UnicodeEncodeError, OSError): - return False - else: - return True - finally: - if sproc is not None: - terminate(sproc) - safe_rmpath(testfn) - - -# =================================================================== -# FS APIs -# =================================================================== - - -class BaseUnicodeTest(PsutilTestCase): - funky_suffix = None - - @classmethod - def setUpClass(cls): - super().setUpClass() - cls.skip_tests = False - cls.funky_name = None - if cls.funky_suffix is not None: - if not try_unicode(cls.funky_suffix): - cls.skip_tests = True - else: - cls.funky_name = get_testfn(suffix=cls.funky_suffix) - create_py_exe(cls.funky_name) - - def setUp(self): - super().setUp() - if self.skip_tests: - raise pytest.skip("can't handle unicode str") - - -@pytest.mark.xdist_group(name="serial") -@pytest.mark.skipif(ASCII_FS, reason="ASCII fs") -class TestFSAPIs(BaseUnicodeTest): - """Test FS APIs with a funky, valid, UTF8 path name.""" - - funky_suffix = UNICODE_SUFFIX - - def expect_exact_path_match(self): - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - return self.funky_name in os.listdir(".") - - # --- - - def test_proc_exe(self): - cmd = [ - self.funky_name, - "-c", - "import time; [time.sleep(0.1) for x in range(100)]", - ] - subp = self.spawn_testproc(cmd) - p = psutil.Process(subp.pid) - exe = p.exe() - assert isinstance(exe, str) - if self.expect_exact_path_match(): - assert os.path.normcase(exe) == os.path.normcase(self.funky_name) - - def test_proc_name(self): - cmd = [ - self.funky_name, - "-c", - "import time; [time.sleep(0.1) for x in range(100)]", - ] - subp = self.spawn_testproc(cmd) - name = psutil.Process(subp.pid).name() - assert isinstance(name, str) - if self.expect_exact_path_match(): - assert name == os.path.basename(self.funky_name) - - def test_proc_cmdline(self): - cmd = [ - self.funky_name, - "-c", - "import time; [time.sleep(0.1) for x in range(100)]", - ] - subp = self.spawn_testproc(cmd) - p = psutil.Process(subp.pid) - cmdline = p.cmdline() - for part in cmdline: - assert isinstance(part, str) - if self.expect_exact_path_match(): - assert cmdline == cmd - - def test_proc_cwd(self): - dname = self.funky_name + "2" - self.addCleanup(safe_rmpath, dname) - safe_mkdir(dname) - with chdir(dname): - p = psutil.Process() - cwd = p.cwd() - assert isinstance(p.cwd(), str) - if self.expect_exact_path_match(): - assert cwd == dname - - @pytest.mark.skipif(PYPY and WINDOWS, reason="fails on PYPY + WINDOWS") - def test_proc_open_files(self): - p = psutil.Process() - start = set(p.open_files()) - with open(self.funky_name, 'rb'): - new = set(p.open_files()) - path = (new - start).pop().path - assert isinstance(path, str) - if BSD and not path: - # XXX - see https://github.com/giampaolo/psutil/issues/595 - raise pytest.skip("open_files on BSD is broken") - if self.expect_exact_path_match(): - assert os.path.normcase(path) == os.path.normcase(self.funky_name) - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - def test_proc_net_connections(self): - name = self.get_testfn(suffix=self.funky_suffix) - sock = bind_unix_socket(name) - with closing(sock): - conn = psutil.Process().net_connections('unix')[0] - assert isinstance(conn.laddr, str) - assert conn.laddr == name - - @pytest.mark.skipif(not POSIX, reason="POSIX only") - @pytest.mark.skipif( - not HAS_NET_CONNECTIONS_UNIX, reason="can't list UNIX sockets" - ) - @skip_on_access_denied() - def test_net_connections(self): - def find_sock(cons): - for conn in cons: - if os.path.basename(conn.laddr).startswith(TESTFN_PREFIX): - return conn - raise ValueError("connection not found") - - name = self.get_testfn(suffix=self.funky_suffix) - sock = bind_unix_socket(name) - with closing(sock): - cons = psutil.net_connections(kind='unix') - conn = find_sock(cons) - assert isinstance(conn.laddr, str) - assert conn.laddr == name - - def test_disk_usage(self): - dname = self.funky_name + "2" - self.addCleanup(safe_rmpath, dname) - safe_mkdir(dname) - psutil.disk_usage(dname) - - @pytest.mark.skipif(not HAS_MEMORY_MAPS, reason="not supported") - @pytest.mark.skipif(PYPY, reason="unstable on PYPY") - def test_memory_maps(self): - with copyload_shared_lib(suffix=self.funky_suffix) as funky_path: - - def normpath(p): - return os.path.realpath(os.path.normcase(p)) - - libpaths = [ - normpath(x.path) for x in psutil.Process().memory_maps() - ] - # ...just to have a clearer msg in case of failure - libpaths = [x for x in libpaths if TESTFN_PREFIX in x] - assert normpath(funky_path) in libpaths - for path in libpaths: - assert isinstance(path, str) - - -@pytest.mark.skipif(CI_TESTING, reason="unreliable on CI") -class TestFSAPIsWithInvalidPath(TestFSAPIs): - """Test FS APIs with a funky, invalid path name.""" - - funky_suffix = INVALID_UNICODE_SUFFIX - - def expect_exact_path_match(self): - return True - - -# =================================================================== -# Non fs APIs -# =================================================================== - - -class TestNonFSAPIS(BaseUnicodeTest): - """Unicode tests for non fs-related APIs.""" - - funky_suffix = UNICODE_SUFFIX - - @pytest.mark.skipif(not HAS_ENVIRON, reason="not supported") - @pytest.mark.skipif(PYPY and WINDOWS, reason="segfaults on PYPY + WINDOWS") - def test_proc_environ(self): - # Note: differently from others, this test does not deal - # with fs paths. - env = os.environ.copy() - env['FUNNY_ARG'] = self.funky_suffix - sproc = self.spawn_testproc(env=env) - p = psutil.Process(sproc.pid) - env = p.environ() - for k, v in env.items(): - assert isinstance(k, str) - assert isinstance(v, str) - assert env['FUNNY_ARG'] == self.funky_suffix diff --git a/PortablePython/Lib/site-packages/psutil/tests/test_windows.py b/PortablePython/Lib/site-packages/psutil/tests/test_windows.py deleted file mode 100644 index c5c536b..0000000 --- a/PortablePython/Lib/site-packages/psutil/tests/test_windows.py +++ /dev/null @@ -1,914 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Windows specific tests.""" - -import datetime -import glob -import os -import platform -import re -import shutil -import signal -import subprocess -import sys -import time -import warnings -from unittest import mock - -import psutil -from psutil import WINDOWS -from psutil.tests import GITHUB_ACTIONS -from psutil.tests import HAS_BATTERY -from psutil.tests import IS_64BIT -from psutil.tests import PYPY -from psutil.tests import TOLERANCE_DISK_USAGE -from psutil.tests import TOLERANCE_SYS_MEM -from psutil.tests import PsutilTestCase -from psutil.tests import pytest -from psutil.tests import retry_on_failure -from psutil.tests import sh -from psutil.tests import spawn_testproc -from psutil.tests import terminate - - -if WINDOWS and not PYPY: - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - import win32api # requires "pip install pywin32" - import win32con - import win32process - import wmi # requires "pip install wmi" / "make install-pydeps-test" - -if WINDOWS: - from psutil._pswindows import convert_oserror - - -cext = psutil._psplatform.cext - - -@pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") -@pytest.mark.skipif(PYPY, reason="pywin32 not available on PYPY") -class WindowsTestCase(PsutilTestCase): - pass - - -def powershell(cmd): - """Currently not used, but available just in case. Usage: - - >>> powershell( - "Get-CIMInstance Win32_PageFileUsage | Select AllocatedBaseSize") - """ - if not shutil.which("powershell.exe"): - raise pytest.skip("powershell.exe not available") - cmdline = ( - "powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive " - f"-NoProfile -WindowStyle Hidden -Command \"{cmd}\"" # noqa: Q003 - ) - return sh(cmdline) - - -def wmic(path, what, converter=int): - """Currently not used, but available just in case. Usage: - - >>> wmic("Win32_OperatingSystem", "FreePhysicalMemory") - 2134124534 - """ - out = sh(f"wmic path {path} get {what}").strip() - data = "".join(out.splitlines()[1:]).strip() # get rid of the header - if converter is not None: - if "," in what: - return tuple(converter(x) for x in data.split()) - else: - return converter(data) - else: - return data - - -# =================================================================== -# System APIs -# =================================================================== - - -class TestCpuAPIs(WindowsTestCase): - @pytest.mark.skipif( - 'NUMBER_OF_PROCESSORS' not in os.environ, - reason="NUMBER_OF_PROCESSORS env var is not available", - ) - def test_cpu_count_vs_NUMBER_OF_PROCESSORS(self): - # Will likely fail on many-cores systems: - # https://stackoverflow.com/questions/31209256 - num_cpus = int(os.environ['NUMBER_OF_PROCESSORS']) - assert num_cpus == psutil.cpu_count() - - def test_cpu_count_vs_GetSystemInfo(self): - # Will likely fail on many-cores systems: - # https://stackoverflow.com/questions/31209256 - sys_value = win32api.GetSystemInfo()[5] - psutil_value = psutil.cpu_count() - assert sys_value == psutil_value - - def test_cpu_count_logical_vs_wmi(self): - w = wmi.WMI() - procs = sum( - proc.NumberOfLogicalProcessors for proc in w.Win32_Processor() - ) - assert psutil.cpu_count() == procs - - def test_cpu_count_cores_vs_wmi(self): - w = wmi.WMI() - cores = sum(proc.NumberOfCores for proc in w.Win32_Processor()) - assert psutil.cpu_count(logical=False) == cores - - def test_cpu_count_vs_cpu_times(self): - assert psutil.cpu_count() == len(psutil.cpu_times(percpu=True)) - - def test_cpu_freq(self): - w = wmi.WMI() - proc = w.Win32_Processor()[0] - assert proc.CurrentClockSpeed == psutil.cpu_freq().current - assert proc.MaxClockSpeed == psutil.cpu_freq().max - - -class TestSystemAPIs(WindowsTestCase): - def test_nic_names(self): - out = sh('ipconfig /all') - nics = psutil.net_io_counters(pernic=True).keys() - for nic in nics: - if "pseudo-interface" in nic.replace(' ', '-').lower(): - continue - if nic not in out: - raise self.fail( - f"{nic!r} nic wasn't found in 'ipconfig /all' output" - ) - - def test_total_phymem(self): - w = wmi.WMI().Win32_ComputerSystem()[0] - assert int(w.TotalPhysicalMemory) == psutil.virtual_memory().total - - def test_free_phymem(self): - w = wmi.WMI().Win32_PerfRawData_PerfOS_Memory()[0] - assert ( - abs(int(w.AvailableBytes) - psutil.virtual_memory().free) - < TOLERANCE_SYS_MEM - ) - - def test_total_swapmem(self): - w = wmi.WMI().Win32_PerfRawData_PerfOS_Memory()[0] - assert ( - int(w.CommitLimit) - psutil.virtual_memory().total - == psutil.swap_memory().total - ) - if psutil.swap_memory().total == 0: - assert psutil.swap_memory().free == 0 - assert psutil.swap_memory().used == 0 - - def test_percent_swapmem(self): - if psutil.swap_memory().total > 0: - w = wmi.WMI().Win32_PerfRawData_PerfOS_PagingFile(Name="_Total")[0] - # calculate swap usage to percent - percentSwap = int(w.PercentUsage) * 100 / int(w.PercentUsage_Base) - # exact percent may change but should be reasonable - # assert within +/- 5% and between 0 and 100% - assert psutil.swap_memory().percent >= 0 - assert abs(psutil.swap_memory().percent - percentSwap) < 5 - assert psutil.swap_memory().percent <= 100 - - # @pytest.mark.skipif(wmi is None, reason="wmi module is not installed") - # def test__UPTIME(self): - # # _UPTIME constant is not public but it is used internally - # # as value to return for pid 0 creation time. - # # WMI behaves the same. - # w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - # p = psutil.Process(0) - # wmic_create = str(w.CreationDate.split('.')[0]) - # psutil_create = time.strftime("%Y%m%d%H%M%S", - # time.localtime(p.create_time())) - - # Note: this test is not very reliable - @retry_on_failure() - def test_pids(self): - # Note: this test might fail if the OS is starting/killing - # other processes in the meantime - w = wmi.WMI().Win32_Process() - wmi_pids = {x.ProcessId for x in w} - psutil_pids = set(psutil.pids()) - assert wmi_pids == psutil_pids - - @retry_on_failure() - def test_disks(self): - ps_parts = psutil.disk_partitions(all=True) - wmi_parts = wmi.WMI().Win32_LogicalDisk() - for ps_part in ps_parts: - for wmi_part in wmi_parts: - if ps_part.device.replace('\\', '') == wmi_part.DeviceID: - if not ps_part.mountpoint: - # this is usually a CD-ROM with no disk inserted - break - if 'cdrom' in ps_part.opts: - break - if ps_part.mountpoint.startswith('A:'): - break # floppy - try: - usage = psutil.disk_usage(ps_part.mountpoint) - except FileNotFoundError: - # usually this is the floppy - break - assert usage.total == int(wmi_part.Size) - wmi_free = int(wmi_part.FreeSpace) - assert usage.free == wmi_free - # 10 MB tolerance - if abs(usage.free - wmi_free) > 10 * 1024 * 1024: - raise self.fail(f"psutil={usage.free}, wmi={wmi_free}") - break - else: - raise self.fail(f"can't find partition {ps_part!r}") - - @retry_on_failure() - def test_disk_usage(self): - for disk in psutil.disk_partitions(): - if 'cdrom' in disk.opts: - continue - sys_value = win32api.GetDiskFreeSpaceEx(disk.mountpoint) - psutil_value = psutil.disk_usage(disk.mountpoint) - assert abs(sys_value[0] - psutil_value.free) < TOLERANCE_DISK_USAGE - assert ( - abs(sys_value[1] - psutil_value.total) < TOLERANCE_DISK_USAGE - ) - assert psutil_value.used == psutil_value.total - psutil_value.free - - def test_disk_partitions(self): - sys_value = [ - x + '\\' - for x in win32api.GetLogicalDriveStrings().split("\\\x00") - if x and not x.startswith('A:') - ] - psutil_value = [ - x.mountpoint - for x in psutil.disk_partitions(all=True) - if not x.mountpoint.startswith('A:') - ] - assert sys_value == psutil_value - - def test_net_if_stats(self): - ps_names = set(cext.net_if_stats()) - wmi_adapters = wmi.WMI().Win32_NetworkAdapter() - wmi_names = set() - for wmi_adapter in wmi_adapters: - wmi_names.add(wmi_adapter.Name) - wmi_names.add(wmi_adapter.NetConnectionID) - assert ( - ps_names & wmi_names - ), f"no common entries in {ps_names}, {wmi_names}" - - def test_boot_time(self): - wmi_os = wmi.WMI().Win32_OperatingSystem() - wmi_btime_str = wmi_os[0].LastBootUpTime.split('.')[0] - wmi_btime_dt = datetime.datetime.strptime( - wmi_btime_str, "%Y%m%d%H%M%S" - ) - psutil_dt = datetime.datetime.fromtimestamp(psutil.boot_time()) - diff = abs((wmi_btime_dt - psutil_dt).total_seconds()) - assert diff <= 5 - - def test_boot_time_fluctuation(self): - # https://github.com/giampaolo/psutil/issues/1007 - with mock.patch('psutil._pswindows.cext.boot_time', return_value=5): - assert psutil.boot_time() == 5 - with mock.patch('psutil._pswindows.cext.boot_time', return_value=4): - assert psutil.boot_time() == 5 - with mock.patch('psutil._pswindows.cext.boot_time', return_value=6): - assert psutil.boot_time() == 5 - with mock.patch('psutil._pswindows.cext.boot_time', return_value=333): - assert psutil.boot_time() == 333 - - -# =================================================================== -# sensors_battery() -# =================================================================== - - -class TestSensorsBattery(WindowsTestCase): - def test_has_battery(self): - if win32api.GetPwrCapabilities()['SystemBatteriesPresent']: - assert psutil.sensors_battery() is not None - else: - assert psutil.sensors_battery() is None - - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_percent(self): - w = wmi.WMI() - battery_wmi = w.query('select * from Win32_Battery')[0] - battery_psutil = psutil.sensors_battery() - assert ( - abs(battery_psutil.percent - battery_wmi.EstimatedChargeRemaining) - < 1 - ) - - @pytest.mark.skipif(not HAS_BATTERY, reason="no battery") - def test_power_plugged(self): - w = wmi.WMI() - battery_wmi = w.query('select * from Win32_Battery')[0] - battery_psutil = psutil.sensors_battery() - # Status codes: - # https://msdn.microsoft.com/en-us/library/aa394074(v=vs.85).aspx - assert battery_psutil.power_plugged == (battery_wmi.BatteryStatus == 2) - - def test_emulate_no_battery(self): - with mock.patch( - "psutil._pswindows.cext.sensors_battery", - return_value=(0, 128, 0, 0), - ) as m: - assert psutil.sensors_battery() is None - assert m.called - - def test_emulate_power_connected(self): - with mock.patch( - "psutil._pswindows.cext.sensors_battery", return_value=(1, 0, 0, 0) - ) as m: - assert ( - psutil.sensors_battery().secsleft - == psutil.POWER_TIME_UNLIMITED - ) - assert m.called - - def test_emulate_power_charging(self): - with mock.patch( - "psutil._pswindows.cext.sensors_battery", return_value=(0, 8, 0, 0) - ) as m: - assert ( - psutil.sensors_battery().secsleft - == psutil.POWER_TIME_UNLIMITED - ) - assert m.called - - def test_emulate_secs_left_unknown(self): - with mock.patch( - "psutil._pswindows.cext.sensors_battery", - return_value=(0, 0, 0, -1), - ) as m: - assert ( - psutil.sensors_battery().secsleft == psutil.POWER_TIME_UNKNOWN - ) - assert m.called - - -# =================================================================== -# Process APIs -# =================================================================== - - -class TestProcess(WindowsTestCase): - @classmethod - def setUpClass(cls): - cls.pid = spawn_testproc().pid - - @classmethod - def tearDownClass(cls): - terminate(cls.pid) - - def test_issue_24(self): - p = psutil.Process(0) - with pytest.raises(psutil.AccessDenied): - p.kill() - - def test_special_pid(self): - p = psutil.Process(4) - assert p.name() == 'System' - # use __str__ to access all common Process properties to check - # that nothing strange happens - str(p) - p.username() - assert p.create_time() >= 0.0 - try: - rss, _vms = p.memory_info()[:2] - except psutil.AccessDenied: - # expected on Windows Vista and Windows 7 - if platform.uname()[1] not in {'vista', 'win-7', 'win7'}: - raise - else: - assert rss > 0 - - def test_send_signal(self): - p = psutil.Process(self.pid) - with pytest.raises(ValueError): - p.send_signal(signal.SIGINT) - - def test_num_handles_increment(self): - p = psutil.Process(os.getpid()) - before = p.num_handles() - handle = win32api.OpenProcess( - win32con.PROCESS_QUERY_INFORMATION, win32con.FALSE, os.getpid() - ) - after = p.num_handles() - assert after == before + 1 - win32api.CloseHandle(handle) - assert p.num_handles() == before - - def test_ctrl_signals(self): - p = psutil.Process(self.spawn_testproc().pid) - p.send_signal(signal.CTRL_C_EVENT) - p.send_signal(signal.CTRL_BREAK_EVENT) - p.kill() - p.wait() - with pytest.raises(psutil.NoSuchProcess): - p.send_signal(signal.CTRL_C_EVENT) - with pytest.raises(psutil.NoSuchProcess): - p.send_signal(signal.CTRL_BREAK_EVENT) - - def test_username(self): - name = win32api.GetUserNameEx(win32con.NameSamCompatible) - if name.endswith('$'): - # When running as a service account (most likely to be - # NetworkService), these user name calculations don't produce the - # same result, causing the test to fail. - raise pytest.skip('running as service account') - assert psutil.Process().username() == name - - def test_cmdline(self): - sys_value = re.sub(r"[ ]+", " ", win32api.GetCommandLine()).strip() - psutil_value = ' '.join(psutil.Process().cmdline()) - if sys_value[0] == '"' != psutil_value[0]: - # The PyWin32 command line may retain quotes around argv[0] if they - # were used unnecessarily, while psutil will omit them. So remove - # the first 2 quotes from sys_value if not in psutil_value. - # A path to an executable will not contain quotes, so this is safe. - sys_value = sys_value.replace('"', '', 2) - assert sys_value == psutil_value - - # XXX - occasional failures - - # def test_cpu_times(self): - # handle = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, - # win32con.FALSE, os.getpid()) - # self.addCleanup(win32api.CloseHandle, handle) - # sys_value = win32process.GetProcessTimes(handle) - # psutil_value = psutil.Process().cpu_times() - # self.assertAlmostEqual( - # psutil_value.user, sys_value['UserTime'] / 10000000.0, - # delta=0.2) - # self.assertAlmostEqual( - # psutil_value.user, sys_value['KernelTime'] / 10000000.0, - # delta=0.2) - - def test_nice(self): - handle = win32api.OpenProcess( - win32con.PROCESS_QUERY_INFORMATION, win32con.FALSE, os.getpid() - ) - self.addCleanup(win32api.CloseHandle, handle) - sys_value = win32process.GetPriorityClass(handle) - psutil_value = psutil.Process().nice() - assert psutil_value == sys_value - - def test_memory_info(self): - handle = win32api.OpenProcess( - win32con.PROCESS_QUERY_INFORMATION, win32con.FALSE, self.pid - ) - self.addCleanup(win32api.CloseHandle, handle) - sys_value = win32process.GetProcessMemoryInfo(handle) - psutil_value = psutil.Process(self.pid).memory_info() - assert sys_value['PeakWorkingSetSize'] == psutil_value.peak_wset - assert sys_value['WorkingSetSize'] == psutil_value.wset - assert ( - sys_value['QuotaPeakPagedPoolUsage'] - == psutil_value.peak_paged_pool - ) - assert sys_value['QuotaPagedPoolUsage'] == psutil_value.paged_pool - assert ( - sys_value['QuotaPeakNonPagedPoolUsage'] - == psutil_value.peak_nonpaged_pool - ) - assert ( - sys_value['QuotaNonPagedPoolUsage'] == psutil_value.nonpaged_pool - ) - assert sys_value['PagefileUsage'] == psutil_value.pagefile - assert sys_value['PeakPagefileUsage'] == psutil_value.peak_pagefile - - assert psutil_value.rss == psutil_value.wset - assert psutil_value.vms == psutil_value.pagefile - - def test_wait(self): - handle = win32api.OpenProcess( - win32con.PROCESS_QUERY_INFORMATION, win32con.FALSE, self.pid - ) - self.addCleanup(win32api.CloseHandle, handle) - p = psutil.Process(self.pid) - p.terminate() - psutil_value = p.wait() - sys_value = win32process.GetExitCodeProcess(handle) - assert psutil_value == sys_value - - def test_cpu_affinity(self): - def from_bitmask(x): - return [i for i in range(64) if (1 << i) & x] - - handle = win32api.OpenProcess( - win32con.PROCESS_QUERY_INFORMATION, win32con.FALSE, self.pid - ) - self.addCleanup(win32api.CloseHandle, handle) - sys_value = from_bitmask( - win32process.GetProcessAffinityMask(handle)[0] - ) - psutil_value = psutil.Process(self.pid).cpu_affinity() - assert psutil_value == sys_value - - def test_io_counters(self): - handle = win32api.OpenProcess( - win32con.PROCESS_QUERY_INFORMATION, win32con.FALSE, os.getpid() - ) - self.addCleanup(win32api.CloseHandle, handle) - sys_value = win32process.GetProcessIoCounters(handle) - psutil_value = psutil.Process().io_counters() - assert psutil_value.read_count == sys_value['ReadOperationCount'] - assert psutil_value.write_count == sys_value['WriteOperationCount'] - assert psutil_value.read_bytes == sys_value['ReadTransferCount'] - assert psutil_value.write_bytes == sys_value['WriteTransferCount'] - assert psutil_value.other_count == sys_value['OtherOperationCount'] - assert psutil_value.other_bytes == sys_value['OtherTransferCount'] - - def test_num_handles(self): - import ctypes - import ctypes.wintypes - - PROCESS_QUERY_INFORMATION = 0x400 - handle = ctypes.windll.kernel32.OpenProcess( - PROCESS_QUERY_INFORMATION, 0, self.pid - ) - self.addCleanup(ctypes.windll.kernel32.CloseHandle, handle) - - hndcnt = ctypes.wintypes.DWORD() - ctypes.windll.kernel32.GetProcessHandleCount( - handle, ctypes.byref(hndcnt) - ) - sys_value = hndcnt.value - psutil_value = psutil.Process(self.pid).num_handles() - assert psutil_value == sys_value - - def test_error_partial_copy(self): - # https://github.com/giampaolo/psutil/issues/875 - exc = OSError() - exc.winerror = 299 - with mock.patch("psutil._psplatform.cext.proc_cwd", side_effect=exc): - with mock.patch("time.sleep") as m: - p = psutil.Process() - with pytest.raises(psutil.AccessDenied): - p.cwd() - assert m.call_count >= 5 - - def test_exe(self): - # NtQuerySystemInformation succeeds if process is gone. Make sure - # it raises NSP for a non existent pid. - pid = psutil.pids()[-1] + 99999 - proc = psutil._psplatform.Process(pid) - with pytest.raises(psutil.NoSuchProcess): - proc.exe() - - -class TestProcessWMI(WindowsTestCase): - """Compare Process API results with WMI.""" - - @classmethod - def setUpClass(cls): - cls.pid = spawn_testproc().pid - - @classmethod - def tearDownClass(cls): - terminate(cls.pid) - - def test_name(self): - w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - p = psutil.Process(self.pid) - assert p.name() == w.Caption - - # This fail on github because using virtualenv for test environment - @pytest.mark.skipif( - GITHUB_ACTIONS, reason="unreliable path on GITHUB_ACTIONS" - ) - def test_exe(self): - w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - p = psutil.Process(self.pid) - # Note: wmi reports the exe as a lower case string. - # Being Windows paths case-insensitive we ignore that. - assert p.exe().lower() == w.ExecutablePath.lower() - - def test_cmdline(self): - w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - p = psutil.Process(self.pid) - assert ' '.join(p.cmdline()) == w.CommandLine.replace('"', '') - - def test_username(self): - w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - p = psutil.Process(self.pid) - domain, _, username = w.GetOwner() - username = f"{domain}\\{username}" - assert p.username() == username - - @retry_on_failure() - def test_memory_rss(self): - w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - p = psutil.Process(self.pid) - rss = p.memory_info().rss - assert rss == int(w.WorkingSetSize) - - @retry_on_failure() - def test_memory_vms(self): - w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - p = psutil.Process(self.pid) - vms = p.memory_info().vms - # http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx - # ...claims that PageFileUsage is represented in Kilo - # bytes but funnily enough on certain platforms bytes are - # returned instead. - wmi_usage = int(w.PageFileUsage) - if vms not in {wmi_usage, wmi_usage * 1024}: - raise self.fail(f"wmi={wmi_usage}, psutil={vms}") - - def test_create_time(self): - w = wmi.WMI().Win32_Process(ProcessId=self.pid)[0] - p = psutil.Process(self.pid) - wmic_create = str(w.CreationDate.split('.')[0]) - psutil_create = time.strftime( - "%Y%m%d%H%M%S", time.localtime(p.create_time()) - ) - assert wmic_create == psutil_create - - -# --- - - -@pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") -class TestDualProcessImplementation(PsutilTestCase): - """Certain APIs on Windows have 2 internal implementations, one - based on documented Windows APIs, another one based - NtQuerySystemInformation() which gets called as fallback in - case the first fails because of limited permission error. - Here we test that the two methods return the exact same value, - see: - https://github.com/giampaolo/psutil/issues/304. - """ - - @classmethod - def setUpClass(cls): - cls.pid = spawn_testproc().pid - - @classmethod - def tearDownClass(cls): - terminate(cls.pid) - - def test_memory_info(self): - mem_1 = psutil.Process(self.pid).memory_info() - with mock.patch( - "psutil._psplatform.cext.proc_memory_info", - side_effect=PermissionError, - ) as fun: - mem_2 = psutil.Process(self.pid).memory_info() - assert len(mem_1) == len(mem_2) - for i in range(len(mem_1)): - assert mem_1[i] >= 0 - assert mem_2[i] >= 0 - assert abs(mem_1[i] - mem_2[i]) < 512 - assert fun.called - - def test_create_time(self): - ctime = psutil.Process(self.pid).create_time() - with mock.patch( - "psutil._psplatform.cext.proc_times", - side_effect=PermissionError, - ) as fun: - assert psutil.Process(self.pid).create_time() == ctime - assert fun.called - - def test_cpu_times(self): - cpu_times_1 = psutil.Process(self.pid).cpu_times() - with mock.patch( - "psutil._psplatform.cext.proc_times", - side_effect=PermissionError, - ) as fun: - cpu_times_2 = psutil.Process(self.pid).cpu_times() - assert fun.called - assert abs(cpu_times_1.user - cpu_times_2.user) < 0.01 - assert abs(cpu_times_1.system - cpu_times_2.system) < 0.01 - - def test_io_counters(self): - io_counters_1 = psutil.Process(self.pid).io_counters() - with mock.patch( - "psutil._psplatform.cext.proc_io_counters", - side_effect=PermissionError, - ) as fun: - io_counters_2 = psutil.Process(self.pid).io_counters() - for i in range(len(io_counters_1)): - assert abs(io_counters_1[i] - io_counters_2[i]) < 5 - assert fun.called - - def test_num_handles(self): - num_handles = psutil.Process(self.pid).num_handles() - with mock.patch( - "psutil._psplatform.cext.proc_num_handles", - side_effect=PermissionError, - ) as fun: - assert psutil.Process(self.pid).num_handles() == num_handles - assert fun.called - - def test_cmdline(self): - for pid in psutil.pids(): - try: - a = cext.proc_cmdline(pid, use_peb=True) - b = cext.proc_cmdline(pid, use_peb=False) - except OSError as err: - err = convert_oserror(err) - if not isinstance( - err, (psutil.AccessDenied, psutil.NoSuchProcess) - ): - raise - else: - assert a == b - - -@pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") -class RemoteProcessTestCase(PsutilTestCase): - """Certain functions require calling ReadProcessMemory. - This trivially works when called on the current process. - Check that this works on other processes, especially when they - have a different bitness. - """ - - @staticmethod - def find_other_interpreter(): - # find a python interpreter that is of the opposite bitness from us - code = "import sys; sys.stdout.write(str(sys.maxsize > 2**32))" - - # XXX: a different and probably more stable approach might be to access - # the registry but accessing 64 bit paths from a 32 bit process - for filename in glob.glob(r"C:\Python*\python.exe"): - proc = subprocess.Popen( - args=[filename, "-c", code], - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - ) - output, _ = proc.communicate() - proc.wait() - if output == str(not IS_64BIT): - return filename - - test_args = ["-c", "import sys; sys.stdin.read()"] - - def setUp(self): - super().setUp() - - other_python = self.find_other_interpreter() - if other_python is None: - raise pytest.skip( - "could not find interpreter with opposite bitness" - ) - if IS_64BIT: - self.python64 = sys.executable - self.python32 = other_python - else: - self.python64 = other_python - self.python32 = sys.executable - - env = os.environ.copy() - env["THINK_OF_A_NUMBER"] = str(os.getpid()) - self.proc32 = self.spawn_testproc( - [self.python32] + self.test_args, env=env, stdin=subprocess.PIPE - ) - self.proc64 = self.spawn_testproc( - [self.python64] + self.test_args, env=env, stdin=subprocess.PIPE - ) - - def tearDown(self): - super().tearDown() - self.proc32.communicate() - self.proc64.communicate() - - def test_cmdline_32(self): - p = psutil.Process(self.proc32.pid) - assert len(p.cmdline()) == 3 - assert p.cmdline()[1:] == self.test_args - - def test_cmdline_64(self): - p = psutil.Process(self.proc64.pid) - assert len(p.cmdline()) == 3 - assert p.cmdline()[1:] == self.test_args - - def test_cwd_32(self): - p = psutil.Process(self.proc32.pid) - assert p.cwd() == os.getcwd() - - def test_cwd_64(self): - p = psutil.Process(self.proc64.pid) - assert p.cwd() == os.getcwd() - - def test_environ_32(self): - p = psutil.Process(self.proc32.pid) - e = p.environ() - assert "THINK_OF_A_NUMBER" in e - assert e["THINK_OF_A_NUMBER"] == str(os.getpid()) - - def test_environ_64(self): - p = psutil.Process(self.proc64.pid) - try: - p.environ() - except psutil.AccessDenied: - pass - - -# =================================================================== -# Windows services -# =================================================================== - - -@pytest.mark.skipif(not WINDOWS, reason="WINDOWS only") -class TestServices(PsutilTestCase): - def test_win_service_iter(self): - valid_statuses = { - "running", - "paused", - "start", - "pause", - "continue", - "stop", - "stopped", - } - valid_start_types = {"automatic", "manual", "disabled"} - valid_statuses = { - "running", - "paused", - "start_pending", - "pause_pending", - "continue_pending", - "stop_pending", - "stopped", - } - for serv in psutil.win_service_iter(): - data = serv.as_dict() - assert isinstance(data['name'], str) - assert data['name'].strip() - assert isinstance(data['display_name'], str) - assert isinstance(data['username'], str) - assert data['status'] in valid_statuses - if data['pid'] is not None: - psutil.Process(data['pid']) - assert isinstance(data['binpath'], str) - assert isinstance(data['username'], str) - assert isinstance(data['start_type'], str) - assert data['start_type'] in valid_start_types - assert data['status'] in valid_statuses - assert isinstance(data['description'], str) - pid = serv.pid() - if pid is not None: - p = psutil.Process(pid) - assert p.is_running() - # win_service_get - s = psutil.win_service_get(serv.name()) - # test __eq__ - assert serv == s - - def test_win_service_get(self): - ERROR_SERVICE_DOES_NOT_EXIST = ( - psutil._psplatform.cext.ERROR_SERVICE_DOES_NOT_EXIST - ) - ERROR_ACCESS_DENIED = psutil._psplatform.cext.ERROR_ACCESS_DENIED - - name = next(psutil.win_service_iter()).name() - with pytest.raises(psutil.NoSuchProcess) as cm: - psutil.win_service_get(name + '???') - assert cm.value.name == name + '???' - - # test NoSuchProcess - service = psutil.win_service_get(name) - exc = OSError(0, "msg", 0) - exc.winerror = ERROR_SERVICE_DOES_NOT_EXIST - with mock.patch( - "psutil._psplatform.cext.winservice_query_status", side_effect=exc - ): - with pytest.raises(psutil.NoSuchProcess): - service.status() - with mock.patch( - "psutil._psplatform.cext.winservice_query_config", side_effect=exc - ): - with pytest.raises(psutil.NoSuchProcess): - service.username() - - # test AccessDenied - exc = OSError(0, "msg", 0) - exc.winerror = ERROR_ACCESS_DENIED - with mock.patch( - "psutil._psplatform.cext.winservice_query_status", side_effect=exc - ): - with pytest.raises(psutil.AccessDenied): - service.status() - with mock.patch( - "psutil._psplatform.cext.winservice_query_config", side_effect=exc - ): - with pytest.raises(psutil.AccessDenied): - service.username() - - # test __str__ and __repr__ - assert service.name() in str(service) - assert service.display_name() in str(service) - assert service.name() in repr(service) - assert service.display_name() in repr(service) diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/COPYING.LGPL b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/COPYING.LGPL deleted file mode 100644 index 0df067b..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/COPYING.LGPL +++ /dev/null @@ -1,165 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007-2024 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/INSTALLER b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/METADATA b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/METADATA deleted file mode 100644 index fecb69e..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/METADATA +++ /dev/null @@ -1,914 +0,0 @@ -Metadata-Version: 2.1 -Name: pynput -Version: 1.8.1 -Summary: Monitor and control user input devices -Home-page: https://github.com/moses-palmer/pynput -Author: Moses Palmér -Author-email: moses.palmer@gmail.com -License: LGPLv3 -Keywords: control mouse,mouse input,control keyboard,keyboard input -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3) -Classifier: Operating System :: MacOS :: MacOS X -Classifier: Operating System :: Microsoft :: Windows :: Windows NT/2000 -Classifier: Operating System :: POSIX -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Monitoring -License-File: COPYING.LGPL -Requires-Dist: six -Requires-Dist: evdev>=1.3; "linux" in sys_platform -Requires-Dist: python-xlib>=0.17; "linux" in sys_platform -Requires-Dist: enum34; python_version == "2.7" -Requires-Dist: pyobjc-framework-ApplicationServices>=8.0; sys_platform == "darwin" -Requires-Dist: pyobjc-framework-Quartz>=8.0; sys_platform == "darwin" - -pynput -====== - -This library allows you to control and monitor input devices. - -Currently, mouse and keyboard input and monitoring are supported. - -See `here `_ for the full -documentation. - - -Controlling the mouse ---------------------- - -Use ``pynput.mouse.Controller`` like this:: - - from pynput.mouse import Button, Controller - - mouse = Controller() - - # Read pointer position - print('The current pointer position is {}'.format( - mouse.position)) - - # Set pointer position - mouse.position = (10, 20) - print('Now we have moved it to {}'.format( - mouse.position)) - - # Move pointer relative to current position - mouse.move(5, -5) - - # Press and release - mouse.press(Button.left) - mouse.release(Button.left) - - # Double click; this is different from pressing and releasing - # twice on macOS - mouse.click(Button.left, 2) - - # Scroll two steps down - mouse.scroll(0, 2) - - -Monitoring the mouse --------------------- - -Use ``pynput.mouse.Listener`` like this:: - - from pynput import mouse - - def on_move(x, y, injected): - print('Pointer moved to {}; it was {}'.format( - (x, y, 'faked' if injected else 'not faked'))) - - def on_click(x, y, button, pressed, injected): - print('{} at {}; it was {}'.format( - 'Pressed' if pressed else 'Released', - (x, y, 'faked' if injected else 'not faked'))) - if not pressed: - # Stop listener - return False - - def on_scroll(x, y, dx, dy, injected): - print('Scrolled {} at {}; it was {}'.format( - 'down' if dy < 0 else 'up', - (x, y, 'faked' if injected else 'not faked'))) - - # Collect events until released - with mouse.Listener( - on_move=on_move, - on_click=on_click, - on_scroll=on_scroll) as listener: - listener.join() - - # ...or, in a non-blocking fashion: - listener = mouse.Listener( - on_move=on_move, - on_click=on_click, - on_scroll=on_scroll) - listener.start() - -A mouse listener is a ``threading.Thread``, and all callbacks will be invoked -from the thread. - -Call ``pynput.mouse.Listener.stop`` from anywhere, raise ``StopException`` or -return ``False`` from a callback to stop the listener. - -When using the non-blocking version above, the current thread will continue -executing. This might be necessary when integrating with other GUI frameworks -that incorporate a main-loop, but when run from a script, this will cause the -program to terminate immediately. - - -The mouse listener thread -~~~~~~~~~~~~~~~~~~~~~~~~~ - -The listener callbacks are invoked directly from an operating thread on some -platforms, notably *Windows*. - -This means that long running procedures and blocking operations should not be -invoked from the callback, as this risks freezing input for all processes. - -A possible workaround is to just dispatch incoming messages to a queue, and let -a separate thread handle them. - - -Handling mouse listener errors -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If a callback handler raises an exception, the listener will be stopped. Since -callbacks run in a dedicated thread, the exceptions will not automatically be -reraised. - -To be notified about callback errors, call ``Thread.join`` on the listener -instance:: - - from pynput import mouse - - class MyException(Exception): pass - - def on_click(x, y, button, pressed): - if button == mouse.Button.left: - raise MyException(button) - - # Collect events until released - with mouse.Listener( - on_click=on_click) as listener: - try: - listener.join() - except MyException as e: - print('{} was clicked'.format(e.args[0])) - - -Toggling event listening for the mouse listener -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Once ``pynput.mouse.Listener.stop`` has been called, the listener cannot be -restarted, since listeners are instances of ``threading.Thread``. - -If your application requires toggling listening events, you must either add an -internal flag to ignore events when not required, or create a new listener when -resuming listening. - - -Synchronous event listening for the mouse listener -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To simplify scripting, synchronous event listening is supported through the -utility class ``pynput.mouse.Events``. This class supports reading single -events in a non-blocking fashion, as well as iterating over all events. - -To read a single event, use the following code:: - - from pynput import mouse - - # The event listener will be running in this block - with mouse.Events() as events: - # Block at most one second - event = events.get(1.0) - if event is None: - print('You did not interact with the mouse within one second') - else: - print('Received event {}'.format(event)) - -To iterate over mouse events, use the following code:: - - from pynput import mouse - - # The event listener will be running in this block - with mouse.Events() as events: - for event in events: - if event.button == mouse.Button.right: - break - else: - print('Received event {}'.format(event)) - -Please note that the iterator method does not support non-blocking operation, -so it will wait for at least one mouse event. - -The events will be instances of the inner classes found in -``pynput.mouse.Events``. - - -Ensuring consistent coordinates between listener and controller on Windows -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Recent versions of _Windows_ support running legacy applications scaled when -the system scaling has been increased beyond 100%. This allows old applications -to scale, albeit with a blurry look, and avoids tiny, unusable user interfaces. - -This scaling is unfortunately inconsistently applied to a mouse listener and a -controller: the listener will receive physical coordinates, but the controller -has to work with scaled coordinates. - -This can be worked around by telling Windows that your application is DPI -aware. This is a process global setting, so _pynput_ cannot do it -automatically. Do enable DPI awareness, run the following code:: - - import ctypes - - - PROCESS_PER_MONITOR_DPI_AWARE = 2 - - ctypes.windll.shcore.SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE) - - -Controlling the keyboard ------------------------- - -Use ``pynput.keyboard.Controller`` like this:: - - from pynput.keyboard import Key, Controller - - keyboard = Controller() - - # Press and release space - keyboard.press(Key.space) - keyboard.release(Key.space) - - # Type a lower case A; this will work even if no key on the - # physical keyboard is labelled 'A' - keyboard.press('a') - keyboard.release('a') - - # Type two upper case As - keyboard.press('A') - keyboard.release('A') - with keyboard.pressed(Key.shift): - keyboard.press('a') - keyboard.release('a') - - # Type 'Hello World' using the shortcut type method - keyboard.type('Hello World') - - -Monitoring the keyboard ------------------------ - -Use ``pynput.keyboard.Listener`` like this:: - - from pynput import keyboard - - def on_press(key, injected): - try: - print('alphanumeric key {} pressed; it was {}'.format( - key.char, 'faked' if injected else 'not faked')) - except AttributeError: - print('special key {} pressed'.format( - key)) - - def on_release(key, injected): - print('{} released; it was {}'.format( - key, 'faked' if injected else 'not faked')) - if key == keyboard.Key.esc: - # Stop listener - return False - - # Collect events until released - with keyboard.Listener( - on_press=on_press, - on_release=on_release) as listener: - listener.join() - - # ...or, in a non-blocking fashion: - listener = keyboard.Listener( - on_press=on_press, - on_release=on_release) - listener.start() - -A keyboard listener is a ``threading.Thread``, and all callbacks will be -invoked from the thread. - -Call ``pynput.keyboard.Listener.stop`` from anywhere, raise ``StopException`` -or return ``False`` from a callback to stop the listener. - -The ``key`` parameter passed to callbacks is a ``pynput.keyboard.Key``, for -special keys, a ``pynput.keyboard.KeyCode`` for normal alphanumeric keys, or -just ``None`` for unknown keys. - -When using the non-blocking version above, the current thread will continue -executing. This might be necessary when integrating with other GUI frameworks -that incorporate a main-loop, but when run from a script, this will cause the -program to terminate immediately. - - -The keyboard listener thread -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The listener callbacks are invoked directly from an operating thread on some -platforms, notably *Windows*. - -This means that long running procedures and blocking operations should not be -invoked from the callback, as this risks freezing input for all processes. - -A possible workaround is to just dispatch incoming messages to a queue, and let -a separate thread handle them. - - -Handling keyboard listener errors -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If a callback handler raises an exception, the listener will be stopped. Since -callbacks run in a dedicated thread, the exceptions will not automatically be -reraised. - -To be notified about callback errors, call ``Thread.join`` on the listener -instance:: - - from pynput import keyboard - - class MyException(Exception): pass - - def on_press(key): - if key == keyboard.Key.esc: - raise MyException(key) - - # Collect events until released - with keyboard.Listener( - on_press=on_press) as listener: - try: - listener.join() - except MyException as e: - print('{} was pressed'.format(e.args[0])) - - -Toggling event listening for the keyboard listener -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Once ``pynput.keyboard.Listener.stop`` has been called, the listener cannot be -restarted, since listeners are instances of ``threading.Thread``. - -If your application requires toggling listening events, you must either add an -internal flag to ignore events when not required, or create a new listener when -resuming listening. - - -Synchronous event listening for the keyboard listener -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To simplify scripting, synchronous event listening is supported through the -utility class ``pynput.keyboard.Events``. This class supports reading single -events in a non-blocking fashion, as well as iterating over all events. - -To read a single event, use the following code:: - - from pynput import keyboard - - # The event listener will be running in this block - with keyboard.Events() as events: - # Block at most one second - event = events.get(1.0) - if event is None: - print('You did not press a key within one second') - else: - print('Received event {}'.format(event)) - -To iterate over keyboard events, use the following code:: - - from pynput import keyboard - - # The event listener will be running in this block - with keyboard.Events() as events: - for event in events: - if event.key == keyboard.Key.esc: - break - else: - print('Received event {}'.format(event)) - -Please note that the iterator method does not support non-blocking operation, -so it will wait for at least one keyboard event. - -The events will be instances of the inner classes found in -``pynput.keyboard.Events``. - - -Global hotkeys -~~~~~~~~~~~~~~ - -A common use case for keyboard monitors is reacting to global hotkeys. Since a -listener does not maintain any state, hotkeys involving multiple keys must -store this state somewhere. - -*pynput* provides the class ``pynput.keyboard.HotKey`` for this purpose. It -contains two methods to update the state, designed to be easily interoperable -with a keyboard listener: ``pynput.keyboard.HotKey.press`` and -``pynput.keyboard.HotKey.release`` which can be directly passed as listener -callbacks. - -The intended usage is as follows:: - - from pynput import keyboard - - def on_activate(): - print('Global hotkey activated!') - - def for_canonical(f): - return lambda k: f(l.canonical(k)) - - hotkey = keyboard.HotKey( - keyboard.HotKey.parse('++h'), - on_activate) - with keyboard.Listener( - on_press=for_canonical(hotkey.press), - on_release=for_canonical(hotkey.release)) as l: - l.join() - -This will create a hotkey, and then use a listener to update its state. Once -all the specified keys are pressed simultaneously, ``on_activate`` will be -invoked. - -Note that keys are passed through ``pynput.keyboard.Listener.canonical`` before -being passed to the ``HotKey`` instance. This is to remove any modifier state -from the key events, and to normalise modifiers with more than one physical -button. - -The method ``pynput.keyboard.HotKey.parse`` is a convenience function to -transform shortcut strings to key collections. Please see its documentation for -more information. - -To register a number of global hotkeys, use the convenience class -``pynput.keyboard.GlobalHotKeys``:: - - from pynput import keyboard - - def on_activate_h(): - print('++h pressed') - - def on_activate_i(): - print('++i pressed') - - with keyboard.GlobalHotKeys({ - '++h': on_activate_h, - '++i': on_activate_i}) as h: - h.join() - - -Release Notes -============= - -v1.8.1 (2025-03-17) - Various fixes ------------------------------------ -* Remove incorrectly merged line for the *Xorg* backend. Thanks to *sphh*! -* Let events know about the new ``injected`` parameter. Thanks to - *phpjunkie420*! - - -v1.8.0 (2025-03-03) - Allow detecting injected events ------------------------------------------------------ -* Add a flag to callbacks to allow detecting injected input events. -* Add ``media_stop`` key for *macOS*. Thanks to *laura-3*! -* Add ``eject`` key for *macOS*. Thanks to *DiMNDev*! - - -v1.7.8 (2025-02-28) - Fixes for Python 3.12 -------------------------------------------- -* Rename method for listeners to not conflict with new ``threading.Thread`` - field. - - -v1.7.7 (2024-05-10) - Various fixes ------------------------------------ -* Small corrections to the documentation. -* Handle explicit timeout when calling ``join`` on listeners. -* Correct regression in hot key handling for special keys. -* Reverted changes to lazy loading of ``CoreFoundation`` and ``Quartz``, since - this still does not appear to work. Thanks to *Zach Zaiman*! -* Let the type of values in ``Key`` be ``KeyCode`` so that type checkers are - not confused. Thanks to *Amund Eggen Svandal*! -* Do not crash in ``__del__`` on *Xorg* if display creation fails. Thanks to - *Gabriele Pongelli*! -* Correct support for emojis on *Windows*. Thanks to *Yunus Emre*! - - -v1.7.6 (2022-01-01) - Various fixes ------------------------------------ -* Allow passing virtual key codes to the parser for global hot keys. -* Stop the recording context asynchronously on *Xorg*. -* Do not pass ``None`` to ``objc.objc_object``. Thanks to *yejunxi*! -* Do not crash when pressing the *alt* key on *uinput*. Thanks to *Caldas - Lopes*! -* Use the correct option prefix for listeners derived from the backend - implementations. Thanks to *Yu Wang*! - - -v1.7.5 (2021-11-19) - Various fixes ------------------------------------ -* Corrected crashes on *Xorg* when a listener was configured to suppress - system events. Thanks to *jpramosi*! -* Improved handling of keyboard controller on *Windows*. The controller now - has a greater change of working with applications using lower level events. - Thanks to *bhudax*! -* Updated *macOS* implementation to use new version of *pyobjc*. - - -v1.7.4 (2021-10-10) - Various fixes ------------------------------------ -* Detect whether permissions are lacking on *macOS*. Thanks to *Dane Finlay*! -* Eagerly import symbols from ``CoreFoundation`` and ``Quartz``. Thanks to - *Ronald Oussoren*! -* Improved handling of ``dumpkeys`` utility. Thanks to *Markus Niedermann*! -* Removed ambiguous license file. - - -v1.7.3 (2021-02-10) - Various fixes ------------------------------------ -* Corrected *keysym* handling on *Xorg*; not all groups were loaded, and the - fallback to our internal tables was never triggered. Thanks to *Philipp - Klaus*! -* Updated the version of *Quartz* used for the *macOS* backend to allow - *pynput* to be installed on *Big Sur*. Thanks to *Michael Madden*! -* Added missing function keys on *Windows*. Thanks to *Dave Atkinson*! -* Corrected scroll speed for mouse controller on *macOS*. Thanks to *Albert - Zeyer*! -* Corrected media keys for *Xorg*. Thanks to *Gabriele N. Tornetta*! -* Corrected parameter name in documentation. Thanks to *Jinesi Yelizati*! - - -v1.7.2 (2020-12-21) - Corrected uinput key mapping --------------------------------------------------- -* Corrected mapping of virtual key codes to characters for the *uinput* - backend. -* Corrected spelling errors. Thanks to *Martin Michlmayr*! -* Corrected and improved documentation. - - -v1.7.1 (2020-08-30) - Corrected release notes ---------------------------------------------- -* Corrected thanks for arbitrary unicode character support for *Xorg*. - - -v1.7.0 (2020-08-30) - A new backend and many new features and bug fixes ------------------------------------------------------------------------ -* Added a new *uinput* based keyboard backend for *Linux*, when no *X* server - is available. -* Allow typing arbitrary unicode characters on *Xorg* backend. Thanks to - *gdiShun*! -* Allow overriding the automatically selected backend with an environment - variable, and added a dummy backend. -* Added support for mouse side button on *Windows*. Thanks to *danielkovarik*! -* Added convenience method to tap keys. -* Allow specifying raw virtual key codes in hotkeys. -* Improved error messages when a backend cannot be loaded. -* Include more information in stringification of events. -* Corrected return value of ``Events.get`` to that specified by the - documentation. -* Corrected keyboard listener not to type random characters on certain - keyboard layouts. -* Corrected errors when pressing certain keys on *Windows*, where the - operating system reports that they are dead but no combining version exists. -* Improved documentation. - - -v1.6.8 (2020-02-28) - Various fixes ------------------------------------ -* Updated documentation. -* Corrected lint warnings and tests. -* Do not use internal types in ``argtypes`` for ``win32`` functions; this - renders them uncallable for other code running in the same runtime. -* Include scan codes in events on *Windows*. Thanks to *bhudax*! -* Correctly apply transformation to scroll event values on *Windows*. Thanks - to *DOCCA0*! - - -v1.6.7 (2020-02-17) - Various fixes ------------------------------------ -* Corrected infinite scrolling on *macOS* when providing non-integer deltas. - Thanks to *Iván Munsuri Ibáñez*! -* Corrected controller and listener handling of media keys on *macOS*. Thanks - to *Iván Munsuri Ibáñez*! - - -v1.6.6 (2020-01-23) - Corrected hot key documentation ------------------------------------------------------ -* The code examples for the simple ``pynput.keyboard.HotKey`` now work. Thanks - to *jfongattw*! - - -v1.6.5 (2020-01-08) - Corrected media key mappings --------------------------------------------------- -* Corrected media key mappings on *macOS*. Thanks to *Luis Nachtigall*! - - -v1.6.4 (2020-01-03) - Corrected imports yet again -------------------------------------------------- -* Corrected imports for keyboard Controller. Thanks to *rhystedstone*! - - -v1.6.3 (2019-12-28) - Corrected imports again ---------------------------------------------- -* Corrected imports for keyboard Controller. Thanks to *Matt Iversen*! - - -v1.6.2 (2019-12-28) - Corrected imports ---------------------------------------- -* Corrected imports for keyboard Controller. Thanks to *Matt Iversen*! - - -v1.6.1 (2019-12-27) - Corrections for *Windows* ------------------------------------------------ -* Corrected global hotkeys on *Windows*. -* Corrected pressed / released state for keyboard listener on *Windows*. - Thanks to *segalion*! - -v1.6.0 (2019-12-11) - Global Hotkeys ------------------------------------- -* Added support for global hotkeys. -* Added support for streaming listener events synchronously. - - -v1.5.2 (2019-12-06) - Corrected media key names for *Xorg* ----------------------------------------------------------- -* Removed media flag from *Xorg* keys. - - -v1.5.1 (2019-12-06) - Corrected media key names for *macOS* ------------------------------------------------------------ -* Corrected attribute names for media keys on *macOS*. Thanks to *ah3243*! - - -v1.5.0 (2019-12-04) - Various improvements ------------------------------------------- -* Corrected keyboard listener on *Windows*. Thanks to *akiratakasaki*, - *segalion*, *SpecialCharacter*! -* Corrected handling of some special keys, including arrow keys, when combined - with modifiers on *Windows*. Thanks to *tuessetr*! -* Updated documentation to include information about DPI scaling on *Windows*. - Thanks to *david-szarka*! -* Added experimental support for media keys. Thanks to *ShivamJoker*, - *StormTersteeg*! - - -v1.4.5 (2019-11-05) - Corrected errors on *Python 3.8* ------------------------------------------------------- -* Corrected errors about using `in` operator for enums on *Python 3.8* on - *macOS*. - - -v1.4.4 (2019-09-24) - Actually corrected keyboard listener on macOS -------------------------------------------------------------------- -* Included commit to correctly fall back on - ``CGEventKeyboardGetUnicodeString``. -* Corrected deprecation warnings about ``Enum`` usage on *Python 3.8*. - - -v1.4.3 (2019-09-24) - Corrected keyboard listener on macOS again ----------------------------------------------------------------- -* Correctly fall back on ``CGEventKeyboardGetUnicodeString``. -* Updated documentation. - - -v1.4.2 (2019-03-22) - Corrected keyboard listener on macOS ----------------------------------------------------------- -* Use ``CGEventKeyboardGetUnicodeString`` in *macOS* keyboard listener to send - correct characters. -* Include keysym instead of key code in *Xorg* keyboard listener. -* Corrected logging to not include expected ``StopException``. -* Updated and corrected documentation. - - -v1.4.1 (2018-09-07) - Logging ------------------------------ -* Log unhandled exceptions raised by listener callbacks. - - -v1.4 (2018-07-03) - Event suppression -------------------------------------- -* Added possibility to fully suppress events when listening. -* Added support for typing some control characters. -* Added support for mouse drag events on *OSX*. Thanks to *jungledrum*! -* Include the key code in keyboard listener events. -* Correctly handle the numeric key pad on *Xorg* with *num lock* active. - Thanks to *TheoRet*! -* Corrected handling of current thread keyboard layout on *Windows*. Thanks to - *Schmettaling*! -* Corrected stopping of listeners on *Xorg*. -* Corrected import of ``Xlib.keysymdef.xkb`` on *Xorg*. Thanks to *Glandos*! - - -v1.3.10 (2018-02-05) - Do not crash under *Xephyr* --------------------------------------------------- -* Do not crash when ``Xlib.display.Display.get_input_focus`` returns an - integer, as it may when running under *Xephyr*. Thanks to *Eli Skeggs*! - - -v1.3.9 (2018-01-12) - Correctly handle the letter *A* on *OSX* --------------------------------------------------------------- -* Corrected check for virtual key code when generating keyboard events on - *OSX*. This fixes an issue where pressing *A* with *shift* explicitly pressed - would still type a minuscule letter. - - -v1.3.8 (2017-12-08) - Do not crash on some keyboard layouts on *OSX* --------------------------------------------------------------------- -* Fall back on a different method to retrieve the keyboard layout on *OSX*. - This helps for some keyboard layouts, such as *Chinese*. Thanks to - *haoflynet*! - - -v1.3.7 (2017-08-23) - *Xorg* corrections ----------------------------------------- -* Include mouse buttons up to *30* for *Xorg*. - - -v1.3.6 (2017-08-13) - *win32* corrections ------------------------------------------ -* Corrected double delivery of fake keyboard events on *Windows*. -* Corrected handling of synthetic unicode keys on *Windows*. - - -v1.3.5 (2017-06-07) - Corrected dependencies again --------------------------------------------------- -* Reverted changes in *1.3.3*. -* Corrected platform specifier for *Python 2* on *Linux*. - - -v1.3.4 (2017-06-05) - *Xorg* corrections ----------------------------------------- -* Corrected bounds check for values on *Xorg*. - - -v1.3.3 (2017-06-05) - Make dependencies non-optional ----------------------------------------------------- -* Made platform dependencies non-optional. - - -v1.3.2 (2017-05-15) - Fix for button click on Mac -------------------------------------------------- -* Corrected regression from previous release where button clicks would - crash the *Mac* mouse listener. - - -v1.3.1 (2017-05-12) - Fixes for unknown buttons on Linux --------------------------------------------------------- -* Fall back on `Button.unknown` for unknown mouse buttons in *Xorg* mouse - listener. - - -v1.3 (2017-04-10) - Platform specific features ----------------------------------------------- -* Added ability to stop event propagation on *Windows*. This will prevent - events from reaching other applications. -* Added ability to ignore events on *Windows*. This is a workaround for systems - where the keyboard monitor interferes with normal keyboard events. -* Added ability to modify events on *OSX*. This allows intercepting and - altering input events before they reach other applications. -* Corrected crash on *OSX* when some types of third party input sources are - installed. - - -v1.2 (2017-01-06) - Improved error handling -------------------------------------------- -* Allow catching exceptions thrown from listener callbacks. This changes the - API, as joining a listener now potentially raises unhandled exceptions, - and unhandled exceptions will stop listeners. -* Added support for the numeric keypad on *Linux*. -* Improved documentation. -* Thanks to *jollysean* and *gilleswijnker* for their input! - - -v1.1.7 (2017-01-02) - Handle middle button on Windows ------------------------------------------------------ -* Listen for and dispatch middle button mouse clicks on *Windows*. - - -v1.1.6 (2016-11-24) - Corrected context manager for pressing keys ------------------------------------------------------------------ -* Corrected bug in ``pynput.keyboard.Controller.pressed`` which caused it to - never release the key. Many thanks to Toby Southwell! - - -v1.1.5 (2016-11-17) - Corrected modifier key combinations on Linux ------------------------------------------------------------------- -* Corrected handling of modifier keys to allow them to be composable on - *Linux*. - - -v1.1.4 (2016-10-30) - Small bugfixes ------------------------------------- -* Corrected error generation when ``GetKeyboardState`` fails. -* Make sure to apply shift state to borrowed keys on *X*. -* Use *pylint*. - - -v1.1.3 (2016-09-27) - Changed Xlib backend library --------------------------------------------------- -* Changed *Xlib* library. - - -v1.1.2 (2016-09-26) - Added missing type for Python 2 ------------------------------------------------------ -* Added missing ``LPDWORD`` for *Python 2* on *Windows*. - - -v1.1.1 (2016-09-26) - Fixes for listeners and controllers on Windows --------------------------------------------------------------------- -* Corrected keyboard listener on *Windows*. Modifier keys and other keys - changing the state of the keyboard are now handled correctly. -* Corrected mouse click and release on *Windows*. -* Corrected code samples. - - -v1.1 (2016-06-22) - Simplified usage on Linux ---------------------------------------------- -* Propagate import errors raised on Linux to help troubleshoot missing - ``Xlib`` module. -* Declare ``python3-xlib`` as dependency on *Linux* for *Python 3*. - - -v1.0.6 (2016-04-19) - Universal wheel -------------------------------------- -* Make sure to build a universal wheel for all python versions. - - -v1.0.5 (2016-04-11) - Fixes for dragging on OSX ------------------------------------------------ -* Corrected dragging on *OSX*. -* Added scroll speed constant for *OSX* to correct slow scroll speed. - - -v1.0.4 (2016-04-11) - Fixes for clicking and scrolling on Windows ------------------------------------------------------------------ -* Corrected name of mouse input field when sending click and scroll events. - - -v1.0.3 (2016-04-05) - Fixes for Python 3 on Windows ---------------------------------------------------- -* Corrected use of ``ctypes`` on Windows. - - -v1.0.2 (2016-04-03) - Fixes for thread identifiers --------------------------------------------------- -* Use thread identifiers to identify threads, not Thread instances. - - -v1.0.1 (2016-04-03) - Fixes for Python 3 ----------------------------------------- -* Corrected bugs which prevented the library from being used on *Python 3*. - - -v1.0 (2016-02-28) - Stable Release ----------------------------------- -* Changed license to *LGPL*. -* Corrected minor bugs and inconsistencies. -* Corrected and extended documentation. - - -v0.6 (2016-02-08) - Keyboard Monitor ------------------------------------- -* Added support for monitoring the keyboard. -* Corrected wheel packaging. -* Corrected deadlock when stopping a listener in some cases on *X*. -* Corrected key code constants on *Mac OSX*. -* Do not intercept events on *Mac OSX*. - - -v0.5.1 (2016-01-26) - Do not die on dead keys ---------------------------------------------- -* Corrected handling of dead keys. -* Corrected documentation. - - -v0.5 (2016-01-18) - Keyboard Modifiers --------------------------------------- -* Added support for modifiers. - - -v0.4 (2015-12-22) - Keyboard Controller ---------------------------------------- -* Added keyboard controller. - - -v0.3 (2015-12-22) - Cleanup ---------------------------- -* Moved ``pynput.mouse.Controller.Button`` to top-level. - - -v0.2 (2015-10-28) - Initial Release ------------------------------------ -* Support for controlling the mouse on *Linux*, *Mac OSX* and *Windows*. -* Support for monitoring the mouse on *Linux*, *Mac OSX* and *Windows*. diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/RECORD b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/RECORD deleted file mode 100644 index f1c0319..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/RECORD +++ /dev/null @@ -1,55 +0,0 @@ -pynput-1.8.1.dist-info/COPYING.LGPL,sha256=eInlwsfJhthC1m5_bBVCQ1Mmf5nTUtL8MpjKfZxi0LU,7656 -pynput-1.8.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pynput-1.8.1.dist-info/METADATA,sha256=YNPNdd5SDrz20GVbmn7XZ-viRHHlyyZu1rUhCoYTo0k,32018 -pynput-1.8.1.dist-info/RECORD,, -pynput-1.8.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pynput-1.8.1.dist-info/WHEEL,sha256=qUzzGenXXuJTzyjFah76kDVqDvnk-YDzY00svnrl84w,109 -pynput-1.8.1.dist-info/pbr.json,sha256=CAnWerrCQ6A-ekJTVVKkD9J-ia4q-xoZzQWKOlPcseQ,47 -pynput-1.8.1.dist-info/top_level.txt,sha256=DpJjYf-VkYaa_COk_yUczD0pHqsLndB9SjmwcQGkXJQ,7 -pynput-1.8.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 -pynput/__init__.py,sha256=dJ7uVZs3BRQILOxuM9BqDNDS36Qav123Hpx-3HUklpo,1334 -pynput/__pycache__/__init__.cpython-313.pyc,, -pynput/__pycache__/_info.cpython-313.pyc,, -pynput/_info.py,sha256=2aajH_7soMpmZO_oMDHp7R2aXpMher6jdVa5Mnhjj6g,775 -pynput/_util/__init__.py,sha256=ZB2LiSbGsbeQlnlVUQP9TNze15Fv6cb9m1zXYuJmy5g,15482 -pynput/_util/__pycache__/__init__.cpython-313.pyc,, -pynput/_util/__pycache__/darwin.cpython-313.pyc,, -pynput/_util/__pycache__/darwin_vks.cpython-313.pyc,, -pynput/_util/__pycache__/uinput.cpython-313.pyc,, -pynput/_util/__pycache__/win32.cpython-313.pyc,, -pynput/_util/__pycache__/win32_vks.cpython-313.pyc,, -pynput/_util/__pycache__/xorg.cpython-313.pyc,, -pynput/_util/__pycache__/xorg_keysyms.cpython-313.pyc,, -pynput/_util/darwin.py,sha256=AxtbSopLkKzWI1WLdCIZWMQtUtTuCxbRvWB6-WKcsCM,9200 -pynput/_util/darwin_vks.py,sha256=x-SbG4VgJ6Qc5-ZyF8cniqN3qIqahuQtXzG8ei94uWI,1512 -pynput/_util/uinput.py,sha256=ZFYiTsjQ7lr4h43X2Axrj-_FvWxiVT6dik7Z7Ra_sQE,2837 -pynput/_util/win32.py,sha256=YzEct1u1pzQ8v69kRlF-PnMB9BxwqkxCroNFVy4Ychw,18135 -pynput/_util/win32_vks.py,sha256=lC4y8E85nCGHmr4avVs44SvuBvUHBxmDeikNZcPGt6o,2894 -pynput/_util/xorg.py,sha256=ETHqMURfpvnA4q1UFIFQpWCj0c_9YTgasH3e0M4PRrM,15251 -pynput/_util/xorg_keysyms.py,sha256=YGRUXj1P0HT0gEkci2HZHyI_wcOwt0imt6R-7wPQVJo,69338 -pynput/keyboard/__init__.py,sha256=-5KBcWTSFjv2z1tu6sMV40UwhcqcX5O-yIex9fAmC_o,7903 -pynput/keyboard/__pycache__/__init__.cpython-313.pyc,, -pynput/keyboard/__pycache__/_base.cpython-313.pyc,, -pynput/keyboard/__pycache__/_darwin.cpython-313.pyc,, -pynput/keyboard/__pycache__/_dummy.cpython-313.pyc,, -pynput/keyboard/__pycache__/_uinput.cpython-313.pyc,, -pynput/keyboard/__pycache__/_win32.cpython-313.pyc,, -pynput/keyboard/__pycache__/_xorg.cpython-313.pyc,, -pynput/keyboard/_base.py,sha256=CPkWx8uE-oEhYMiRUY3uxqZuAMgT7Phrv3k8WoYp-D0,24082 -pynput/keyboard/_darwin.py,sha256=apF_nOR5EECuo1q-tZ5bi66JM3uFa83ZJy7Cfpc6xSQ,11672 -pynput/keyboard/_dummy.py,sha256=hkBFRY7HWyl86B_HdFiTeLthJjg926kN2peF-HUUXB0,895 -pynput/keyboard/_uinput.py,sha256=EH9FJX45IlbmjGvE1x4O2Ixvgkynp7XOka-vbtjVEAI,14479 -pynput/keyboard/_win32.py,sha256=i3S975s2SlEL9wva9ZMTi0icrNMWHyoj2zPN6gLeqsQ,12645 -pynput/keyboard/_xorg.py,sha256=QEGbet8NreQElzaSGfyARLaVoZxEvcIOTtjU6EHPnRQ,22677 -pynput/mouse/__init__.py,sha256=RiwZMZiWJEikRr8amiMoqJDVTn9i0irEfFcy3IA-s4w,2864 -pynput/mouse/__pycache__/__init__.cpython-313.pyc,, -pynput/mouse/__pycache__/_base.cpython-313.pyc,, -pynput/mouse/__pycache__/_darwin.cpython-313.pyc,, -pynput/mouse/__pycache__/_dummy.cpython-313.pyc,, -pynput/mouse/__pycache__/_win32.cpython-313.pyc,, -pynput/mouse/__pycache__/_xorg.cpython-313.pyc,, -pynput/mouse/_base.py,sha256=FfxHWA126ts1vz05YdcOHJOWb3XaF6WTctM-_ix6FNU,9338 -pynput/mouse/_darwin.py,sha256=a6M_Od7yCzEdxxrYGWLlHuInOWk6Nibd6dKnm5HC79s,6793 -pynput/mouse/_dummy.py,sha256=p16GreQcJbLMhE51uf8H3F8iarHf7Tu2s0JGt3J2xeQ,874 -pynput/mouse/_win32.py,sha256=e1NYKhsKe_Z2W4SZOJK3xWqDjtAa7Dy-zmvT_WzKx7M,7117 -pynput/mouse/_xorg.py,sha256=0P-N-jvRw0VTXH5P1O4LVnTds8jeHlqBiiDRpoUxVzQ,5559 diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/REQUESTED b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/WHEEL b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/WHEEL deleted file mode 100644 index de294b9..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (74.1.2) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/pbr.json b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/pbr.json deleted file mode 100644 index ab50f33..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/pbr.json +++ /dev/null @@ -1 +0,0 @@ -{"is_release": false, "git_version": "2d6ab69"} \ No newline at end of file diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/top_level.txt b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/top_level.txt deleted file mode 100644 index 91a67a9..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pynput diff --git a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/zip-safe b/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/PortablePython/Lib/site-packages/pynput-1.8.1.dist-info/zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/PortablePython/Lib/site-packages/pynput/__init__.py b/PortablePython/Lib/site-packages/pynput/__init__.py deleted file mode 100644 index b6ab843..0000000 --- a/PortablePython/Lib/site-packages/pynput/__init__.py +++ /dev/null @@ -1,41 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The main *pynput* module. - -This module imports ``keyboard`` and ``mouse``. -""" - -def _logger(cls): - """Creates a logger with a name suitable for a specific class. - - This function takes into account that implementations for classes reside in - platform dependent modules, and thus removes the final part of the module - name. - - :param type cls: The class for which to create a logger. - - :return: a logger - """ - import logging - return logging.getLogger('{}.{}'.format( - '.'.join(cls.__module__.split('.', 2)[:2]), - cls.__name__)) - - -from . import keyboard -from . import mouse diff --git a/PortablePython/Lib/site-packages/pynput/_info.py b/PortablePython/Lib/site-packages/pynput/_info.py deleted file mode 100644 index 91bf033..0000000 --- a/PortablePython/Lib/site-packages/pynput/_info.py +++ /dev/null @@ -1,19 +0,0 @@ -# coding=utf-8 -# pystray -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . - -__author__ = u'Moses Palmér' -__version__ = (1, 8, 1) diff --git a/PortablePython/Lib/site-packages/pynput/_util/__init__.py b/PortablePython/Lib/site-packages/pynput/_util/__init__.py deleted file mode 100644 index c7d98b4..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/__init__.py +++ /dev/null @@ -1,489 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -General utility functions and classes. -""" - -# pylint: disable=R0903 -# We implement minimal mixins - -# pylint: disable=W0212 -# We implement an internal API - -import contextlib -import functools -import importlib -import inspect -import os -import sys -import threading -import time - -import six - -from six.moves import queue - - -#: Possible resolutions for import related errors. -RESOLUTIONS = { - 'darwin': 'Please make sure that you have Python bindings for the ' - 'system frameworks installed', - 'uinput': 'Please make sure that you are running as root, and that ' - 'the utility dumpkeys is installed', - 'xorg': 'Please make sure that you have an X server running, and that ' - 'the DISPLAY environment variable is set correctly'} - - -def backend(package): - """Returns the backend module for a package. - - :param str package: The package for which to load a backend. - """ - backend_name = os.environ.get( - 'PYNPUT_BACKEND_{}'.format(package.rsplit('.')[-1].upper()), - os.environ.get('PYNPUT_BACKEND', None)) - if backend_name: - modules = [backend_name] - elif sys.platform == 'darwin': - modules = ['darwin'] - elif sys.platform == 'win32': - modules = ['win32'] - else: - modules = ['xorg'] - - errors = [] - resolutions = [] - for module in modules: - try: - return importlib.import_module('._' + module, package) - except ImportError as e: - errors.append(e) - if module in RESOLUTIONS: - resolutions.append(RESOLUTIONS[module]) - - raise ImportError('this platform is not supported: {}'.format( - '; '.join(str(e) for e in errors)) + ('\n\n' - 'Try one of the following resolutions:\n\n' - + '\n\n'.join( - ' * {}'.format(s) - for s in resolutions)) - if resolutions else '') - - -def prefix(base, cls): - """Calculates the prefix to use for platform specific options for a - specific class. - - The prefix if the name of the module containing the class that is an - immediate subclass of ``base`` among the super classes of ``cls``. - """ - for super_cls in filter( - lambda cls: issubclass(cls, base), - cls.__mro__[1:]): - if super_cls is base: - return cls.__module__.rsplit('.', 1)[-1][1:] + '_' - else: - result = prefix(base, super_cls) - if result is not None: - return result - - -class AbstractListener(threading.Thread): - """A class implementing the basic behaviour for event listeners. - - Instances of this class can be used as context managers. This is equivalent - to the following code:: - - listener.start() - listener.wait() - try: - with_statements() - finally: - listener.stop() - - Actual implementations of this class must set the attribute ``_log``, which - must be an instance of :class:`logging.Logger`. - - :param bool suppress: Whether to suppress events. Setting this to ``True`` - will prevent the input events from being passed to the rest of the - system. - - :param kwargs: A mapping from callback attribute to callback handler. All - handlers will be wrapped in a function reading the return value of the - callback, and if it ``is False``, raising :class:`StopException`. - - Any callback that is falsy will be ignored. - """ - class StopException(Exception): - """If an event listener callback raises this exception, the current - listener is stopped. - """ - pass - - #: Exceptions that are handled outside of the emitter and should thus not - #: be passed through the queue - _HANDLED_EXCEPTIONS = tuple() - - def __init__(self, suppress=False, **kwargs): - super(AbstractListener, self).__init__() - - def wrapper(f): - def inner(*args): - if f(*args) is False: - raise self.StopException() - return inner - - self._suppress = suppress - self._running = False - self._thread = threading.current_thread() - self._condition = threading.Condition() - self._ready = False - - # Allow multiple calls to stop - self._queue = queue.Queue(10) - - self.daemon = True - - for name, callback in kwargs.items(): - setattr(self, name, wrapper(callback)) - - @property - def suppress(self): - """Whether to suppress events. - """ - return self._suppress - - @property - def running(self): - """Whether the listener is currently running. - """ - return self._running - - def stop(self): - """Stops listening for events. - - When this method returns, no more events will be delivered. Once this - method has been called, the listener instance cannot be used any more, - since a listener is a :class:`threading.Thread`, and once stopped it - cannot be restarted. - - To resume listening for event, a new listener must be created. - """ - if self._running: - self._running = False - self._queue.put(None) - self._stop_platform() - - def __enter__(self): - self.start() - self.wait() - return self - - def __exit__(self, exc_type, value, traceback): - self.stop() - - def wait(self): - """Waits for this listener to become ready. - """ - self._condition.acquire() - while not self._ready: - self._condition.wait() - self._condition.release() - - def run(self): - """The thread runner method. - """ - self._running = True - self._thread = threading.current_thread() - self._run() - - # Make sure that the queue contains something - self._queue.put(None) - - @classmethod - def _emitter(cls, f): - """A decorator to mark a method as the one emitting the callbacks. - - This decorator will wrap the method and catch exception. If a - :class:`StopException` is caught, the listener will be stopped - gracefully. If any other exception is caught, it will be propagated to - the thread calling :meth:`join` and reraised there. - """ - @functools.wraps(f) - def inner(self, *args, **kwargs): - # pylint: disable=W0702; we want to catch all exception - try: - return f(self, *args, **kwargs) - except Exception as e: - if not isinstance(e, self._HANDLED_EXCEPTIONS): - if not isinstance(e, AbstractListener.StopException): - self._log.exception( - 'Unhandled exception in listener callback') - self._queue.put( - None if isinstance(e, cls.StopException) - else sys.exc_info()) - self.stop() - raise - # pylint: enable=W0702 - - return inner - - def _mark_ready(self): - """Marks this listener as ready to receive events. - - This method must be called from :meth:`_run`. :meth:`wait` will block - until this method is called. - """ - self._condition.acquire() - self._ready = True - self._condition.notify() - self._condition.release() - - def _run(self): - """The implementation of the :meth:`run` method. - - This is a platform dependent implementation. - """ - raise NotImplementedError() - - def _stop_platform(self): - """The implementation of the :meth:`stop` method. - - This is a platform dependent implementation. - """ - raise NotImplementedError() - - def _wrap(self, f, args): - """Wraps a callable to make it accept ``args`` number of arguments. - - :param f: The callable to wrap. If this is ``None`` a no-op wrapper is - returned. - - :param int args: The number of arguments to accept. - - :raises ValueError: if f requires more than ``args`` arguments - """ - if f is None: - return lambda *a: None - else: - argspec = inspect.getfullargspec(f) - actual = len(inspect.signature(f).parameters) - defaults = len(argspec.defaults) if argspec.defaults else 0 - if actual - defaults > args: - raise ValueError(f) - elif actual >= args or argspec.varargs is not None: - return f - else: - return lambda *a: f(*a[:actual]) - - def join(self, timeout=None, *args): - start = time.time() - super(AbstractListener, self).join(timeout, *args) - timeout = max(0.0, timeout - (time.time() - start)) \ - if timeout is not None \ - else None - - # Reraise any exceptions; make sure not to block if a timeout was - # provided - try: - exc_type, exc_value, exc_traceback = self._queue.get( - timeout=timeout) - six.reraise(exc_type, exc_value, exc_traceback) - except queue.Empty: - pass - except TypeError: - return - - -class Events(object): - """A base class to enable iterating over events. - """ - #: The listener class providing events. - _Listener = None - - class Event(object): - def __str__(self): - return '{}({})'.format( - self.__class__.__name__, - ', '.join( - '{}={}'.format(k, v) - for (k, v) in vars(self).items())) - - def __eq__(self, other): - return self.__class__ == other.__class__ \ - and dir(self) == dir(other) \ - and all( - getattr(self, k) == getattr(other, k) - for k in dir(self)) - - def __init__(self, *args, **kwargs): - super(Events, self).__init__() - self._event_queue = queue.Queue() - self._sentinel = object() - self._listener = self._Listener(*args, **{ - key: self._event_mapper(value) - for (key, value) in kwargs.items()}) - self.start = self._listener.start - - def __enter__(self): - self._listener.__enter__() - return self - - def __exit__(self, *args): - self._listener.__exit__(*args) - - # Drain the queue to ensure that the put does not block - while True: - try: - self._event_queue.get_nowait() - except queue.Empty: - break - - self._event_queue.put(self._sentinel) - - def __iter__(self): - return self - - def __next__(self): - event = self.get() - if event is not None: - return event - else: - raise StopIteration() - - def get(self, timeout=None): - """Attempts to read the next event. - - :param int timeout: An optional timeout. If this is not provided, this - method may block infinitely. - - :return: the next event, or ``None`` if the source has been stopped or - no events were received - """ - try: - event = self._event_queue.get(timeout=timeout) - return event if event is not self._sentinel else None - except queue.Empty: - return None - - def _event_mapper(self, event): - """Generates an event callback to transforms the callback arguments to - an event and then publishes it. - - :param callback event: A function generating an event object. - - :return: a callback - """ - @functools.wraps(event) - def inner(*args): - try: - self._event_queue.put(event(*args), block=False) - except queue.Full: - pass - - return inner - - -class NotifierMixin(object): - """A mixin for notifiers of fake events. - - This mixin can be used for controllers on platforms where sending fake - events does not cause a listener to receive a notification. - """ - def _emit(self, action, *args): - """Sends a notification to all registered listeners. - - This method will ensure that listeners that raise - :class:`StopException` are stopped. - - :param str action: The name of the notification. - - :param args: The arguments to pass. - """ - stopped = [] - for listener in self._listeners(): - try: - getattr(listener, action)(*args) - except listener.StopException: - stopped.append(listener) - for listener in stopped: - listener.stop() - - @classmethod - def _receiver(cls, listener_class): - """A decorator to make a class able to receive fake events from a - controller. - - This decorator will add the method ``_receive`` to the decorated class. - - This method is a context manager which ensures that all calls to - :meth:`_emit` will invoke the named method in the listener instance - while the block is active. - """ - @contextlib.contextmanager - def receive(self): - """Executes a code block with this listener instance registered as - a receiver of fake input events. - """ - self._controller_class._add_listener(self) - try: - yield - finally: - self._controller_class._remove_listener(self) - - listener_class._receive = receive - listener_class._controller_class = cls - - # Make sure this class has the necessary attributes - if not hasattr(cls, '_listener_cache'): - cls._listener_cache = set() - cls._listener_lock = threading.Lock() - - return listener_class - - @classmethod - def _listeners(cls): - """Iterates over the set of running listeners. - - This method will quit without acquiring the lock if the set is empty, - so there is potential for race conditions. This is an optimisation, - since :class:`Controller` will need to call this method for every - control event. - """ - if not cls._listener_cache: - return - with cls._listener_lock: - for listener in cls._listener_cache: - yield listener - - @classmethod - def _add_listener(cls, listener): - """Adds a listener to the set of running listeners. - - :param listener: The listener for fake events. - """ - with cls._listener_lock: - cls._listener_cache.add(listener) - - @classmethod - def _remove_listener(cls, listener): - """Removes this listener from the set of running listeners. - - :param listener: The listener for fake events. - """ - with cls._listener_lock: - cls._listener_cache.remove(listener) diff --git a/PortablePython/Lib/site-packages/pynput/_util/darwin.py b/PortablePython/Lib/site-packages/pynput/_util/darwin.py deleted file mode 100644 index fdc284b..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/darwin.py +++ /dev/null @@ -1,302 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -Utility functions and classes for the *Darwin* backend. -""" - -# pylint: disable=C0103 -# pylint: disable=R0903 -# This module contains wrapper classes - -import contextlib -import ctypes -import ctypes.util -import six - -import objc -import HIServices - -from CoreFoundation import ( - CFRelease -) - -from Quartz import ( - CFMachPortCreateRunLoopSource, - CFRunLoopAddSource, - CFRunLoopGetCurrent, - CFRunLoopRunInMode, - CFRunLoopStop, - CGEventGetIntegerValueField, - CGEventTapCreate, - CGEventTapEnable, - kCFRunLoopDefaultMode, - kCFRunLoopRunTimedOut, - kCGEventSourceUnixProcessID, - kCGEventTapOptionDefault, - kCGEventTapOptionListenOnly, - kCGHeadInsertEventTap, - kCGSessionEventTap) - - -from . import AbstractListener - - -def _wrap_value(value): - """Converts a pointer to a *Python objc* value. - - :param value: The pointer to convert. - - :return: a wrapped value - """ - return objc.objc_object(c_void_p=value) if value is not None else None - - -@contextlib.contextmanager -def _wrapped(value): - """A context manager that converts a raw pointer to a *Python objc* value. - - When the block is exited, the value is released. - - :param value: The raw value to wrap. - """ - wrapped_value = _wrap_value(value) - - try: - yield value - finally: - CFRelease(wrapped_value) - - -class CarbonExtra(object): - """A class exposing some missing functionality from *Carbon* as class - attributes. - """ - _Carbon = ctypes.cdll.LoadLibrary(ctypes.util.find_library('Carbon')) - - _Carbon.TISCopyCurrentKeyboardInputSource.argtypes = [] - _Carbon.TISCopyCurrentKeyboardInputSource.restype = ctypes.c_void_p - - _Carbon.TISCopyCurrentASCIICapableKeyboardLayoutInputSource.argtypes = [] - _Carbon.TISCopyCurrentASCIICapableKeyboardLayoutInputSource.restype = \ - ctypes.c_void_p - - _Carbon.TISGetInputSourceProperty.argtypes = [ - ctypes.c_void_p, ctypes.c_void_p] - _Carbon.TISGetInputSourceProperty.restype = ctypes.c_void_p - - _Carbon.LMGetKbdType.argtypes = [] - _Carbon.LMGetKbdType.restype = ctypes.c_uint32 - - _Carbon.UCKeyTranslate.argtypes = [ - ctypes.c_void_p, - ctypes.c_uint16, - ctypes.c_uint16, - ctypes.c_uint32, - ctypes.c_uint32, - ctypes.c_uint32, - ctypes.POINTER(ctypes.c_uint32), - ctypes.c_uint8, - ctypes.POINTER(ctypes.c_uint8), - ctypes.c_uint16 * 4] - _Carbon.UCKeyTranslate.restype = ctypes.c_uint32 - - TISCopyCurrentKeyboardInputSource = \ - _Carbon.TISCopyCurrentKeyboardInputSource - - TISCopyCurrentASCIICapableKeyboardLayoutInputSource = \ - _Carbon.TISCopyCurrentASCIICapableKeyboardLayoutInputSource - - kTISPropertyUnicodeKeyLayoutData = ctypes.c_void_p.in_dll( - _Carbon, 'kTISPropertyUnicodeKeyLayoutData') - - TISGetInputSourceProperty = \ - _Carbon.TISGetInputSourceProperty - - LMGetKbdType = \ - _Carbon.LMGetKbdType - - kUCKeyActionDisplay = 3 - kUCKeyTranslateNoDeadKeysBit = 0 - - UCKeyTranslate = \ - _Carbon.UCKeyTranslate - - -@contextlib.contextmanager -def keycode_context(): - """Returns an opaque value representing a context for translating keycodes - to strings. - """ - keyboard_type, layout_data = None, None - for source in [ - CarbonExtra.TISCopyCurrentKeyboardInputSource, - CarbonExtra.TISCopyCurrentASCIICapableKeyboardLayoutInputSource]: - with _wrapped(source()) as keyboard: - keyboard_type = CarbonExtra.LMGetKbdType() - layout = _wrap_value(CarbonExtra.TISGetInputSourceProperty( - keyboard, - CarbonExtra.kTISPropertyUnicodeKeyLayoutData)) - layout_data = layout.bytes().tobytes() if layout else None - if keyboard is not None and layout_data is not None: - break - yield (keyboard_type, layout_data) - - -def keycode_to_string(context, keycode, modifier_state=0): - """Converts a keycode to a string. - """ - LENGTH = 4 - - keyboard_type, layout_data = context - - dead_key_state = ctypes.c_uint32() - length = ctypes.c_uint8() - unicode_string = (ctypes.c_uint16 * LENGTH)() - CarbonExtra.UCKeyTranslate( - layout_data, - keycode, - CarbonExtra.kUCKeyActionDisplay, - modifier_state, - keyboard_type, - CarbonExtra.kUCKeyTranslateNoDeadKeysBit, - ctypes.byref(dead_key_state), - LENGTH, - ctypes.byref(length), - unicode_string) - return u''.join( - six.unichr(unicode_string[i]) - for i in range(length.value)) - - -def get_unicode_to_keycode_map(): - """Returns a mapping from unicode strings to virtual key codes. - - :return: a dict mapping key codes to strings - """ - with keycode_context() as context: - return { - keycode_to_string(context, keycode): keycode - for keycode in range(128)} - - -class ListenerMixin(object): - """A mixin for *Quartz* event listeners. - - Subclasses should set a value for :attr:`_EVENTS` and implement - :meth:`_handle_message`. - """ - #: The events that we listen to - _EVENTS = tuple() - - #: Whether this process is trusted to monitor input events. - IS_TRUSTED = False - - def _run(self): - self.IS_TRUSTED = HIServices.AXIsProcessTrusted() - if not self.IS_TRUSTED: - self._log.warning( - 'This process is not trusted! Input event monitoring will not ' - 'be possible until it is added to accessibility clients.') - - self._loop = None - try: - tap = self._create_event_tap() - if tap is None: - self._mark_ready() - return - - loop_source = CFMachPortCreateRunLoopSource( - None, tap, 0) - self._loop = CFRunLoopGetCurrent() - - CFRunLoopAddSource( - self._loop, loop_source, kCFRunLoopDefaultMode) - CGEventTapEnable(tap, True) - - self._mark_ready() - - # pylint: disable=W0702; we want to silence errors - try: - while self.running: - result = CFRunLoopRunInMode( - kCFRunLoopDefaultMode, 1, False) - try: - if result != kCFRunLoopRunTimedOut: - break - except AttributeError: - # This happens during teardown of the virtual machine - break - - except: - # This exception will have been passed to the main thread - pass - # pylint: enable=W0702 - - finally: - self._loop = None - - def _stop_platform(self): - # The base class sets the running flag to False; this will cause the - # loop around run loop invocations to terminate and set this event - try: - if self._loop is not None: - CFRunLoopStop(self._loop) - except AttributeError: - # The loop may not have been created - pass - - def _create_event_tap(self): - """Creates the event tap used by the listener. - - :return: an event tap - """ - return CGEventTapCreate( - kCGSessionEventTap, - kCGHeadInsertEventTap, - kCGEventTapOptionListenOnly if ( - True - and not self.suppress - and self._intercept is None) - else kCGEventTapOptionDefault, - self._EVENTS, - self._handler, - None) - - @AbstractListener._emitter - def _handler(self, proxy, event_type, event, refcon): - """The callback registered with *macOS* for mouse events. - - This method will call the callbacks registered on initialisation. - """ - # An injected event will have a Unix process ID attached - is_injected = (CGEventGetIntegerValueField( - event, - kCGEventSourceUnixProcessID)) != 0 - - self._handle_message(proxy, event_type, event, refcon, is_injected) - if self._intercept is not None: - return self._intercept(event_type, event) - elif self.suppress: - return None - - def _handle_message(self, proxy, event_type, event, refcon): - """The device specific callback handler. - - This method calls the appropriate callback registered when this - listener was created based on the event. - """ - raise NotImplementedError() diff --git a/PortablePython/Lib/site-packages/pynput/_util/darwin_vks.py b/PortablePython/Lib/site-packages/pynput/_util/darwin_vks.py deleted file mode 100644 index 6499fb1..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/darwin_vks.py +++ /dev/null @@ -1,79 +0,0 @@ -# coding: utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . - -# pylint: disable=C0111,C0302 - -SYMBOLS = { - 0: 'a', - 1: 's', - 2: 'd', - 3: 'f', - 4: 'h', - 5: 'g', - 6: 'z', - 7: 'x', - 8: 'c', - 9: 'v', - 11: 'b', - 12: 'q', - 13: 'w', - 14: 'e', - 15: 'r', - 16: 'y', - 17: 't', - 18: '1', - 19: '2', - 20: '3', - 21: '4', - 22: '6', - 23: '5', - 24: '=', - 25: '9', - 26: '7', - 27: '-', - 28: '8', - 29: '0', - 30: ']', - 31: 'o', - 32: 'u', - 33: '[', - 34: 'i', - 35: 'p', - 37: 'l', - 38: 'j', - 39: '\'', - 40: 'k', - 41: ';', - 42: '\\', - 43: ',', - 44: '/', - 45: 'n', - 46: 'm', - 47: '.', - 49: ' ', - 50: '`', - 82: '0', - 83: '1', - 84: '2', - 85: '3', - 86: '4', - 87: '5', - 88: '6', - 89: '7', - 91: '8', - 92: '9', -} diff --git a/PortablePython/Lib/site-packages/pynput/_util/uinput.py b/PortablePython/Lib/site-packages/pynput/_util/uinput.py deleted file mode 100644 index b0a6a78..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/uinput.py +++ /dev/null @@ -1,99 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -Utility functions and classes for the *uinput* backend. -""" - -# pylint: disable=R0903 -# We implement stubs - -import evdev - - -# Check that we have permissions to continue -def _check(): - # TODO: Implement! - pass -_check() -del _check - - -class ListenerMixin(object): - """A mixin for *uinput* event listeners. - - Subclasses should set a value for :attr:`_EVENTS` and implement - :meth:`_handle_message`. - """ - #: The events for which to listen - _EVENTS = tuple() - - def __init__(self, *args, **kwargs): - super(ListenerMixin, self).__init__(*args, **kwargs) - self._dev = self._device(self._options.get( - 'device_paths', - evdev.list_devices())) - if self.suppress: - self._dev.grab() - - def _run(self): - for event in self._dev.read_loop(): - if event.type in self._EVENTS: - self._handle_message(event) - - def _stop_platform(self): - self._dev.close() - - def _device(self, paths): - """Attempts to load a readable keyboard device. - - :param paths: A list of paths. - - :return: a compatible device - """ - dev, count = None, 0 - for path in paths: - # Open the device - try: - next_dev = evdev.InputDevice(path) - except OSError: - continue - - # Does this device provide more handled event codes? - capabilities = next_dev.capabilities() - next_count = sum( - len(codes) - for event, codes in capabilities.items() - if event in self._EVENTS) - if next_count > count: - dev = next_dev - count = next_count - else: - next_dev.close() - - if dev is None: - raise OSError('no keyboard device available') - else: - return dev - - def _handle_message(self, event): - """Handles a single event. - - This method should call one of the registered event callbacks. - - :param event: The event. - """ - raise NotImplementedError() diff --git a/PortablePython/Lib/site-packages/pynput/_util/win32.py b/PortablePython/Lib/site-packages/pynput/_util/win32.py deleted file mode 100644 index b945a59..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/win32.py +++ /dev/null @@ -1,598 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -Utility functions and classes for the *win32* backend. -""" - -# pylint: disable=C0103 -# We want to make it obvious how structs are related - -# pylint: disable=R0903 -# This module contains a number of structs - -import contextlib -import ctypes -import itertools -import threading - -from ctypes import ( - windll, - wintypes) - -from . import AbstractListener, win32_vks as VK - - -# LPDWORD is not in ctypes.wintypes on Python 2 -if not hasattr(wintypes, 'LPDWORD'): - wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD) - - -class MOUSEINPUT(ctypes.Structure): - """Contains information about a simulated mouse event. - """ - MOVE = 0x0001 - LEFTDOWN = 0x0002 - LEFTUP = 0x0004 - RIGHTDOWN = 0x0008 - RIGHTUP = 0x0010 - MIDDLEDOWN = 0x0020 - MIDDLEUP = 0x0040 - XDOWN = 0x0080 - XUP = 0x0100 - WHEEL = 0x0800 - HWHEEL = 0x1000 - ABSOLUTE = 0x8000 - - XBUTTON1 = 0x0001 - XBUTTON2 = 0x0002 - - _fields_ = [ - ('dx', wintypes.LONG), - ('dy', wintypes.LONG), - ('mouseData', wintypes.DWORD), - ('dwFlags', wintypes.DWORD), - ('time', wintypes.DWORD), - ('dwExtraInfo', ctypes.c_void_p)] - - -class KEYBDINPUT(ctypes.Structure): - """Contains information about a simulated keyboard event. - """ - EXTENDEDKEY = 0x0001 - KEYUP = 0x0002 - SCANCODE = 0x0008 - UNICODE = 0x0004 - - _fields_ = [ - ('wVk', wintypes.WORD), - ('wScan', wintypes.WORD), - ('dwFlags', wintypes.DWORD), - ('time', wintypes.DWORD), - ('dwExtraInfo', ctypes.c_void_p)] - - -class HARDWAREINPUT(ctypes.Structure): - """Contains information about a simulated message generated by an input - device other than a keyboard or mouse. - """ - _fields_ = [ - ('uMsg', wintypes.DWORD), - ('wParamL', wintypes.WORD), - ('wParamH', wintypes.WORD)] - - -class INPUT_union(ctypes.Union): - """Represents the union of input types in :class:`INPUT`. - """ - _fields_ = [ - ('mi', MOUSEINPUT), - ('ki', KEYBDINPUT), - ('hi', HARDWAREINPUT)] - - -class INPUT(ctypes.Structure): - """Used by :attr:`SendInput` to store information for synthesizing input - events such as keystrokes, mouse movement, and mouse clicks. - """ - MOUSE = 0 - KEYBOARD = 1 - HARDWARE = 2 - - _fields_ = [ - ('type', wintypes.DWORD), - ('value', INPUT_union)] - - -LPINPUT = ctypes.POINTER(INPUT) - -VkKeyScan = windll.user32.VkKeyScanW -VkKeyScan.argtypes = ( - wintypes.WCHAR,) - -MapVirtualKey = windll.user32.MapVirtualKeyW -MapVirtualKey.argtypes = ( - wintypes.UINT, - wintypes.UINT) -MapVirtualKey.MAPVK_VK_TO_VSC = 0 - -SendInput = windll.user32.SendInput -SendInput.argtypes = ( - wintypes.UINT, - ctypes.c_voidp, # Really LPINPUT - ctypes.c_int) - -GetCurrentThreadId = windll.kernel32.GetCurrentThreadId -GetCurrentThreadId.restype = wintypes.DWORD - - -class MessageLoop(object): - """A class representing a message loop. - """ - #: The message that signals this loop to terminate - WM_STOP = 0x0401 - - _LPMSG = ctypes.POINTER(wintypes.MSG) - - _GetMessage = windll.user32.GetMessageW - _GetMessage.argtypes = ( - ctypes.c_voidp, # Really _LPMSG - wintypes.HWND, - wintypes.UINT, - wintypes.UINT) - _PeekMessage = windll.user32.PeekMessageW - _PeekMessage.argtypes = ( - ctypes.c_voidp, # Really _LPMSG - wintypes.HWND, - wintypes.UINT, - wintypes.UINT, - wintypes.UINT) - _PostThreadMessage = windll.user32.PostThreadMessageW - _PostThreadMessage.argtypes = ( - wintypes.DWORD, - wintypes.UINT, - wintypes.WPARAM, - wintypes.LPARAM) - - PM_NOREMOVE = 0 - - def __init__(self): - self._threadid = None - self._event = threading.Event() - self.thread = None - - def __iter__(self): - """Initialises the message loop and yields all messages until - :meth:`stop` is called. - - :raises AssertionError: if :meth:`start` has not been called - """ - assert self._threadid is not None - - try: - # Pump messages until WM_STOP - while True: - msg = wintypes.MSG() - lpmsg = ctypes.byref(msg) - r = self._GetMessage(lpmsg, None, 0, 0) - if r <= 0 or msg.message == self.WM_STOP: - break - else: - yield msg - - finally: - self._threadid = None - self.thread = None - - def start(self): - """Starts the message loop. - - This method must be called before iterating over messages, and it must - be called from the same thread. - """ - self._threadid = GetCurrentThreadId() - self.thread = threading.current_thread() - - # Create the message loop - msg = wintypes.MSG() - lpmsg = ctypes.byref(msg) - self._PeekMessage(lpmsg, None, 0x0400, 0x0400, self.PM_NOREMOVE) - - # Set the event to signal to other threads that the loop is created - self._event.set() - - def stop(self): - """Stops the message loop. - """ - self._event.wait() - if self._threadid: - self.post(self.WM_STOP, 0, 0) - - def post(self, msg, wparam, lparam): - """Posts a message to this message loop. - - :param ctypes.wintypes.UINT msg: The message. - - :param ctypes.wintypes.WPARAM wparam: The value of ``wParam``. - - :param ctypes.wintypes.LPARAM lparam: The value of ``lParam``. - """ - self._PostThreadMessage(self._threadid, msg, wparam, lparam) - - -class SystemHook(object): - """A class to handle Windows hooks. - """ - #: The hook action value for actions we should check - HC_ACTION = 0 - - _HOOKPROC = ctypes.WINFUNCTYPE( - wintypes.LPARAM, - ctypes.c_int32, wintypes.WPARAM, wintypes.LPARAM) - - _SetWindowsHookEx = windll.user32.SetWindowsHookExW - _SetWindowsHookEx.argtypes = ( - ctypes.c_int, - _HOOKPROC, - wintypes.HINSTANCE, - wintypes.DWORD) - _UnhookWindowsHookEx = windll.user32.UnhookWindowsHookEx - _UnhookWindowsHookEx.argtypes = ( - wintypes.HHOOK,) - _CallNextHookEx = windll.user32.CallNextHookEx - _CallNextHookEx.argtypes = ( - wintypes.HHOOK, - ctypes.c_int, - wintypes.WPARAM, - wintypes.LPARAM) - - #: The registered hook procedures - _HOOKS = {} - - class SuppressException(Exception): - """An exception raised by a hook callback to suppress further - propagation of events. - """ - pass - - def __init__(self, hook_id, on_hook=lambda code, msg, lpdata: None): - self.hook_id = hook_id - self.on_hook = on_hook - self._hook = None - - def __enter__(self): - key = threading.current_thread().ident - assert key not in self._HOOKS - - # Add ourself to lookup table and install the hook - self._HOOKS[key] = self - self._hook = self._SetWindowsHookEx( - self.hook_id, - self._handler, - None, - 0) - - return self - - def __exit__(self, exc_type, value, traceback): - key = threading.current_thread().ident - assert key in self._HOOKS - - if self._hook is not None: - # Uninstall the hook and remove ourself from lookup table - self._UnhookWindowsHookEx(self._hook) - del self._HOOKS[key] - - @staticmethod - @_HOOKPROC - def _handler(code, msg, lpdata): - key = threading.current_thread().ident - self = SystemHook._HOOKS.get(key, None) - if self: - # pylint: disable=W0702; we want to silence errors - try: - self.on_hook(code, msg, lpdata) - except self.SuppressException: - # Return non-zero to stop event propagation - return 1 - except: - # Ignore any errors - pass - # pylint: enable=W0702 - return SystemHook._CallNextHookEx(0, code, msg, lpdata) - - -class ListenerMixin(object): - """A mixin for *win32* event listeners. - - Subclasses should set a value for :attr:`_EVENTS` and implement - :meth:`_handle_message`. - - Subclasses must also be decorated with a decorator compatible with - :meth:`pynput._util.NotifierMixin._receiver` or implement the method - ``_receive()``. - """ - #: The Windows hook ID for the events to capture. - _EVENTS = None - - #: The window message used to signal that an even should be handled. - _WM_PROCESS = 0x410 - - #: Additional window messages to propagate to the subclass handler. - _WM_NOTIFICATIONS = [] - - def suppress_event(self): - """Causes the currently filtered event to be suppressed. - - This has a system wide effect and will generally result in no - applications receiving the event. - - This method will raise an undefined exception. - """ - raise SystemHook.SuppressException() - - def _run(self): - self._message_loop = MessageLoop() - with self._receive(): - self._mark_ready() - self._message_loop.start() - - # pylint: disable=W0702; we want to silence errors - try: - with SystemHook(self._EVENTS, self._handler): - # Just pump messages - for msg in self._message_loop: - if not self.running: - break - if msg.message == self._WM_PROCESS: - self._process(msg.wParam, msg.lParam) - elif msg.message in self._WM_NOTIFICATIONS: - self._on_notification( - msg.message, msg.wParam, msg.lParam) - except: - # This exception will have been passed to the main thread - pass - # pylint: enable=W0702 - - def _stop_platform(self): - try: - self._message_loop.stop() - except AttributeError: - # The loop may not have been created - pass - - @AbstractListener._emitter - def _handler(self, code, msg, lpdata): - """The callback registered with *Windows* for events. - - This method will post the message :attr:`_WM_PROCESS` to the message - loop started with this listener using :meth:`MessageLoop.post`. The - parameters are retrieved with a call to :meth:`_handle`. - """ - try: - converted = self._convert(code, msg, lpdata) - if converted is not None: - self._message_loop.post(self._WM_PROCESS, *converted) - except NotImplementedError: - self._handle_message(code, msg, lpdata) - - if self.suppress: - self.suppress_event() - - def _convert(self, code, msg, lpdata): - """The device specific callback handler. - - This method converts a low-level message and data to a - ``WPARAM`` / ``LPARAM`` pair. - """ - raise NotImplementedError() - - def _process(self, wparam, lparam): - """The device specific callback handler. - - This method performs the actual dispatching of events. - """ - raise NotImplementedError() - - def _handle_message(self, code, msg, lpdata): - """The device specific callback handler. - - This method calls the appropriate callback registered when this - listener was created based on the event. - - This method is only called if :meth:`_convert` is not implemented. - """ - raise NotImplementedError() - - def _on_notification(self, code, wparam, lparam): - """An additional notification handler. - - This method will be called for every message in - :attr:`_WM_NOTIFICATIONS`. - """ - raise NotImplementedError() - - -class KeyTranslator(object): - """A class to translate virtual key codes to characters. - """ - _GetAsyncKeyState = ctypes.windll.user32.GetAsyncKeyState - _GetAsyncKeyState.argtypes = ( - ctypes.c_int,) - _GetKeyboardLayout = ctypes.windll.user32.GetKeyboardLayout - _GetKeyboardLayout.argtypes = ( - wintypes.DWORD,) - _GetKeyboardState = ctypes.windll.user32.GetKeyboardState - _GetKeyboardState.argtypes = ( - ctypes.c_voidp,) - _GetKeyState = ctypes.windll.user32.GetAsyncKeyState - _GetKeyState.argtypes = ( - ctypes.c_int,) - _MapVirtualKeyEx = ctypes.windll.user32.MapVirtualKeyExW - _MapVirtualKeyEx.argtypes = ( - wintypes.UINT, - wintypes.UINT, - wintypes.HKL) - _ToUnicodeEx = ctypes.windll.user32.ToUnicodeEx - _ToUnicodeEx.argtypes = ( - wintypes.UINT, - wintypes.UINT, - ctypes.c_voidp, - ctypes.c_voidp, - ctypes.c_int, - wintypes.UINT, - wintypes.HKL) - - _MAPVK_VK_TO_VSC = 0 - _MAPVK_VSC_TO_VK = 1 - _MAPVK_VK_TO_CHAR = 2 - - def __init__(self): - self.update_layout() - - def __call__(self, vk, is_press): - """Converts a virtual key code to a string. - - :param int vk: The virtual key code. - - :param bool is_press: Whether this is a press. - - :return: parameters suitable for the :class:`pynput.keyboard.KeyCode` - constructor - - :raises OSError: if a call to any *win32* function fails - """ - # Get a string representation of the key - layout_data = self._layout_data[self._modifier_state()] - scan = self._to_scan(vk, self._layout) - character, is_dead = layout_data[scan] - - return { - 'char': character, - 'is_dead': is_dead, - 'vk': vk, - '_scan': scan} - - def update_layout(self): - """Updates the cached layout data. - """ - self._layout, self._layout_data = self._generate_layout() - - def char_from_scan(self, scan): - """Translates a scan code to a character, if possible. - - :param int scan: The scan code to translate. - - :return: maybe a character - :rtype: str or None - """ - return self._layout_data[(False, False, False)][scan][0] - - def _generate_layout(self): - """Generates the keyboard layout. - - This method will call ``ToUnicodeEx``, which modifies kernel buffers, - so it must *not* be called from the keyboard hook. - - The return value is the tuple ``(layout_handle, layout_data)``, where - ``layout_data`` is a mapping from the tuple ``(shift, ctrl, alt)`` to - an array indexed by scan code containing the data - ``(character, is_dead)``, and ``layout_handle`` is the handle of the - layout. - - :return: a composite layout - """ - layout_data = {} - - state = (ctypes.c_ubyte * 255)() - with self._thread_input() as active_thread: - layout = self._GetKeyboardLayout(active_thread) - vks = [ - self._to_vk(scan, layout) - for scan in range(len(state))] - - for shift, ctrl, alt in itertools.product( - (False, True), (False, True), (False, True)): - current = [(None, False)] * len(state) - layout_data[(shift, ctrl, alt)] = current - - # Update the keyboard state based on the modifier state - state[VK.SHIFT] = 0x80 if shift else 0x00 - state[VK.CONTROL] = 0x80 if ctrl else 0x00 - state[VK.MENU] = 0x80 if alt else 0x00 - - # For each virtual key code... - out = (ctypes.wintypes.WCHAR * 5)() - for (scan, vk) in enumerate(vks): - # ...translate it to a unicode character - count = self._ToUnicodeEx( - vk, scan, ctypes.byref(state), ctypes.byref(out), - len(out), 0, layout) - - # Cache the result if a key is mapped - if count != 0: - character = out[0] - is_dead = count < 0 - current[scan] = (character, is_dead) - - # If the key is dead, flush the keyboard state - if is_dead: - self._ToUnicodeEx( - vk, scan, ctypes.byref(state), - ctypes.byref(out), len(out), 0, layout) - - return (layout, layout_data) - - def _to_scan(self, vk, layout): - """Retrieves the scan code for a virtual key code. - - :param int vk: The virtual key code. - - :param layout: The keyboard layout. - - :return: the scan code - """ - return self._MapVirtualKeyEx( - vk, self._MAPVK_VK_TO_VSC, layout) - - def _to_vk(self, scan, layout): - """Retrieves the virtual key code for a scan code. - - :param int vscan: The scan code. - - :param layout: The keyboard layout. - - :return: the virtual key code - """ - return self._MapVirtualKeyEx( - scan, self._MAPVK_VSC_TO_VK, layout) - - def _modifier_state(self): - """Returns a key into :attr:`_layout_data` for the current modifier - state. - - :return: the current modifier state - """ - shift = bool(self._GetAsyncKeyState(VK.SHIFT) & 0x8000) - ctrl = bool(self._GetAsyncKeyState(VK.CONTROL) & 0x8000) - alt = bool(self._GetAsyncKeyState(VK.MENU) & 0x8000) - return (shift, ctrl, alt) - - @contextlib.contextmanager - def _thread_input(self): - """Yields the current thread ID. - """ - yield GetCurrentThreadId() diff --git a/PortablePython/Lib/site-packages/pynput/_util/win32_vks.py b/PortablePython/Lib/site-packages/pynput/_util/win32_vks.py deleted file mode 100644 index 7b30238..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/win32_vks.py +++ /dev/null @@ -1,179 +0,0 @@ -# coding: utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . - -# pylint: disable=C0111,C0302 - -LBUTTON = 1 -RBUTTON = 2 -CANCEL = 3 -MBUTTON = 4 -XBUTTON1 = 5 -XBUTTON2 = 6 -BACK = 8 -TAB = 9 -CLEAR = 12 -RETURN = 13 -SHIFT = 16 -CONTROL = 17 -MENU = 18 -PAUSE = 19 -CAPITAL = 20 -KANA = 21 -HANGEUL = 21 -HANGUL = 21 -JUNJA = 23 -FINAL = 24 -HANJA = 25 -KANJI = 25 -ESCAPE = 27 -CONVERT = 28 -NONCONVERT = 29 -ACCEPT = 30 -MODECHANGE = 31 -SPACE = 32 -PRIOR = 33 -NEXT = 34 -END = 35 -HOME = 36 -LEFT = 37 -UP = 38 -RIGHT = 39 -DOWN = 40 -SELECT = 41 -PRINT = 42 -EXECUTE = 43 -SNAPSHOT = 44 -INSERT = 45 -DELETE = 46 -HELP = 47 -LWIN = 91 -RWIN = 92 -APPS = 93 -SLEEP = 95 -NUMPAD0 = 96 -NUMPAD1 = 97 -NUMPAD2 = 98 -NUMPAD3 = 99 -NUMPAD4 = 100 -NUMPAD5 = 101 -NUMPAD6 = 102 -NUMPAD7 = 103 -NUMPAD8 = 104 -NUMPAD9 = 105 -MULTIPLY = 106 -ADD = 107 -SEPARATOR = 108 -SUBTRACT = 109 -DECIMAL = 110 -DIVIDE = 111 -F1 = 112 -F2 = 113 -F3 = 114 -F4 = 115 -F5 = 116 -F6 = 117 -F7 = 118 -F8 = 119 -F9 = 120 -F10 = 121 -F11 = 122 -F12 = 123 -F13 = 124 -F14 = 125 -F15 = 126 -F16 = 127 -F17 = 128 -F18 = 129 -F19 = 130 -F20 = 131 -F21 = 132 -F22 = 133 -F23 = 134 -F24 = 135 -NUMLOCK = 144 -SCROLL = 145 -OEM_NEC_EQUAL = 146 -OEM_FJ_JISHO = 146 -OEM_FJ_MASSHOU = 147 -OEM_FJ_TOUROKU = 148 -OEM_FJ_LOYA = 149 -OEM_FJ_ROYA = 150 -LSHIFT = 160 -RSHIFT = 161 -LCONTROL = 162 -RCONTROL = 163 -LMENU = 164 -RMENU = 165 -BROWSER_BACK = 166 -BROWSER_FORWARD = 167 -BROWSER_REFRESH = 168 -BROWSER_STOP = 169 -BROWSER_SEARCH = 170 -BROWSER_FAVORITES = 171 -BROWSER_HOME = 172 -VOLUME_MUTE = 173 -VOLUME_DOWN = 174 -VOLUME_UP = 175 -MEDIA_NEXT_TRACK = 176 -MEDIA_PREV_TRACK = 177 -MEDIA_STOP = 178 -MEDIA_PLAY_PAUSE = 179 -LAUNCH_MAIL = 180 -LAUNCH_MEDIA_SELECT = 181 -LAUNCH_APP1 = 182 -LAUNCH_APP2 = 183 -OEM_1 = 186 -OEM_PLUS = 187 -OEM_COMMA = 188 -OEM_MINUS = 189 -OEM_PERIOD = 190 -OEM_2 = 191 -OEM_3 = 192 -OEM_4 = 219 -OEM_5 = 220 -OEM_6 = 221 -OEM_7 = 222 -OEM_8 = 223 -OEM_AX = 225 -OEM_102 = 226 -ICO_HELP = 227 -ICO_00 = 228 -PROCESSKEY = 229 -ICO_CLEAR = 230 -PACKET = 231 -OEM_RESET = 233 -OEM_JUMP = 234 -OEM_PA1 = 235 -OEM_PA2 = 236 -OEM_PA3 = 237 -OEM_WSCTRL = 238 -OEM_CUSEL = 239 -OEM_ATTN = 240 -OEM_FINISH = 241 -OEM_COPY = 242 -OEM_AUTO = 243 -OEM_ENLW = 244 -OEM_BACKTAB = 245 -ATTN = 246 -CRSEL = 247 -EXSEL = 248 -EREOF = 249 -PLAY = 250 -ZOOM = 251 -NONAME = 252 -PA1 = 253 -OEM_CLEAR = 254 diff --git a/PortablePython/Lib/site-packages/pynput/_util/xorg.py b/PortablePython/Lib/site-packages/pynput/_util/xorg.py deleted file mode 100644 index 52995f3..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/xorg.py +++ /dev/null @@ -1,496 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -Utility functions and classes for the *Xorg* backend. -""" - -# pylint: disable=R0903 -# We implement stubs - -import contextlib -import functools -import itertools -import operator -import Xlib.display -import Xlib.keysymdef -import Xlib.threaded -import Xlib.XK - -from . import AbstractListener -from .xorg_keysyms import SYMBOLS - - -# Create a display to verify that we have an X connection -def _check_and_initialize(): - display = Xlib.display.Display() - display.close() - - for group in Xlib.keysymdef.__all__: - Xlib.XK.load_keysym_group(group) -_check_and_initialize() -del _check_and_initialize - - -class X11Error(Exception): - """An error that is thrown at the end of a code block managed by a - :func:`display_manager` if an *X11* error occurred. - """ - pass - - -@contextlib.contextmanager -def display_manager(display): - """Traps *X* errors and raises an :class:``X11Error`` at the end if any - error occurred. - - This handler also ensures that the :class:`Xlib.display.Display` being - managed is sync'd. - - :param Xlib.display.Display display: The *X* display. - - :return: the display - :rtype: Xlib.display.Display - """ - errors = [] - - def handler(*args): - """The *Xlib* error handler. - """ - errors.append(args) - - old_handler = display.set_error_handler(handler) - try: - yield display - display.sync() - finally: - display.set_error_handler(old_handler) - if errors: - raise X11Error(errors) - - -def _find_mask(display, symbol): - """Returns the mode flags to use for a modifier symbol. - - :param Xlib.display.Display display: The *X* display. - - :param str symbol: The name of the symbol. - - :return: the modifier mask - """ - # Get the key code for the symbol - modifier_keycode = display.keysym_to_keycode( - Xlib.XK.string_to_keysym(symbol)) - - for index, keycodes in enumerate(display.get_modifier_mapping()): - for keycode in keycodes: - if keycode == modifier_keycode: - return 1 << index - - return 0 - - -def alt_mask(display): - """Returns the *alt* mask flags. - - The first time this function is called for a display, the value is cached. - Subsequent calls will return the cached value. - - :param Xlib.display.Display display: The *X* display. - - :return: the modifier mask - """ - if not hasattr(display, '__alt_mask'): - display.__alt_mask = _find_mask(display, 'Alt_L') - return display.__alt_mask - - -def alt_gr_mask(display): - """Returns the *alt* mask flags. - - The first time this function is called for a display, the value is cached. - Subsequent calls will return the cached value. - - :param Xlib.display.Display display: The *X* display. - - :return: the modifier mask - """ - if not hasattr(display, '__altgr_mask'): - display.__altgr_mask = _find_mask(display, 'Mode_switch') - return display.__altgr_mask - - -def numlock_mask(display): - """Returns the *numlock* mask flags. - - The first time this function is called for a display, the value is cached. - Subsequent calls will return the cached value. - - :param Xlib.display.Display display: The *X* display. - - :return: the modifier mask - """ - if not hasattr(display, '__numlock_mask'): - display.__numlock_mask = _find_mask(display, 'Num_Lock') - return display.__numlock_mask - - -def keysym_is_latin_upper(keysym): - """Determines whether a *keysym* is an upper case *latin* character. - - This is true only if ``XK_A`` <= ``keysym`` <= ` XK_Z``. - - :param in keysym: The *keysym* to check. - """ - return Xlib.XK.XK_A <= keysym <= Xlib.XK.XK_Z - - -def keysym_is_latin_lower(keysym): - """Determines whether a *keysym* is a lower case *latin* character. - - This is true only if ``XK_a`` <= ``keysym`` <= ` XK_z``. - - :param in keysym: The *keysym* to check. - """ - return Xlib.XK.XK_a <= keysym <= Xlib.XK.XK_z - - -def keysym_group(ks1, ks2): - """Generates a group from two *keysyms*. - - The implementation of this function comes from: - - Within each group, if the second element of the group is ``NoSymbol``, - then the group should be treated as if the second element were the same - as the first element, except when the first element is an alphabetic - *KeySym* ``K`` for which both lowercase and uppercase forms are - defined. - - In that case, the group should be treated as if the first element were - the lowercase form of ``K`` and the second element were the uppercase - form of ``K``. - - This function assumes that *alphabetic* means *latin*; this assumption - appears to be consistent with observations of the return values from - ``XGetKeyboardMapping``. - - :param ks1: The first *keysym*. - - :param ks2: The second *keysym*. - - :return: a tuple conforming to the description above - """ - if ks2 == Xlib.XK.NoSymbol: - if keysym_is_latin_upper(ks1): - return (Xlib.XK.XK_a + ks1 - Xlib.XK.XK_A, ks1) - elif keysym_is_latin_lower(ks1): - return (ks1, Xlib.XK.XK_A + ks1 - Xlib.XK.XK_a) - else: - return (ks1, ks1) - else: - return (ks1, ks2) - - -def keysym_normalize(keysym): - """Normalises a list of *keysyms*. - - The implementation of this function comes from: - - If the list (ignoring trailing ``NoSymbol`` entries) is a single - *KeySym* ``K``, then the list is treated as if it were the list - ``K NoSymbol K NoSymbol``. - - If the list (ignoring trailing ``NoSymbol`` entries) is a pair of - *KeySyms* ``K1 K2``, then the list is treated as if it were the list - ``K1 K2 K1 K2``. - - If the list (ignoring trailing ``NoSymbol`` entries) is a triple of - *KeySyms* ``K1 K2 K3``, then the list is treated as if it were the list - ``K1 K2 K3 NoSymbol``. - - This function will also group the *keysyms* using :func:`keysym_group`. - - :param keysyms: A list of keysyms. - - :return: the tuple ``(group_1, group_2)`` or ``None`` - """ - # Remove trailing NoSymbol - stripped = list(reversed(list( - itertools.dropwhile( - lambda n: n == Xlib.XK.NoSymbol, - reversed(keysym))))) - - if not stripped: - return - - elif len(stripped) == 1: - return ( - keysym_group(stripped[0], Xlib.XK.NoSymbol), - keysym_group(stripped[0], Xlib.XK.NoSymbol)) - - elif len(stripped) == 2: - return ( - keysym_group(stripped[0], stripped[1]), - keysym_group(stripped[0], stripped[1])) - - elif len(stripped) == 3: - return ( - keysym_group(stripped[0], stripped[1]), - keysym_group(stripped[2], Xlib.XK.NoSymbol)) - - elif len(stripped) >= 6: - # TODO: Find out why this is necessary; using only the documented - # behaviour may lead to only a US layout being used? - return ( - keysym_group(stripped[0], stripped[1]), - keysym_group(stripped[4], stripped[5])) - - else: - return ( - keysym_group(stripped[0], stripped[1]), - keysym_group(stripped[2], stripped[3])) - - -def index_to_shift(display, index): - """Converts an index in a *key code* list to the corresponding shift state. - - :param Xlib.display.Display display: The display for which to retrieve the - shift mask. - - :param int index: The keyboard mapping *key code* index. - - :return: a shift mask - """ - return ( - (1 << 0 if index & 1 else 0) | - (alt_gr_mask(display) if index & 2 else 0)) - - -def shift_to_index(display, shift): - """Converts an index in a *key code* list to the corresponding shift state. - - :param Xlib.display.Display display: The display for which to retrieve the - shift mask. - - :param int index: The keyboard mapping *key code* index. - - :return: a shift mask - """ - return ( - (1 if shift & 1 else 0) + - (2 if shift & alt_gr_mask(display) else 0)) - - -def keyboard_mapping(display): - """Generates a mapping from *keysyms* to *key codes* and required - modifier shift states. - - :param Xlib.display.Display display: The display for which to retrieve the - keyboard mapping. - - :return: the keyboard mapping - """ - mapping = {} - - shift_mask = 1 << 0 - group_mask = alt_gr_mask(display) - - # Iterate over all keysym lists in the keyboard mapping - min_keycode = display.display.info.min_keycode - keycode_count = display.display.info.max_keycode - min_keycode + 1 - for index, keysyms in enumerate(display.get_keyboard_mapping( - min_keycode, keycode_count)): - key_code = index + min_keycode - - # Normalise the keysym list to yield a tuple containing the two groups - normalized = keysym_normalize(keysyms) - if not normalized: - continue - - # Iterate over the groups to extract the shift and modifier state - for groups, group in zip(normalized, (False, True)): - for keysym, shift in zip(groups, (False, True)): - if not keysym: - continue - shift_state = 0 \ - | (shift_mask if shift else 0) \ - | (group_mask if group else 0) - - # Prefer already known lesser shift states - if keysym in mapping and mapping[keysym][1] < shift_state: - continue - mapping[keysym] = (key_code, shift_state) - - return mapping - - -def char_to_keysym(char): - """Converts a unicode character to a *keysym*. - - :param str char: The unicode character. - - :return: the corresponding *keysym*, or ``0`` if it cannot be found - """ - ordinal = ord(char) - if ordinal < 0x100: - return ordinal - else: - return ordinal | 0x01000000 - - -def symbol_to_keysym(symbol): - """Converts a symbol name to a *keysym*. - - :param str symbol: The name of the symbol. - - :return: the corresponding *keysym*, or ``0`` if it cannot be found - """ - # First try simple translation, the try a module attribute of - # Xlib.keysymdef.xkb and fall back on our pre-generated table - return (0 - or Xlib.XK.string_to_keysym(symbol) - or getattr(Xlib.keysymdef.xkb, "XK_" + symbol, 0) - or SYMBOLS.get(symbol, (0,))[0]) - - -class ListenerMixin(object): - """A mixin for *X* event listeners. - - Subclasses should set a value for :attr:`_EVENTS` and implement - :meth:`_handle_message`. - """ - #: The events for which to listen - _EVENTS = tuple() - - #: We use this instance for parsing the binary data - _EVENT_PARSER = Xlib.protocol.rq.EventField(None) - - def _run(self): - self._display_stop = Xlib.display.Display() - self._display_record = Xlib.display.Display() - self._stopped = False - with display_manager(self._display_record) as dm: - self._context = dm.record_create_context( - 0, - [Xlib.ext.record.AllClients], - [{ - 'core_requests': (0, 0), - 'core_replies': (0, 0), - 'ext_requests': (0, 0, 0, 0), - 'ext_replies': (0, 0, 0, 0), - 'delivered_events': (0, 0), - 'device_events': self._EVENTS, - 'errors': (0, 0), - 'client_started': False, - 'client_died': False}]) - - # pylint: disable=W0702; we want to silence errors - try: - self._initialize(self._display_stop) - self._mark_ready() - if self.suppress: - with display_manager(self._display_stop) as dm: - self._suppress_start(dm) - self._display_record.record_enable_context( - self._context, self._handler) - except: - # This exception will have been passed to the main thread - pass - finally: - if self.suppress: - with display_manager(self._display_stop) as dm: - self._suppress_stop(dm) - self._display_stop.record_disable_context(self._context) - self._display_stop.flush() - self._display_record.record_free_context(self._context) - self._display_stop.close() - self._display_record.close() - # pylint: enable=W0702 - - def _stop_platform(self): - if not hasattr(self, '_context'): - self.wait() - - # Do this asynchronously to avoid deadlocks - self._display_record.record_disable_context(self._context) - - def _suppress_start(self, display): - """Starts suppressing events. - - :param Xlib.display.Display display: The display for which to suppress - events. - """ - raise NotImplementedError() - - def _suppress_stop(self, display): - """Starts suppressing events. - - :param Xlib.display.Display display: The display for which to suppress - events. - """ - raise NotImplementedError() - - @property - def _event_mask(self): - """The event mask. - """ - return functools.reduce(operator.__or__, self._EVENTS, 0) - - @AbstractListener._emitter - def _handler(self, events): - """The callback registered with *X* for mouse events. - - This method will parse the response and call the callbacks registered - on initialisation. - - :param events: The events passed by *X*. This is a binary block - parsable by :attr:`_EVENT_PARSER`. - """ - if not self.running: - raise self.StopException() - - data = events.data - - while data and len(data): - event, data = self._EVENT_PARSER.parse_binary_value( - data, self._display_record.display, None, None) - - injected = event.send_event - self._handle_message(self._display_stop, event, injected) - - def _initialize(self, display): - """Initialises this listener. - - This method is called immediately before the event loop, from the - handler thread. - - :param display: The display being used. - """ - pass - - def _handle_message(self, display, event, injected): - """The device specific callback handler. - - This method calls the appropriate callback registered when this - listener was created based on the event. - - :param display: The display being used. - - :param event: The event. - - :param bool injected: Whether the event was injected. - """ - pass diff --git a/PortablePython/Lib/site-packages/pynput/_util/xorg_keysyms.py b/PortablePython/Lib/site-packages/pynput/_util/xorg_keysyms.py deleted file mode 100644 index 7505e89..0000000 --- a/PortablePython/Lib/site-packages/pynput/_util/xorg_keysyms.py +++ /dev/null @@ -1,1715 +0,0 @@ -# coding: utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . - -# pylint: disable=C0111,C0302 - -SYMBOLS = { - '0': (0x0030, u'\u0030'), - '1': (0x0031, u'\u0031'), - '2': (0x0032, u'\u0032'), - '3': (0x0033, u'\u0033'), - '4': (0x0034, u'\u0034'), - '5': (0x0035, u'\u0035'), - '6': (0x0036, u'\u0036'), - '7': (0x0037, u'\u0037'), - '8': (0x0038, u'\u0038'), - '9': (0x0039, u'\u0039'), - 'A': (0x0041, u'\u0041'), - 'AE': (0x00c6, u'\u00C6'), - 'Aacute': (0x00c1, u'\u00C1'), - 'Abelowdot': (0x1001ea0, u'\u1EA0'), - 'Abreve': (0x01c3, u'\u0102'), - 'Abreveacute': (0x1001eae, u'\u1EAE'), - 'Abrevebelowdot': (0x1001eb6, u'\u1EB6'), - 'Abrevegrave': (0x1001eb0, u'\u1EB0'), - 'Abrevehook': (0x1001eb2, u'\u1EB2'), - 'Abrevetilde': (0x1001eb4, u'\u1EB4'), - 'Acircumflex': (0x00c2, u'\u00C2'), - 'Acircumflexacute': (0x1001ea4, u'\u1EA4'), - 'Acircumflexbelowdot': (0x1001eac, u'\u1EAC'), - 'Acircumflexgrave': (0x1001ea6, u'\u1EA6'), - 'Acircumflexhook': (0x1001ea8, u'\u1EA8'), - 'Acircumflextilde': (0x1001eaa, u'\u1EAA'), - 'Adiaeresis': (0x00c4, u'\u00C4'), - 'Agrave': (0x00c0, u'\u00C0'), - 'Ahook': (0x1001ea2, u'\u1EA2'), - 'Amacron': (0x03c0, u'\u0100'), - 'Aogonek': (0x01a1, u'\u0104'), - 'Arabic_0': (0x1000660, u'\u0660'), - 'Arabic_1': (0x1000661, u'\u0661'), - 'Arabic_2': (0x1000662, u'\u0662'), - 'Arabic_3': (0x1000663, u'\u0663'), - 'Arabic_4': (0x1000664, u'\u0664'), - 'Arabic_5': (0x1000665, u'\u0665'), - 'Arabic_6': (0x1000666, u'\u0666'), - 'Arabic_7': (0x1000667, u'\u0667'), - 'Arabic_8': (0x1000668, u'\u0668'), - 'Arabic_9': (0x1000669, u'\u0669'), - 'Arabic_ain': (0x05d9, u'\u0639'), - 'Arabic_alef': (0x05c7, u'\u0627'), - 'Arabic_alefmaksura': (0x05e9, u'\u0649'), - 'Arabic_beh': (0x05c8, u'\u0628'), - 'Arabic_comma': (0x05ac, u'\u060C'), - 'Arabic_dad': (0x05d6, u'\u0636'), - 'Arabic_dal': (0x05cf, u'\u062F'), - 'Arabic_damma': (0x05ef, u'\u064F'), - 'Arabic_dammatan': (0x05ec, u'\u064C'), - 'Arabic_ddal': (0x1000688, u'\u0688'), - 'Arabic_farsi_yeh': (0x10006cc, u'\u06CC'), - 'Arabic_fatha': (0x05ee, u'\u064E'), - 'Arabic_fathatan': (0x05eb, u'\u064B'), - 'Arabic_feh': (0x05e1, u'\u0641'), - 'Arabic_fullstop': (0x10006d4, u'\u06D4'), - 'Arabic_gaf': (0x10006af, u'\u06AF'), - 'Arabic_ghain': (0x05da, u'\u063A'), - 'Arabic_ha': (0x05e7, u'\u0647'), - 'Arabic_hah': (0x05cd, u'\u062D'), - 'Arabic_hamza': (0x05c1, u'\u0621'), - 'Arabic_hamza_above': (0x1000654, u'\u0654'), - 'Arabic_hamza_below': (0x1000655, u'\u0655'), - 'Arabic_hamzaonalef': (0x05c3, u'\u0623'), - 'Arabic_hamzaonwaw': (0x05c4, u'\u0624'), - 'Arabic_hamzaonyeh': (0x05c6, u'\u0626'), - 'Arabic_hamzaunderalef': (0x05c5, u'\u0625'), - 'Arabic_heh_doachashmee': (0x10006be, u'\u06BE'), - 'Arabic_heh_goal': (0x10006c1, u'\u06C1'), - 'Arabic_jeem': (0x05cc, u'\u062C'), - 'Arabic_jeh': (0x1000698, u'\u0698'), - 'Arabic_kaf': (0x05e3, u'\u0643'), - 'Arabic_kasra': (0x05f0, u'\u0650'), - 'Arabic_kasratan': (0x05ed, u'\u064D'), - 'Arabic_keheh': (0x10006a9, u'\u06A9'), - 'Arabic_khah': (0x05ce, u'\u062E'), - 'Arabic_lam': (0x05e4, u'\u0644'), - 'Arabic_madda_above': (0x1000653, u'\u0653'), - 'Arabic_maddaonalef': (0x05c2, u'\u0622'), - 'Arabic_meem': (0x05e5, u'\u0645'), - 'Arabic_noon': (0x05e6, u'\u0646'), - 'Arabic_noon_ghunna': (0x10006ba, u'\u06BA'), - 'Arabic_peh': (0x100067e, u'\u067E'), - 'Arabic_percent': (0x100066a, u'\u066A'), - 'Arabic_qaf': (0x05e2, u'\u0642'), - 'Arabic_question_mark': (0x05bf, u'\u061F'), - 'Arabic_ra': (0x05d1, u'\u0631'), - 'Arabic_rreh': (0x1000691, u'\u0691'), - 'Arabic_sad': (0x05d5, u'\u0635'), - 'Arabic_seen': (0x05d3, u'\u0633'), - 'Arabic_semicolon': (0x05bb, u'\u061B'), - 'Arabic_shadda': (0x05f1, u'\u0651'), - 'Arabic_sheen': (0x05d4, u'\u0634'), - 'Arabic_sukun': (0x05f2, u'\u0652'), - 'Arabic_superscript_alef': (0x1000670, u'\u0670'), - 'Arabic_tah': (0x05d7, u'\u0637'), - 'Arabic_tatweel': (0x05e0, u'\u0640'), - 'Arabic_tcheh': (0x1000686, u'\u0686'), - 'Arabic_teh': (0x05ca, u'\u062A'), - 'Arabic_tehmarbuta': (0x05c9, u'\u0629'), - 'Arabic_thal': (0x05d0, u'\u0630'), - 'Arabic_theh': (0x05cb, u'\u062B'), - 'Arabic_tteh': (0x1000679, u'\u0679'), - 'Arabic_veh': (0x10006a4, u'\u06A4'), - 'Arabic_waw': (0x05e8, u'\u0648'), - 'Arabic_yeh': (0x05ea, u'\u064A'), - 'Arabic_yeh_baree': (0x10006d2, u'\u06D2'), - 'Arabic_zah': (0x05d8, u'\u0638'), - 'Arabic_zain': (0x05d2, u'\u0632'), - 'Aring': (0x00c5, u'\u00C5'), - 'Armenian_AT': (0x1000538, u'\u0538'), - 'Armenian_AYB': (0x1000531, u'\u0531'), - 'Armenian_BEN': (0x1000532, u'\u0532'), - 'Armenian_CHA': (0x1000549, u'\u0549'), - 'Armenian_DA': (0x1000534, u'\u0534'), - 'Armenian_DZA': (0x1000541, u'\u0541'), - 'Armenian_E': (0x1000537, u'\u0537'), - 'Armenian_FE': (0x1000556, u'\u0556'), - 'Armenian_GHAT': (0x1000542, u'\u0542'), - 'Armenian_GIM': (0x1000533, u'\u0533'), - 'Armenian_HI': (0x1000545, u'\u0545'), - 'Armenian_HO': (0x1000540, u'\u0540'), - 'Armenian_INI': (0x100053b, u'\u053B'), - 'Armenian_JE': (0x100054b, u'\u054B'), - 'Armenian_KE': (0x1000554, u'\u0554'), - 'Armenian_KEN': (0x100053f, u'\u053F'), - 'Armenian_KHE': (0x100053d, u'\u053D'), - 'Armenian_LYUN': (0x100053c, u'\u053C'), - 'Armenian_MEN': (0x1000544, u'\u0544'), - 'Armenian_NU': (0x1000546, u'\u0546'), - 'Armenian_O': (0x1000555, u'\u0555'), - 'Armenian_PE': (0x100054a, u'\u054A'), - 'Armenian_PYUR': (0x1000553, u'\u0553'), - 'Armenian_RA': (0x100054c, u'\u054C'), - 'Armenian_RE': (0x1000550, u'\u0550'), - 'Armenian_SE': (0x100054d, u'\u054D'), - 'Armenian_SHA': (0x1000547, u'\u0547'), - 'Armenian_TCHE': (0x1000543, u'\u0543'), - 'Armenian_TO': (0x1000539, u'\u0539'), - 'Armenian_TSA': (0x100053e, u'\u053E'), - 'Armenian_TSO': (0x1000551, u'\u0551'), - 'Armenian_TYUN': (0x100054f, u'\u054F'), - 'Armenian_VEV': (0x100054e, u'\u054E'), - 'Armenian_VO': (0x1000548, u'\u0548'), - 'Armenian_VYUN': (0x1000552, u'\u0552'), - 'Armenian_YECH': (0x1000535, u'\u0535'), - 'Armenian_ZA': (0x1000536, u'\u0536'), - 'Armenian_ZHE': (0x100053a, u'\u053A'), - 'Armenian_accent': (0x100055b, u'\u055B'), - 'Armenian_amanak': (0x100055c, u'\u055C'), - 'Armenian_apostrophe': (0x100055a, u'\u055A'), - 'Armenian_at': (0x1000568, u'\u0568'), - 'Armenian_ayb': (0x1000561, u'\u0561'), - 'Armenian_ben': (0x1000562, u'\u0562'), - 'Armenian_but': (0x100055d, u'\u055D'), - 'Armenian_cha': (0x1000579, u'\u0579'), - 'Armenian_da': (0x1000564, u'\u0564'), - 'Armenian_dza': (0x1000571, u'\u0571'), - 'Armenian_e': (0x1000567, u'\u0567'), - 'Armenian_exclam': (0x100055c, u'\u055C'), - 'Armenian_fe': (0x1000586, u'\u0586'), - 'Armenian_full_stop': (0x1000589, u'\u0589'), - 'Armenian_ghat': (0x1000572, u'\u0572'), - 'Armenian_gim': (0x1000563, u'\u0563'), - 'Armenian_hi': (0x1000575, u'\u0575'), - 'Armenian_ho': (0x1000570, u'\u0570'), - 'Armenian_hyphen': (0x100058a, u'\u058A'), - 'Armenian_ini': (0x100056b, u'\u056B'), - 'Armenian_je': (0x100057b, u'\u057B'), - 'Armenian_ke': (0x1000584, u'\u0584'), - 'Armenian_ken': (0x100056f, u'\u056F'), - 'Armenian_khe': (0x100056d, u'\u056D'), - 'Armenian_ligature_ew': (0x1000587, u'\u0587'), - 'Armenian_lyun': (0x100056c, u'\u056C'), - 'Armenian_men': (0x1000574, u'\u0574'), - 'Armenian_nu': (0x1000576, u'\u0576'), - 'Armenian_o': (0x1000585, u'\u0585'), - 'Armenian_paruyk': (0x100055e, u'\u055E'), - 'Armenian_pe': (0x100057a, u'\u057A'), - 'Armenian_pyur': (0x1000583, u'\u0583'), - 'Armenian_question': (0x100055e, u'\u055E'), - 'Armenian_ra': (0x100057c, u'\u057C'), - 'Armenian_re': (0x1000580, u'\u0580'), - 'Armenian_se': (0x100057d, u'\u057D'), - 'Armenian_separation_mark': (0x100055d, u'\u055D'), - 'Armenian_sha': (0x1000577, u'\u0577'), - 'Armenian_shesht': (0x100055b, u'\u055B'), - 'Armenian_tche': (0x1000573, u'\u0573'), - 'Armenian_to': (0x1000569, u'\u0569'), - 'Armenian_tsa': (0x100056e, u'\u056E'), - 'Armenian_tso': (0x1000581, u'\u0581'), - 'Armenian_tyun': (0x100057f, u'\u057F'), - 'Armenian_verjaket': (0x1000589, u'\u0589'), - 'Armenian_vev': (0x100057e, u'\u057E'), - 'Armenian_vo': (0x1000578, u'\u0578'), - 'Armenian_vyun': (0x1000582, u'\u0582'), - 'Armenian_yech': (0x1000565, u'\u0565'), - 'Armenian_yentamna': (0x100058a, u'\u058A'), - 'Armenian_za': (0x1000566, u'\u0566'), - 'Armenian_zhe': (0x100056a, u'\u056A'), - 'Atilde': (0x00c3, u'\u00C3'), - 'B': (0x0042, u'\u0042'), - 'Babovedot': (0x1001e02, u'\u1E02'), - 'Byelorussian_SHORTU': (0x06be, u'\u040E'), - 'Byelorussian_shortu': (0x06ae, u'\u045E'), - 'C': (0x0043, u'\u0043'), - 'Cabovedot': (0x02c5, u'\u010A'), - 'Cacute': (0x01c6, u'\u0106'), - 'Ccaron': (0x01c8, u'\u010C'), - 'Ccedilla': (0x00c7, u'\u00C7'), - 'Ccircumflex': (0x02c6, u'\u0108'), - 'ColonSign': (0x10020a1, u'\u20A1'), - 'CruzeiroSign': (0x10020a2, u'\u20A2'), - 'Cyrillic_A': (0x06e1, u'\u0410'), - 'Cyrillic_BE': (0x06e2, u'\u0411'), - 'Cyrillic_CHE': (0x06fe, u'\u0427'), - 'Cyrillic_CHE_descender': (0x10004b6, u'\u04B6'), - 'Cyrillic_CHE_vertstroke': (0x10004b8, u'\u04B8'), - 'Cyrillic_DE': (0x06e4, u'\u0414'), - 'Cyrillic_DZHE': (0x06bf, u'\u040F'), - 'Cyrillic_E': (0x06fc, u'\u042D'), - 'Cyrillic_EF': (0x06e6, u'\u0424'), - 'Cyrillic_EL': (0x06ec, u'\u041B'), - 'Cyrillic_EM': (0x06ed, u'\u041C'), - 'Cyrillic_EN': (0x06ee, u'\u041D'), - 'Cyrillic_EN_descender': (0x10004a2, u'\u04A2'), - 'Cyrillic_ER': (0x06f2, u'\u0420'), - 'Cyrillic_ES': (0x06f3, u'\u0421'), - 'Cyrillic_GHE': (0x06e7, u'\u0413'), - 'Cyrillic_GHE_bar': (0x1000492, u'\u0492'), - 'Cyrillic_HA': (0x06e8, u'\u0425'), - 'Cyrillic_HARDSIGN': (0x06ff, u'\u042A'), - 'Cyrillic_HA_descender': (0x10004b2, u'\u04B2'), - 'Cyrillic_I': (0x06e9, u'\u0418'), - 'Cyrillic_IE': (0x06e5, u'\u0415'), - 'Cyrillic_IO': (0x06b3, u'\u0401'), - 'Cyrillic_I_macron': (0x10004e2, u'\u04E2'), - 'Cyrillic_JE': (0x06b8, u'\u0408'), - 'Cyrillic_KA': (0x06eb, u'\u041A'), - 'Cyrillic_KA_descender': (0x100049a, u'\u049A'), - 'Cyrillic_KA_vertstroke': (0x100049c, u'\u049C'), - 'Cyrillic_LJE': (0x06b9, u'\u0409'), - 'Cyrillic_NJE': (0x06ba, u'\u040A'), - 'Cyrillic_O': (0x06ef, u'\u041E'), - 'Cyrillic_O_bar': (0x10004e8, u'\u04E8'), - 'Cyrillic_PE': (0x06f0, u'\u041F'), - 'Cyrillic_SCHWA': (0x10004d8, u'\u04D8'), - 'Cyrillic_SHA': (0x06fb, u'\u0428'), - 'Cyrillic_SHCHA': (0x06fd, u'\u0429'), - 'Cyrillic_SHHA': (0x10004ba, u'\u04BA'), - 'Cyrillic_SHORTI': (0x06ea, u'\u0419'), - 'Cyrillic_SOFTSIGN': (0x06f8, u'\u042C'), - 'Cyrillic_TE': (0x06f4, u'\u0422'), - 'Cyrillic_TSE': (0x06e3, u'\u0426'), - 'Cyrillic_U': (0x06f5, u'\u0423'), - 'Cyrillic_U_macron': (0x10004ee, u'\u04EE'), - 'Cyrillic_U_straight': (0x10004ae, u'\u04AE'), - 'Cyrillic_U_straight_bar': (0x10004b0, u'\u04B0'), - 'Cyrillic_VE': (0x06f7, u'\u0412'), - 'Cyrillic_YA': (0x06f1, u'\u042F'), - 'Cyrillic_YERU': (0x06f9, u'\u042B'), - 'Cyrillic_YU': (0x06e0, u'\u042E'), - 'Cyrillic_ZE': (0x06fa, u'\u0417'), - 'Cyrillic_ZHE': (0x06f6, u'\u0416'), - 'Cyrillic_ZHE_descender': (0x1000496, u'\u0496'), - 'Cyrillic_a': (0x06c1, u'\u0430'), - 'Cyrillic_be': (0x06c2, u'\u0431'), - 'Cyrillic_che': (0x06de, u'\u0447'), - 'Cyrillic_che_descender': (0x10004b7, u'\u04B7'), - 'Cyrillic_che_vertstroke': (0x10004b9, u'\u04B9'), - 'Cyrillic_de': (0x06c4, u'\u0434'), - 'Cyrillic_dzhe': (0x06af, u'\u045F'), - 'Cyrillic_e': (0x06dc, u'\u044D'), - 'Cyrillic_ef': (0x06c6, u'\u0444'), - 'Cyrillic_el': (0x06cc, u'\u043B'), - 'Cyrillic_em': (0x06cd, u'\u043C'), - 'Cyrillic_en': (0x06ce, u'\u043D'), - 'Cyrillic_en_descender': (0x10004a3, u'\u04A3'), - 'Cyrillic_er': (0x06d2, u'\u0440'), - 'Cyrillic_es': (0x06d3, u'\u0441'), - 'Cyrillic_ghe': (0x06c7, u'\u0433'), - 'Cyrillic_ghe_bar': (0x1000493, u'\u0493'), - 'Cyrillic_ha': (0x06c8, u'\u0445'), - 'Cyrillic_ha_descender': (0x10004b3, u'\u04B3'), - 'Cyrillic_hardsign': (0x06df, u'\u044A'), - 'Cyrillic_i': (0x06c9, u'\u0438'), - 'Cyrillic_i_macron': (0x10004e3, u'\u04E3'), - 'Cyrillic_ie': (0x06c5, u'\u0435'), - 'Cyrillic_io': (0x06a3, u'\u0451'), - 'Cyrillic_je': (0x06a8, u'\u0458'), - 'Cyrillic_ka': (0x06cb, u'\u043A'), - 'Cyrillic_ka_descender': (0x100049b, u'\u049B'), - 'Cyrillic_ka_vertstroke': (0x100049d, u'\u049D'), - 'Cyrillic_lje': (0x06a9, u'\u0459'), - 'Cyrillic_nje': (0x06aa, u'\u045A'), - 'Cyrillic_o': (0x06cf, u'\u043E'), - 'Cyrillic_o_bar': (0x10004e9, u'\u04E9'), - 'Cyrillic_pe': (0x06d0, u'\u043F'), - 'Cyrillic_schwa': (0x10004d9, u'\u04D9'), - 'Cyrillic_sha': (0x06db, u'\u0448'), - 'Cyrillic_shcha': (0x06dd, u'\u0449'), - 'Cyrillic_shha': (0x10004bb, u'\u04BB'), - 'Cyrillic_shorti': (0x06ca, u'\u0439'), - 'Cyrillic_softsign': (0x06d8, u'\u044C'), - 'Cyrillic_te': (0x06d4, u'\u0442'), - 'Cyrillic_tse': (0x06c3, u'\u0446'), - 'Cyrillic_u': (0x06d5, u'\u0443'), - 'Cyrillic_u_macron': (0x10004ef, u'\u04EF'), - 'Cyrillic_u_straight': (0x10004af, u'\u04AF'), - 'Cyrillic_u_straight_bar': (0x10004b1, u'\u04B1'), - 'Cyrillic_ve': (0x06d7, u'\u0432'), - 'Cyrillic_ya': (0x06d1, u'\u044F'), - 'Cyrillic_yeru': (0x06d9, u'\u044B'), - 'Cyrillic_yu': (0x06c0, u'\u044E'), - 'Cyrillic_ze': (0x06da, u'\u0437'), - 'Cyrillic_zhe': (0x06d6, u'\u0436'), - 'Cyrillic_zhe_descender': (0x1000497, u'\u0497'), - 'D': (0x0044, u'\u0044'), - 'Dabovedot': (0x1001e0a, u'\u1E0A'), - 'Dcaron': (0x01cf, u'\u010E'), - 'DongSign': (0x10020ab, u'\u20AB'), - 'Dstroke': (0x01d0, u'\u0110'), - 'E': (0x0045, u'\u0045'), - 'ENG': (0x03bd, u'\u014A'), - 'ETH': (0x00d0, u'\u00D0'), - 'EZH': (0x10001b7, u'\u01B7'), - 'Eabovedot': (0x03cc, u'\u0116'), - 'Eacute': (0x00c9, u'\u00C9'), - 'Ebelowdot': (0x1001eb8, u'\u1EB8'), - 'Ecaron': (0x01cc, u'\u011A'), - 'Ecircumflex': (0x00ca, u'\u00CA'), - 'Ecircumflexacute': (0x1001ebe, u'\u1EBE'), - 'Ecircumflexbelowdot': (0x1001ec6, u'\u1EC6'), - 'Ecircumflexgrave': (0x1001ec0, u'\u1EC0'), - 'Ecircumflexhook': (0x1001ec2, u'\u1EC2'), - 'Ecircumflextilde': (0x1001ec4, u'\u1EC4'), - 'EcuSign': (0x10020a0, u'\u20A0'), - 'Ediaeresis': (0x00cb, u'\u00CB'), - 'Egrave': (0x00c8, u'\u00C8'), - 'Ehook': (0x1001eba, u'\u1EBA'), - 'Emacron': (0x03aa, u'\u0112'), - 'Eogonek': (0x01ca, u'\u0118'), - 'Etilde': (0x1001ebc, u'\u1EBC'), - 'EuroSign': (0x20ac, u'\u20AC'), - 'F': (0x0046, u'\u0046'), - 'FFrancSign': (0x10020a3, u'\u20A3'), - 'Fabovedot': (0x1001e1e, u'\u1E1E'), - 'Farsi_0': (0x10006f0, u'\u06F0'), - 'Farsi_1': (0x10006f1, u'\u06F1'), - 'Farsi_2': (0x10006f2, u'\u06F2'), - 'Farsi_3': (0x10006f3, u'\u06F3'), - 'Farsi_4': (0x10006f4, u'\u06F4'), - 'Farsi_5': (0x10006f5, u'\u06F5'), - 'Farsi_6': (0x10006f6, u'\u06F6'), - 'Farsi_7': (0x10006f7, u'\u06F7'), - 'Farsi_8': (0x10006f8, u'\u06F8'), - 'Farsi_9': (0x10006f9, u'\u06F9'), - 'Farsi_yeh': (0x10006cc, u'\u06CC'), - 'G': (0x0047, u'\u0047'), - 'Gabovedot': (0x02d5, u'\u0120'), - 'Gbreve': (0x02ab, u'\u011E'), - 'Gcaron': (0x10001e6, u'\u01E6'), - 'Gcedilla': (0x03ab, u'\u0122'), - 'Gcircumflex': (0x02d8, u'\u011C'), - 'Georgian_an': (0x10010d0, u'\u10D0'), - 'Georgian_ban': (0x10010d1, u'\u10D1'), - 'Georgian_can': (0x10010ea, u'\u10EA'), - 'Georgian_char': (0x10010ed, u'\u10ED'), - 'Georgian_chin': (0x10010e9, u'\u10E9'), - 'Georgian_cil': (0x10010ec, u'\u10EC'), - 'Georgian_don': (0x10010d3, u'\u10D3'), - 'Georgian_en': (0x10010d4, u'\u10D4'), - 'Georgian_fi': (0x10010f6, u'\u10F6'), - 'Georgian_gan': (0x10010d2, u'\u10D2'), - 'Georgian_ghan': (0x10010e6, u'\u10E6'), - 'Georgian_hae': (0x10010f0, u'\u10F0'), - 'Georgian_har': (0x10010f4, u'\u10F4'), - 'Georgian_he': (0x10010f1, u'\u10F1'), - 'Georgian_hie': (0x10010f2, u'\u10F2'), - 'Georgian_hoe': (0x10010f5, u'\u10F5'), - 'Georgian_in': (0x10010d8, u'\u10D8'), - 'Georgian_jhan': (0x10010ef, u'\u10EF'), - 'Georgian_jil': (0x10010eb, u'\u10EB'), - 'Georgian_kan': (0x10010d9, u'\u10D9'), - 'Georgian_khar': (0x10010e5, u'\u10E5'), - 'Georgian_las': (0x10010da, u'\u10DA'), - 'Georgian_man': (0x10010db, u'\u10DB'), - 'Georgian_nar': (0x10010dc, u'\u10DC'), - 'Georgian_on': (0x10010dd, u'\u10DD'), - 'Georgian_par': (0x10010de, u'\u10DE'), - 'Georgian_phar': (0x10010e4, u'\u10E4'), - 'Georgian_qar': (0x10010e7, u'\u10E7'), - 'Georgian_rae': (0x10010e0, u'\u10E0'), - 'Georgian_san': (0x10010e1, u'\u10E1'), - 'Georgian_shin': (0x10010e8, u'\u10E8'), - 'Georgian_tan': (0x10010d7, u'\u10D7'), - 'Georgian_tar': (0x10010e2, u'\u10E2'), - 'Georgian_un': (0x10010e3, u'\u10E3'), - 'Georgian_vin': (0x10010d5, u'\u10D5'), - 'Georgian_we': (0x10010f3, u'\u10F3'), - 'Georgian_xan': (0x10010ee, u'\u10EE'), - 'Georgian_zen': (0x10010d6, u'\u10D6'), - 'Georgian_zhar': (0x10010df, u'\u10DF'), - 'Greek_ALPHA': (0x07c1, u'\u0391'), - 'Greek_ALPHAaccent': (0x07a1, u'\u0386'), - 'Greek_BETA': (0x07c2, u'\u0392'), - 'Greek_CHI': (0x07d7, u'\u03A7'), - 'Greek_DELTA': (0x07c4, u'\u0394'), - 'Greek_EPSILON': (0x07c5, u'\u0395'), - 'Greek_EPSILONaccent': (0x07a2, u'\u0388'), - 'Greek_ETA': (0x07c7, u'\u0397'), - 'Greek_ETAaccent': (0x07a3, u'\u0389'), - 'Greek_GAMMA': (0x07c3, u'\u0393'), - 'Greek_IOTA': (0x07c9, u'\u0399'), - 'Greek_IOTAaccent': (0x07a4, u'\u038A'), - 'Greek_IOTAdieresis': (0x07a5, u'\u03AA'), - 'Greek_KAPPA': (0x07ca, u'\u039A'), - 'Greek_LAMBDA': (0x07cb, u'\u039B'), - 'Greek_LAMDA': (0x07cb, u'\u039B'), - 'Greek_MU': (0x07cc, u'\u039C'), - 'Greek_NU': (0x07cd, u'\u039D'), - 'Greek_OMEGA': (0x07d9, u'\u03A9'), - 'Greek_OMEGAaccent': (0x07ab, u'\u038F'), - 'Greek_OMICRON': (0x07cf, u'\u039F'), - 'Greek_OMICRONaccent': (0x07a7, u'\u038C'), - 'Greek_PHI': (0x07d6, u'\u03A6'), - 'Greek_PI': (0x07d0, u'\u03A0'), - 'Greek_PSI': (0x07d8, u'\u03A8'), - 'Greek_RHO': (0x07d1, u'\u03A1'), - 'Greek_SIGMA': (0x07d2, u'\u03A3'), - 'Greek_TAU': (0x07d4, u'\u03A4'), - 'Greek_THETA': (0x07c8, u'\u0398'), - 'Greek_UPSILON': (0x07d5, u'\u03A5'), - 'Greek_UPSILONaccent': (0x07a8, u'\u038E'), - 'Greek_UPSILONdieresis': (0x07a9, u'\u03AB'), - 'Greek_XI': (0x07ce, u'\u039E'), - 'Greek_ZETA': (0x07c6, u'\u0396'), - 'Greek_accentdieresis': (0x07ae, u'\u0385'), - 'Greek_alpha': (0x07e1, u'\u03B1'), - 'Greek_alphaaccent': (0x07b1, u'\u03AC'), - 'Greek_beta': (0x07e2, u'\u03B2'), - 'Greek_chi': (0x07f7, u'\u03C7'), - 'Greek_delta': (0x07e4, u'\u03B4'), - 'Greek_epsilon': (0x07e5, u'\u03B5'), - 'Greek_epsilonaccent': (0x07b2, u'\u03AD'), - 'Greek_eta': (0x07e7, u'\u03B7'), - 'Greek_etaaccent': (0x07b3, u'\u03AE'), - 'Greek_finalsmallsigma': (0x07f3, u'\u03C2'), - 'Greek_gamma': (0x07e3, u'\u03B3'), - 'Greek_horizbar': (0x07af, u'\u2015'), - 'Greek_iota': (0x07e9, u'\u03B9'), - 'Greek_iotaaccent': (0x07b4, u'\u03AF'), - 'Greek_iotaaccentdieresis': (0x07b6, u'\u0390'), - 'Greek_iotadieresis': (0x07b5, u'\u03CA'), - 'Greek_kappa': (0x07ea, u'\u03BA'), - 'Greek_lambda': (0x07eb, u'\u03BB'), - 'Greek_lamda': (0x07eb, u'\u03BB'), - 'Greek_mu': (0x07ec, u'\u03BC'), - 'Greek_nu': (0x07ed, u'\u03BD'), - 'Greek_omega': (0x07f9, u'\u03C9'), - 'Greek_omegaaccent': (0x07bb, u'\u03CE'), - 'Greek_omicron': (0x07ef, u'\u03BF'), - 'Greek_omicronaccent': (0x07b7, u'\u03CC'), - 'Greek_phi': (0x07f6, u'\u03C6'), - 'Greek_pi': (0x07f0, u'\u03C0'), - 'Greek_psi': (0x07f8, u'\u03C8'), - 'Greek_rho': (0x07f1, u'\u03C1'), - 'Greek_sigma': (0x07f2, u'\u03C3'), - 'Greek_tau': (0x07f4, u'\u03C4'), - 'Greek_theta': (0x07e8, u'\u03B8'), - 'Greek_upsilon': (0x07f5, u'\u03C5'), - 'Greek_upsilonaccent': (0x07b8, u'\u03CD'), - 'Greek_upsilonaccentdieresis': (0x07ba, u'\u03B0'), - 'Greek_upsilondieresis': (0x07b9, u'\u03CB'), - 'Greek_xi': (0x07ee, u'\u03BE'), - 'Greek_zeta': (0x07e6, u'\u03B6'), - 'H': (0x0048, u'\u0048'), - 'Hcircumflex': (0x02a6, u'\u0124'), - 'Hstroke': (0x02a1, u'\u0126'), - 'I': (0x0049, u'\u0049'), - 'Iabovedot': (0x02a9, u'\u0130'), - 'Iacute': (0x00cd, u'\u00CD'), - 'Ibelowdot': (0x1001eca, u'\u1ECA'), - 'Ibreve': (0x100012c, u'\u012C'), - 'Icircumflex': (0x00ce, u'\u00CE'), - 'Idiaeresis': (0x00cf, u'\u00CF'), - 'Igrave': (0x00cc, u'\u00CC'), - 'Ihook': (0x1001ec8, u'\u1EC8'), - 'Imacron': (0x03cf, u'\u012A'), - 'Iogonek': (0x03c7, u'\u012E'), - 'Itilde': (0x03a5, u'\u0128'), - 'J': (0x004a, u'\u004A'), - 'Jcircumflex': (0x02ac, u'\u0134'), - 'K': (0x004b, u'\u004B'), - 'KP_0': (0xffb0, None), - 'KP_1': (0xffb1, None), - 'KP_2': (0xffb2, None), - 'KP_3': (0xffb3, None), - 'KP_4': (0xffb4, None), - 'KP_5': (0xffb5, None), - 'KP_6': (0xffb6, None), - 'KP_7': (0xffb7, None), - 'KP_8': (0xffb8, None), - 'KP_9': (0xffb9, None), - 'KP_Add': (0xffab, None), - 'KP_Begin': (0xff9d, None), - 'KP_Decimal': (0xffae, None), - 'KP_Delete': (0xff9f, None), - 'KP_Divide': (0xffaf, None), - 'KP_Down': (0xff99, None), - 'KP_End': (0xff9c, None), - 'KP_Enter': (0xff8d, None), - 'KP_Equal': (0xffbd, None), - 'KP_F1': (0xff91, None), - 'KP_F2': (0xff92, None), - 'KP_F3': (0xff93, None), - 'KP_F4': (0xff94, None), - 'KP_Home': (0xff95, None), - 'KP_Insert': (0xff9e, None), - 'KP_Left': (0xff96, None), - 'KP_Multiply': (0xffaa, None), - 'KP_Next': (0xff9b, None), - 'KP_Page_Down': (0xff9b, None), - 'KP_Page_Up': (0xff9a, None), - 'KP_Prior': (0xff9a, None), - 'KP_Right': (0xff98, None), - 'KP_Separator': (0xffac, None), - 'KP_Space': (0xff80, None), - 'KP_Subtract': (0xffad, None), - 'KP_Tab': (0xff89, None), - 'KP_Up': (0xff97, None), - 'Kcedilla': (0x03d3, u'\u0136'), - 'L': (0x004c, u'\u004C'), - 'Lacute': (0x01c5, u'\u0139'), - 'Lbelowdot': (0x1001e36, u'\u1E36'), - 'Lcaron': (0x01a5, u'\u013D'), - 'Lcedilla': (0x03a6, u'\u013B'), - 'LiraSign': (0x10020a4, u'\u20A4'), - 'Lstroke': (0x01a3, u'\u0141'), - 'M': (0x004d, u'\u004D'), - 'Mabovedot': (0x1001e40, u'\u1E40'), - 'Macedonia_DSE': (0x06b5, u'\u0405'), - 'Macedonia_GJE': (0x06b2, u'\u0403'), - 'Macedonia_KJE': (0x06bc, u'\u040C'), - 'Macedonia_dse': (0x06a5, u'\u0455'), - 'Macedonia_gje': (0x06a2, u'\u0453'), - 'Macedonia_kje': (0x06ac, u'\u045C'), - 'MillSign': (0x10020a5, u'\u20A5'), - 'N': (0x004e, u'\u004E'), - 'Nacute': (0x01d1, u'\u0143'), - 'NairaSign': (0x10020a6, u'\u20A6'), - 'Ncaron': (0x01d2, u'\u0147'), - 'Ncedilla': (0x03d1, u'\u0145'), - 'NewSheqelSign': (0x10020aa, u'\u20AA'), - 'Ntilde': (0x00d1, u'\u00D1'), - 'O': (0x004f, u'\u004F'), - 'OE': (0x13bc, u'\u0152'), - 'Oacute': (0x00d3, u'\u00D3'), - 'Obarred': (0x100019f, u'\u019F'), - 'Obelowdot': (0x1001ecc, u'\u1ECC'), - 'Ocaron': (0x10001d1, u'\u01D2'), - 'Ocircumflex': (0x00d4, u'\u00D4'), - 'Ocircumflexacute': (0x1001ed0, u'\u1ED0'), - 'Ocircumflexbelowdot': (0x1001ed8, u'\u1ED8'), - 'Ocircumflexgrave': (0x1001ed2, u'\u1ED2'), - 'Ocircumflexhook': (0x1001ed4, u'\u1ED4'), - 'Ocircumflextilde': (0x1001ed6, u'\u1ED6'), - 'Odiaeresis': (0x00d6, u'\u00D6'), - 'Odoubleacute': (0x01d5, u'\u0150'), - 'Ograve': (0x00d2, u'\u00D2'), - 'Ohook': (0x1001ece, u'\u1ECE'), - 'Ohorn': (0x10001a0, u'\u01A0'), - 'Ohornacute': (0x1001eda, u'\u1EDA'), - 'Ohornbelowdot': (0x1001ee2, u'\u1EE2'), - 'Ohorngrave': (0x1001edc, u'\u1EDC'), - 'Ohornhook': (0x1001ede, u'\u1EDE'), - 'Ohorntilde': (0x1001ee0, u'\u1EE0'), - 'Omacron': (0x03d2, u'\u014C'), - 'Ooblique': (0x00d8, u'\u00D8'), - 'Oslash': (0x00d8, u'\u00D8'), - 'Otilde': (0x00d5, u'\u00D5'), - 'P': (0x0050, u'\u0050'), - 'Pabovedot': (0x1001e56, u'\u1E56'), - 'PesetaSign': (0x10020a7, u'\u20A7'), - 'Q': (0x0051, u'\u0051'), - 'R': (0x0052, u'\u0052'), - 'Racute': (0x01c0, u'\u0154'), - 'Rcaron': (0x01d8, u'\u0158'), - 'Rcedilla': (0x03a3, u'\u0156'), - 'RupeeSign': (0x10020a8, u'\u20A8'), - 'S': (0x0053, u'\u0053'), - 'SCHWA': (0x100018f, u'\u018F'), - 'Sabovedot': (0x1001e60, u'\u1E60'), - 'Sacute': (0x01a6, u'\u015A'), - 'Scaron': (0x01a9, u'\u0160'), - 'Scedilla': (0x01aa, u'\u015E'), - 'Scircumflex': (0x02de, u'\u015C'), - 'Serbian_DJE': (0x06b1, u'\u0402'), - 'Serbian_TSHE': (0x06bb, u'\u040B'), - 'Serbian_dje': (0x06a1, u'\u0452'), - 'Serbian_tshe': (0x06ab, u'\u045B'), - 'Sinh_a': (0x1000d85, u'\u0D85'), - 'Sinh_aa': (0x1000d86, u'\u0D86'), - 'Sinh_aa2': (0x1000dcf, u'\u0DCF'), - 'Sinh_ae': (0x1000d87, u'\u0D87'), - 'Sinh_ae2': (0x1000dd0, u'\u0DD0'), - 'Sinh_aee': (0x1000d88, u'\u0D88'), - 'Sinh_aee2': (0x1000dd1, u'\u0DD1'), - 'Sinh_ai': (0x1000d93, u'\u0D93'), - 'Sinh_ai2': (0x1000ddb, u'\u0DDB'), - 'Sinh_al': (0x1000dca, u'\u0DCA'), - 'Sinh_au': (0x1000d96, u'\u0D96'), - 'Sinh_au2': (0x1000dde, u'\u0DDE'), - 'Sinh_ba': (0x1000db6, u'\u0DB6'), - 'Sinh_bha': (0x1000db7, u'\u0DB7'), - 'Sinh_ca': (0x1000da0, u'\u0DA0'), - 'Sinh_cha': (0x1000da1, u'\u0DA1'), - 'Sinh_dda': (0x1000da9, u'\u0DA9'), - 'Sinh_ddha': (0x1000daa, u'\u0DAA'), - 'Sinh_dha': (0x1000daf, u'\u0DAF'), - 'Sinh_dhha': (0x1000db0, u'\u0DB0'), - 'Sinh_e': (0x1000d91, u'\u0D91'), - 'Sinh_e2': (0x1000dd9, u'\u0DD9'), - 'Sinh_ee': (0x1000d92, u'\u0D92'), - 'Sinh_ee2': (0x1000dda, u'\u0DDA'), - 'Sinh_fa': (0x1000dc6, u'\u0DC6'), - 'Sinh_ga': (0x1000d9c, u'\u0D9C'), - 'Sinh_gha': (0x1000d9d, u'\u0D9D'), - 'Sinh_h2': (0x1000d83, u'\u0D83'), - 'Sinh_ha': (0x1000dc4, u'\u0DC4'), - 'Sinh_i': (0x1000d89, u'\u0D89'), - 'Sinh_i2': (0x1000dd2, u'\u0DD2'), - 'Sinh_ii': (0x1000d8a, u'\u0D8A'), - 'Sinh_ii2': (0x1000dd3, u'\u0DD3'), - 'Sinh_ja': (0x1000da2, u'\u0DA2'), - 'Sinh_jha': (0x1000da3, u'\u0DA3'), - 'Sinh_jnya': (0x1000da5, u'\u0DA5'), - 'Sinh_ka': (0x1000d9a, u'\u0D9A'), - 'Sinh_kha': (0x1000d9b, u'\u0D9B'), - 'Sinh_kunddaliya': (0x1000df4, u'\u0DF4'), - 'Sinh_la': (0x1000dbd, u'\u0DBD'), - 'Sinh_lla': (0x1000dc5, u'\u0DC5'), - 'Sinh_lu': (0x1000d8f, u'\u0D8F'), - 'Sinh_lu2': (0x1000ddf, u'\u0DDF'), - 'Sinh_luu': (0x1000d90, u'\u0D90'), - 'Sinh_luu2': (0x1000df3, u'\u0DF3'), - 'Sinh_ma': (0x1000db8, u'\u0DB8'), - 'Sinh_mba': (0x1000db9, u'\u0DB9'), - 'Sinh_na': (0x1000db1, u'\u0DB1'), - 'Sinh_ndda': (0x1000dac, u'\u0DAC'), - 'Sinh_ndha': (0x1000db3, u'\u0DB3'), - 'Sinh_ng': (0x1000d82, u'\u0D82'), - 'Sinh_ng2': (0x1000d9e, u'\u0D9E'), - 'Sinh_nga': (0x1000d9f, u'\u0D9F'), - 'Sinh_nja': (0x1000da6, u'\u0DA6'), - 'Sinh_nna': (0x1000dab, u'\u0DAB'), - 'Sinh_nya': (0x1000da4, u'\u0DA4'), - 'Sinh_o': (0x1000d94, u'\u0D94'), - 'Sinh_o2': (0x1000ddc, u'\u0DDC'), - 'Sinh_oo': (0x1000d95, u'\u0D95'), - 'Sinh_oo2': (0x1000ddd, u'\u0DDD'), - 'Sinh_pa': (0x1000db4, u'\u0DB4'), - 'Sinh_pha': (0x1000db5, u'\u0DB5'), - 'Sinh_ra': (0x1000dbb, u'\u0DBB'), - 'Sinh_ri': (0x1000d8d, u'\u0D8D'), - 'Sinh_rii': (0x1000d8e, u'\u0D8E'), - 'Sinh_ru2': (0x1000dd8, u'\u0DD8'), - 'Sinh_ruu2': (0x1000df2, u'\u0DF2'), - 'Sinh_sa': (0x1000dc3, u'\u0DC3'), - 'Sinh_sha': (0x1000dc1, u'\u0DC1'), - 'Sinh_ssha': (0x1000dc2, u'\u0DC2'), - 'Sinh_tha': (0x1000dad, u'\u0DAD'), - 'Sinh_thha': (0x1000dae, u'\u0DAE'), - 'Sinh_tta': (0x1000da7, u'\u0DA7'), - 'Sinh_ttha': (0x1000da8, u'\u0DA8'), - 'Sinh_u': (0x1000d8b, u'\u0D8B'), - 'Sinh_u2': (0x1000dd4, u'\u0DD4'), - 'Sinh_uu': (0x1000d8c, u'\u0D8C'), - 'Sinh_uu2': (0x1000dd6, u'\u0DD6'), - 'Sinh_va': (0x1000dc0, u'\u0DC0'), - 'Sinh_ya': (0x1000dba, u'\u0DBA'), - 'T': (0x0054, u'\u0054'), - 'THORN': (0x00de, u'\u00DE'), - 'Tabovedot': (0x1001e6a, u'\u1E6A'), - 'Tcaron': (0x01ab, u'\u0164'), - 'Tcedilla': (0x01de, u'\u0162'), - 'Thai_baht': (0x0ddf, u'\u0E3F'), - 'Thai_bobaimai': (0x0dba, u'\u0E1A'), - 'Thai_chochan': (0x0da8, u'\u0E08'), - 'Thai_chochang': (0x0daa, u'\u0E0A'), - 'Thai_choching': (0x0da9, u'\u0E09'), - 'Thai_chochoe': (0x0dac, u'\u0E0C'), - 'Thai_dochada': (0x0dae, u'\u0E0E'), - 'Thai_dodek': (0x0db4, u'\u0E14'), - 'Thai_fofa': (0x0dbd, u'\u0E1D'), - 'Thai_fofan': (0x0dbf, u'\u0E1F'), - 'Thai_hohip': (0x0dcb, u'\u0E2B'), - 'Thai_honokhuk': (0x0dce, u'\u0E2E'), - 'Thai_khokhai': (0x0da2, u'\u0E02'), - 'Thai_khokhon': (0x0da5, u'\u0E05'), - 'Thai_khokhuat': (0x0da3, u'\u0E03'), - 'Thai_khokhwai': (0x0da4, u'\u0E04'), - 'Thai_khorakhang': (0x0da6, u'\u0E06'), - 'Thai_kokai': (0x0da1, u'\u0E01'), - 'Thai_lakkhangyao': (0x0de5, u'\u0E45'), - 'Thai_lekchet': (0x0df7, u'\u0E57'), - 'Thai_lekha': (0x0df5, u'\u0E55'), - 'Thai_lekhok': (0x0df6, u'\u0E56'), - 'Thai_lekkao': (0x0df9, u'\u0E59'), - 'Thai_leknung': (0x0df1, u'\u0E51'), - 'Thai_lekpaet': (0x0df8, u'\u0E58'), - 'Thai_leksam': (0x0df3, u'\u0E53'), - 'Thai_leksi': (0x0df4, u'\u0E54'), - 'Thai_leksong': (0x0df2, u'\u0E52'), - 'Thai_leksun': (0x0df0, u'\u0E50'), - 'Thai_lochula': (0x0dcc, u'\u0E2C'), - 'Thai_loling': (0x0dc5, u'\u0E25'), - 'Thai_lu': (0x0dc6, u'\u0E26'), - 'Thai_maichattawa': (0x0deb, u'\u0E4B'), - 'Thai_maiek': (0x0de8, u'\u0E48'), - 'Thai_maihanakat': (0x0dd1, u'\u0E31'), - 'Thai_maitaikhu': (0x0de7, u'\u0E47'), - 'Thai_maitho': (0x0de9, u'\u0E49'), - 'Thai_maitri': (0x0dea, u'\u0E4A'), - 'Thai_maiyamok': (0x0de6, u'\u0E46'), - 'Thai_moma': (0x0dc1, u'\u0E21'), - 'Thai_ngongu': (0x0da7, u'\u0E07'), - 'Thai_nikhahit': (0x0ded, u'\u0E4D'), - 'Thai_nonen': (0x0db3, u'\u0E13'), - 'Thai_nonu': (0x0db9, u'\u0E19'), - 'Thai_oang': (0x0dcd, u'\u0E2D'), - 'Thai_paiyannoi': (0x0dcf, u'\u0E2F'), - 'Thai_phinthu': (0x0dda, u'\u0E3A'), - 'Thai_phophan': (0x0dbe, u'\u0E1E'), - 'Thai_phophung': (0x0dbc, u'\u0E1C'), - 'Thai_phosamphao': (0x0dc0, u'\u0E20'), - 'Thai_popla': (0x0dbb, u'\u0E1B'), - 'Thai_rorua': (0x0dc3, u'\u0E23'), - 'Thai_ru': (0x0dc4, u'\u0E24'), - 'Thai_saraa': (0x0dd0, u'\u0E30'), - 'Thai_saraaa': (0x0dd2, u'\u0E32'), - 'Thai_saraae': (0x0de1, u'\u0E41'), - 'Thai_saraaimaimalai': (0x0de4, u'\u0E44'), - 'Thai_saraaimaimuan': (0x0de3, u'\u0E43'), - 'Thai_saraam': (0x0dd3, u'\u0E33'), - 'Thai_sarae': (0x0de0, u'\u0E40'), - 'Thai_sarai': (0x0dd4, u'\u0E34'), - 'Thai_saraii': (0x0dd5, u'\u0E35'), - 'Thai_sarao': (0x0de2, u'\u0E42'), - 'Thai_sarau': (0x0dd8, u'\u0E38'), - 'Thai_saraue': (0x0dd6, u'\u0E36'), - 'Thai_sarauee': (0x0dd7, u'\u0E37'), - 'Thai_sarauu': (0x0dd9, u'\u0E39'), - 'Thai_sorusi': (0x0dc9, u'\u0E29'), - 'Thai_sosala': (0x0dc8, u'\u0E28'), - 'Thai_soso': (0x0dab, u'\u0E0B'), - 'Thai_sosua': (0x0dca, u'\u0E2A'), - 'Thai_thanthakhat': (0x0dec, u'\u0E4C'), - 'Thai_thonangmontho': (0x0db1, u'\u0E11'), - 'Thai_thophuthao': (0x0db2, u'\u0E12'), - 'Thai_thothahan': (0x0db7, u'\u0E17'), - 'Thai_thothan': (0x0db0, u'\u0E10'), - 'Thai_thothong': (0x0db8, u'\u0E18'), - 'Thai_thothung': (0x0db6, u'\u0E16'), - 'Thai_topatak': (0x0daf, u'\u0E0F'), - 'Thai_totao': (0x0db5, u'\u0E15'), - 'Thai_wowaen': (0x0dc7, u'\u0E27'), - 'Thai_yoyak': (0x0dc2, u'\u0E22'), - 'Thai_yoying': (0x0dad, u'\u0E0D'), - 'Tslash': (0x03ac, u'\u0166'), - 'U': (0x0055, u'\u0055'), - 'Uacute': (0x00da, u'\u00DA'), - 'Ubelowdot': (0x1001ee4, u'\u1EE4'), - 'Ubreve': (0x02dd, u'\u016C'), - 'Ucircumflex': (0x00db, u'\u00DB'), - 'Udiaeresis': (0x00dc, u'\u00DC'), - 'Udoubleacute': (0x01db, u'\u0170'), - 'Ugrave': (0x00d9, u'\u00D9'), - 'Uhook': (0x1001ee6, u'\u1EE6'), - 'Uhorn': (0x10001af, u'\u01AF'), - 'Uhornacute': (0x1001ee8, u'\u1EE8'), - 'Uhornbelowdot': (0x1001ef0, u'\u1EF0'), - 'Uhorngrave': (0x1001eea, u'\u1EEA'), - 'Uhornhook': (0x1001eec, u'\u1EEC'), - 'Uhorntilde': (0x1001eee, u'\u1EEE'), - 'Ukrainian_GHE_WITH_UPTURN': (0x06bd, u'\u0490'), - 'Ukrainian_I': (0x06b6, u'\u0406'), - 'Ukrainian_IE': (0x06b4, u'\u0404'), - 'Ukrainian_YI': (0x06b7, u'\u0407'), - 'Ukrainian_ghe_with_upturn': (0x06ad, u'\u0491'), - 'Ukrainian_i': (0x06a6, u'\u0456'), - 'Ukrainian_ie': (0x06a4, u'\u0454'), - 'Ukrainian_yi': (0x06a7, u'\u0457'), - 'Umacron': (0x03de, u'\u016A'), - 'Uogonek': (0x03d9, u'\u0172'), - 'Uring': (0x01d9, u'\u016E'), - 'Utilde': (0x03dd, u'\u0168'), - 'V': (0x0056, u'\u0056'), - 'W': (0x0057, u'\u0057'), - 'Wacute': (0x1001e82, u'\u1E82'), - 'Wcircumflex': (0x1000174, u'\u0174'), - 'Wdiaeresis': (0x1001e84, u'\u1E84'), - 'Wgrave': (0x1001e80, u'\u1E80'), - 'WonSign': (0x10020a9, u'\u20A9'), - 'X': (0x0058, u'\u0058'), - 'Xabovedot': (0x1001e8a, u'\u1E8A'), - 'Y': (0x0059, u'\u0059'), - 'Yacute': (0x00dd, u'\u00DD'), - 'Ybelowdot': (0x1001ef4, u'\u1EF4'), - 'Ycircumflex': (0x1000176, u'\u0176'), - 'Ydiaeresis': (0x13be, u'\u0178'), - 'Ygrave': (0x1001ef2, u'\u1EF2'), - 'Yhook': (0x1001ef6, u'\u1EF6'), - 'Ytilde': (0x1001ef8, u'\u1EF8'), - 'Z': (0x005a, u'\u005A'), - 'Zabovedot': (0x01af, u'\u017B'), - 'Zacute': (0x01ac, u'\u0179'), - 'Zcaron': (0x01ae, u'\u017D'), - 'Zstroke': (0x10001b5, u'\u01B5'), - 'a': (0x0061, u'\u0061'), - 'aacute': (0x00e1, u'\u00E1'), - 'abelowdot': (0x1001ea1, u'\u1EA1'), - 'abovedot': (0x01ff, u'\u02D9'), - 'abreve': (0x01e3, u'\u0103'), - 'abreveacute': (0x1001eaf, u'\u1EAF'), - 'abrevebelowdot': (0x1001eb7, u'\u1EB7'), - 'abrevegrave': (0x1001eb1, u'\u1EB1'), - 'abrevehook': (0x1001eb3, u'\u1EB3'), - 'abrevetilde': (0x1001eb5, u'\u1EB5'), - 'acircumflex': (0x00e2, u'\u00E2'), - 'acircumflexacute': (0x1001ea5, u'\u1EA5'), - 'acircumflexbelowdot': (0x1001ead, u'\u1EAD'), - 'acircumflexgrave': (0x1001ea7, u'\u1EA7'), - 'acircumflexhook': (0x1001ea9, u'\u1EA9'), - 'acircumflextilde': (0x1001eab, u'\u1EAB'), - 'acute': (0x00b4, u'\u00B4'), - 'adiaeresis': (0x00e4, u'\u00E4'), - 'ae': (0x00e6, u'\u00E6'), - 'agrave': (0x00e0, u'\u00E0'), - 'ahook': (0x1001ea3, u'\u1EA3'), - 'amacron': (0x03e0, u'\u0101'), - 'ampersand': (0x0026, u'\u0026'), - 'aogonek': (0x01b1, u'\u0105'), - 'apostrophe': (0x0027, u'\u0027'), - 'approxeq': (0x1002248, u'\u2245'), - 'approximate': (0x08c8, u'\u223C'), - 'aring': (0x00e5, u'\u00E5'), - 'asciicircum': (0x005e, u'\u005E'), - 'asciitilde': (0x007e, u'\u007E'), - 'asterisk': (0x002a, u'\u002A'), - 'at': (0x0040, u'\u0040'), - 'atilde': (0x00e3, u'\u00E3'), - 'b': (0x0062, u'\u0062'), - 'babovedot': (0x1001e03, u'\u1E03'), - 'backslash': (0x005c, u'\u005C'), - 'ballotcross': (0x0af4, u'\u2717'), - 'bar': (0x007c, u'\u007C'), - 'because': (0x1002235, u'\u2235'), - 'botintegral': (0x08a5, u'\u2321'), - 'botleftparens': (0x08ac, u'\u239D'), - 'botleftsqbracket': (0x08a8, u'\u23A3'), - 'botrightparens': (0x08ae, u'\u23A0'), - 'botrightsqbracket': (0x08aa, u'\u23A6'), - 'bott': (0x09f6, u'\u2534'), - 'braceleft': (0x007b, u'\u007B'), - 'braceright': (0x007d, u'\u007D'), - 'bracketleft': (0x005b, u'\u005B'), - 'bracketright': (0x005d, u'\u005D'), - 'braille_blank': (0x1002800, u'\u2800'), - 'braille_dots_1': (0x1002801, u'\u2801'), - 'braille_dots_12': (0x1002803, u'\u2803'), - 'braille_dots_123': (0x1002807, u'\u2807'), - 'braille_dots_1234': (0x100280f, u'\u280f'), - 'braille_dots_12345': (0x100281f, u'\u281f'), - 'braille_dots_123456': (0x100283f, u'\u283f'), - 'braille_dots_1234567': (0x100287f, u'\u287f'), - 'braille_dots_12345678': (0x10028ff, u'\u28ff'), - 'braille_dots_1234568': (0x10028bf, u'\u28bf'), - 'braille_dots_123457': (0x100285f, u'\u285f'), - 'braille_dots_1234578': (0x10028df, u'\u28df'), - 'braille_dots_123458': (0x100289f, u'\u289f'), - 'braille_dots_12346': (0x100282f, u'\u282f'), - 'braille_dots_123467': (0x100286f, u'\u286f'), - 'braille_dots_1234678': (0x10028ef, u'\u28ef'), - 'braille_dots_123468': (0x10028af, u'\u28af'), - 'braille_dots_12347': (0x100284f, u'\u284f'), - 'braille_dots_123478': (0x10028cf, u'\u28cf'), - 'braille_dots_12348': (0x100288f, u'\u288f'), - 'braille_dots_1235': (0x1002817, u'\u2817'), - 'braille_dots_12356': (0x1002837, u'\u2837'), - 'braille_dots_123567': (0x1002877, u'\u2877'), - 'braille_dots_1235678': (0x10028f7, u'\u28f7'), - 'braille_dots_123568': (0x10028b7, u'\u28b7'), - 'braille_dots_12357': (0x1002857, u'\u2857'), - 'braille_dots_123578': (0x10028d7, u'\u28d7'), - 'braille_dots_12358': (0x1002897, u'\u2897'), - 'braille_dots_1236': (0x1002827, u'\u2827'), - 'braille_dots_12367': (0x1002867, u'\u2867'), - 'braille_dots_123678': (0x10028e7, u'\u28e7'), - 'braille_dots_12368': (0x10028a7, u'\u28a7'), - 'braille_dots_1237': (0x1002847, u'\u2847'), - 'braille_dots_12378': (0x10028c7, u'\u28c7'), - 'braille_dots_1238': (0x1002887, u'\u2887'), - 'braille_dots_124': (0x100280b, u'\u280b'), - 'braille_dots_1245': (0x100281b, u'\u281b'), - 'braille_dots_12456': (0x100283b, u'\u283b'), - 'braille_dots_124567': (0x100287b, u'\u287b'), - 'braille_dots_1245678': (0x10028fb, u'\u28fb'), - 'braille_dots_124568': (0x10028bb, u'\u28bb'), - 'braille_dots_12457': (0x100285b, u'\u285b'), - 'braille_dots_124578': (0x10028db, u'\u28db'), - 'braille_dots_12458': (0x100289b, u'\u289b'), - 'braille_dots_1246': (0x100282b, u'\u282b'), - 'braille_dots_12467': (0x100286b, u'\u286b'), - 'braille_dots_124678': (0x10028eb, u'\u28eb'), - 'braille_dots_12468': (0x10028ab, u'\u28ab'), - 'braille_dots_1247': (0x100284b, u'\u284b'), - 'braille_dots_12478': (0x10028cb, u'\u28cb'), - 'braille_dots_1248': (0x100288b, u'\u288b'), - 'braille_dots_125': (0x1002813, u'\u2813'), - 'braille_dots_1256': (0x1002833, u'\u2833'), - 'braille_dots_12567': (0x1002873, u'\u2873'), - 'braille_dots_125678': (0x10028f3, u'\u28f3'), - 'braille_dots_12568': (0x10028b3, u'\u28b3'), - 'braille_dots_1257': (0x1002853, u'\u2853'), - 'braille_dots_12578': (0x10028d3, u'\u28d3'), - 'braille_dots_1258': (0x1002893, u'\u2893'), - 'braille_dots_126': (0x1002823, u'\u2823'), - 'braille_dots_1267': (0x1002863, u'\u2863'), - 'braille_dots_12678': (0x10028e3, u'\u28e3'), - 'braille_dots_1268': (0x10028a3, u'\u28a3'), - 'braille_dots_127': (0x1002843, u'\u2843'), - 'braille_dots_1278': (0x10028c3, u'\u28c3'), - 'braille_dots_128': (0x1002883, u'\u2883'), - 'braille_dots_13': (0x1002805, u'\u2805'), - 'braille_dots_134': (0x100280d, u'\u280d'), - 'braille_dots_1345': (0x100281d, u'\u281d'), - 'braille_dots_13456': (0x100283d, u'\u283d'), - 'braille_dots_134567': (0x100287d, u'\u287d'), - 'braille_dots_1345678': (0x10028fd, u'\u28fd'), - 'braille_dots_134568': (0x10028bd, u'\u28bd'), - 'braille_dots_13457': (0x100285d, u'\u285d'), - 'braille_dots_134578': (0x10028dd, u'\u28dd'), - 'braille_dots_13458': (0x100289d, u'\u289d'), - 'braille_dots_1346': (0x100282d, u'\u282d'), - 'braille_dots_13467': (0x100286d, u'\u286d'), - 'braille_dots_134678': (0x10028ed, u'\u28ed'), - 'braille_dots_13468': (0x10028ad, u'\u28ad'), - 'braille_dots_1347': (0x100284d, u'\u284d'), - 'braille_dots_13478': (0x10028cd, u'\u28cd'), - 'braille_dots_1348': (0x100288d, u'\u288d'), - 'braille_dots_135': (0x1002815, u'\u2815'), - 'braille_dots_1356': (0x1002835, u'\u2835'), - 'braille_dots_13567': (0x1002875, u'\u2875'), - 'braille_dots_135678': (0x10028f5, u'\u28f5'), - 'braille_dots_13568': (0x10028b5, u'\u28b5'), - 'braille_dots_1357': (0x1002855, u'\u2855'), - 'braille_dots_13578': (0x10028d5, u'\u28d5'), - 'braille_dots_1358': (0x1002895, u'\u2895'), - 'braille_dots_136': (0x1002825, u'\u2825'), - 'braille_dots_1367': (0x1002865, u'\u2865'), - 'braille_dots_13678': (0x10028e5, u'\u28e5'), - 'braille_dots_1368': (0x10028a5, u'\u28a5'), - 'braille_dots_137': (0x1002845, u'\u2845'), - 'braille_dots_1378': (0x10028c5, u'\u28c5'), - 'braille_dots_138': (0x1002885, u'\u2885'), - 'braille_dots_14': (0x1002809, u'\u2809'), - 'braille_dots_145': (0x1002819, u'\u2819'), - 'braille_dots_1456': (0x1002839, u'\u2839'), - 'braille_dots_14567': (0x1002879, u'\u2879'), - 'braille_dots_145678': (0x10028f9, u'\u28f9'), - 'braille_dots_14568': (0x10028b9, u'\u28b9'), - 'braille_dots_1457': (0x1002859, u'\u2859'), - 'braille_dots_14578': (0x10028d9, u'\u28d9'), - 'braille_dots_1458': (0x1002899, u'\u2899'), - 'braille_dots_146': (0x1002829, u'\u2829'), - 'braille_dots_1467': (0x1002869, u'\u2869'), - 'braille_dots_14678': (0x10028e9, u'\u28e9'), - 'braille_dots_1468': (0x10028a9, u'\u28a9'), - 'braille_dots_147': (0x1002849, u'\u2849'), - 'braille_dots_1478': (0x10028c9, u'\u28c9'), - 'braille_dots_148': (0x1002889, u'\u2889'), - 'braille_dots_15': (0x1002811, u'\u2811'), - 'braille_dots_156': (0x1002831, u'\u2831'), - 'braille_dots_1567': (0x1002871, u'\u2871'), - 'braille_dots_15678': (0x10028f1, u'\u28f1'), - 'braille_dots_1568': (0x10028b1, u'\u28b1'), - 'braille_dots_157': (0x1002851, u'\u2851'), - 'braille_dots_1578': (0x10028d1, u'\u28d1'), - 'braille_dots_158': (0x1002891, u'\u2891'), - 'braille_dots_16': (0x1002821, u'\u2821'), - 'braille_dots_167': (0x1002861, u'\u2861'), - 'braille_dots_1678': (0x10028e1, u'\u28e1'), - 'braille_dots_168': (0x10028a1, u'\u28a1'), - 'braille_dots_17': (0x1002841, u'\u2841'), - 'braille_dots_178': (0x10028c1, u'\u28c1'), - 'braille_dots_18': (0x1002881, u'\u2881'), - 'braille_dots_2': (0x1002802, u'\u2802'), - 'braille_dots_23': (0x1002806, u'\u2806'), - 'braille_dots_234': (0x100280e, u'\u280e'), - 'braille_dots_2345': (0x100281e, u'\u281e'), - 'braille_dots_23456': (0x100283e, u'\u283e'), - 'braille_dots_234567': (0x100287e, u'\u287e'), - 'braille_dots_2345678': (0x10028fe, u'\u28fe'), - 'braille_dots_234568': (0x10028be, u'\u28be'), - 'braille_dots_23457': (0x100285e, u'\u285e'), - 'braille_dots_234578': (0x10028de, u'\u28de'), - 'braille_dots_23458': (0x100289e, u'\u289e'), - 'braille_dots_2346': (0x100282e, u'\u282e'), - 'braille_dots_23467': (0x100286e, u'\u286e'), - 'braille_dots_234678': (0x10028ee, u'\u28ee'), - 'braille_dots_23468': (0x10028ae, u'\u28ae'), - 'braille_dots_2347': (0x100284e, u'\u284e'), - 'braille_dots_23478': (0x10028ce, u'\u28ce'), - 'braille_dots_2348': (0x100288e, u'\u288e'), - 'braille_dots_235': (0x1002816, u'\u2816'), - 'braille_dots_2356': (0x1002836, u'\u2836'), - 'braille_dots_23567': (0x1002876, u'\u2876'), - 'braille_dots_235678': (0x10028f6, u'\u28f6'), - 'braille_dots_23568': (0x10028b6, u'\u28b6'), - 'braille_dots_2357': (0x1002856, u'\u2856'), - 'braille_dots_23578': (0x10028d6, u'\u28d6'), - 'braille_dots_2358': (0x1002896, u'\u2896'), - 'braille_dots_236': (0x1002826, u'\u2826'), - 'braille_dots_2367': (0x1002866, u'\u2866'), - 'braille_dots_23678': (0x10028e6, u'\u28e6'), - 'braille_dots_2368': (0x10028a6, u'\u28a6'), - 'braille_dots_237': (0x1002846, u'\u2846'), - 'braille_dots_2378': (0x10028c6, u'\u28c6'), - 'braille_dots_238': (0x1002886, u'\u2886'), - 'braille_dots_24': (0x100280a, u'\u280a'), - 'braille_dots_245': (0x100281a, u'\u281a'), - 'braille_dots_2456': (0x100283a, u'\u283a'), - 'braille_dots_24567': (0x100287a, u'\u287a'), - 'braille_dots_245678': (0x10028fa, u'\u28fa'), - 'braille_dots_24568': (0x10028ba, u'\u28ba'), - 'braille_dots_2457': (0x100285a, u'\u285a'), - 'braille_dots_24578': (0x10028da, u'\u28da'), - 'braille_dots_2458': (0x100289a, u'\u289a'), - 'braille_dots_246': (0x100282a, u'\u282a'), - 'braille_dots_2467': (0x100286a, u'\u286a'), - 'braille_dots_24678': (0x10028ea, u'\u28ea'), - 'braille_dots_2468': (0x10028aa, u'\u28aa'), - 'braille_dots_247': (0x100284a, u'\u284a'), - 'braille_dots_2478': (0x10028ca, u'\u28ca'), - 'braille_dots_248': (0x100288a, u'\u288a'), - 'braille_dots_25': (0x1002812, u'\u2812'), - 'braille_dots_256': (0x1002832, u'\u2832'), - 'braille_dots_2567': (0x1002872, u'\u2872'), - 'braille_dots_25678': (0x10028f2, u'\u28f2'), - 'braille_dots_2568': (0x10028b2, u'\u28b2'), - 'braille_dots_257': (0x1002852, u'\u2852'), - 'braille_dots_2578': (0x10028d2, u'\u28d2'), - 'braille_dots_258': (0x1002892, u'\u2892'), - 'braille_dots_26': (0x1002822, u'\u2822'), - 'braille_dots_267': (0x1002862, u'\u2862'), - 'braille_dots_2678': (0x10028e2, u'\u28e2'), - 'braille_dots_268': (0x10028a2, u'\u28a2'), - 'braille_dots_27': (0x1002842, u'\u2842'), - 'braille_dots_278': (0x10028c2, u'\u28c2'), - 'braille_dots_28': (0x1002882, u'\u2882'), - 'braille_dots_3': (0x1002804, u'\u2804'), - 'braille_dots_34': (0x100280c, u'\u280c'), - 'braille_dots_345': (0x100281c, u'\u281c'), - 'braille_dots_3456': (0x100283c, u'\u283c'), - 'braille_dots_34567': (0x100287c, u'\u287c'), - 'braille_dots_345678': (0x10028fc, u'\u28fc'), - 'braille_dots_34568': (0x10028bc, u'\u28bc'), - 'braille_dots_3457': (0x100285c, u'\u285c'), - 'braille_dots_34578': (0x10028dc, u'\u28dc'), - 'braille_dots_3458': (0x100289c, u'\u289c'), - 'braille_dots_346': (0x100282c, u'\u282c'), - 'braille_dots_3467': (0x100286c, u'\u286c'), - 'braille_dots_34678': (0x10028ec, u'\u28ec'), - 'braille_dots_3468': (0x10028ac, u'\u28ac'), - 'braille_dots_347': (0x100284c, u'\u284c'), - 'braille_dots_3478': (0x10028cc, u'\u28cc'), - 'braille_dots_348': (0x100288c, u'\u288c'), - 'braille_dots_35': (0x1002814, u'\u2814'), - 'braille_dots_356': (0x1002834, u'\u2834'), - 'braille_dots_3567': (0x1002874, u'\u2874'), - 'braille_dots_35678': (0x10028f4, u'\u28f4'), - 'braille_dots_3568': (0x10028b4, u'\u28b4'), - 'braille_dots_357': (0x1002854, u'\u2854'), - 'braille_dots_3578': (0x10028d4, u'\u28d4'), - 'braille_dots_358': (0x1002894, u'\u2894'), - 'braille_dots_36': (0x1002824, u'\u2824'), - 'braille_dots_367': (0x1002864, u'\u2864'), - 'braille_dots_3678': (0x10028e4, u'\u28e4'), - 'braille_dots_368': (0x10028a4, u'\u28a4'), - 'braille_dots_37': (0x1002844, u'\u2844'), - 'braille_dots_378': (0x10028c4, u'\u28c4'), - 'braille_dots_38': (0x1002884, u'\u2884'), - 'braille_dots_4': (0x1002808, u'\u2808'), - 'braille_dots_45': (0x1002818, u'\u2818'), - 'braille_dots_456': (0x1002838, u'\u2838'), - 'braille_dots_4567': (0x1002878, u'\u2878'), - 'braille_dots_45678': (0x10028f8, u'\u28f8'), - 'braille_dots_4568': (0x10028b8, u'\u28b8'), - 'braille_dots_457': (0x1002858, u'\u2858'), - 'braille_dots_4578': (0x10028d8, u'\u28d8'), - 'braille_dots_458': (0x1002898, u'\u2898'), - 'braille_dots_46': (0x1002828, u'\u2828'), - 'braille_dots_467': (0x1002868, u'\u2868'), - 'braille_dots_4678': (0x10028e8, u'\u28e8'), - 'braille_dots_468': (0x10028a8, u'\u28a8'), - 'braille_dots_47': (0x1002848, u'\u2848'), - 'braille_dots_478': (0x10028c8, u'\u28c8'), - 'braille_dots_48': (0x1002888, u'\u2888'), - 'braille_dots_5': (0x1002810, u'\u2810'), - 'braille_dots_56': (0x1002830, u'\u2830'), - 'braille_dots_567': (0x1002870, u'\u2870'), - 'braille_dots_5678': (0x10028f0, u'\u28f0'), - 'braille_dots_568': (0x10028b0, u'\u28b0'), - 'braille_dots_57': (0x1002850, u'\u2850'), - 'braille_dots_578': (0x10028d0, u'\u28d0'), - 'braille_dots_58': (0x1002890, u'\u2890'), - 'braille_dots_6': (0x1002820, u'\u2820'), - 'braille_dots_67': (0x1002860, u'\u2860'), - 'braille_dots_678': (0x10028e0, u'\u28e0'), - 'braille_dots_68': (0x10028a0, u'\u28a0'), - 'braille_dots_7': (0x1002840, u'\u2840'), - 'braille_dots_78': (0x10028c0, u'\u28c0'), - 'braille_dots_8': (0x1002880, u'\u2880'), - 'breve': (0x01a2, u'\u02D8'), - 'brokenbar': (0x00a6, u'\u00A6'), - 'c': (0x0063, u'\u0063'), - 'cabovedot': (0x02e5, u'\u010B'), - 'cacute': (0x01e6, u'\u0107'), - 'careof': (0x0ab8, u'\u2105'), - 'caret': (0x0afc, u'\u2038'), - 'caron': (0x01b7, u'\u02C7'), - 'ccaron': (0x01e8, u'\u010D'), - 'ccedilla': (0x00e7, u'\u00E7'), - 'ccircumflex': (0x02e6, u'\u0109'), - 'cedilla': (0x00b8, u'\u00B8'), - 'cent': (0x00a2, u'\u00A2'), - 'checkerboard': (0x09e1, u'\u2592'), - 'checkmark': (0x0af3, u'\u2713'), - 'circle': (0x0bcf, u'\u25CB'), - 'club': (0x0aec, u'\u2663'), - 'colon': (0x003a, u'\u003A'), - 'comma': (0x002c, u'\u002C'), - 'containsas': (0x100220B, u'\u220B'), - 'copyright': (0x00a9, u'\u00A9'), - 'cr': (0x09e4, u'\u240D'), - 'crossinglines': (0x09ee, u'\u253C'), - 'cuberoot': (0x100221B, u'\u221B'), - 'currency': (0x00a4, u'\u00A4'), - 'd': (0x0064, u'\u0064'), - 'dabovedot': (0x1001e0b, u'\u1E0B'), - 'dagger': (0x0af1, u'\u2020'), - 'dcaron': (0x01ef, u'\u010F'), - 'dead_A': (0xfe81, None), - 'dead_E': (0xfe83, None), - 'dead_I': (0xfe85, None), - 'dead_O': (0xfe87, None), - 'dead_U': (0xfe89, None), - 'dead_a': (0xfe80, None), - 'dead_abovecomma': (0xfe64, u'\u0315'), - 'dead_abovedot': (0xfe56, u'\u0307'), - 'dead_abovereversedcomma': (0xfe65, u'\u0312'), - 'dead_abovering': (0xfe58, u'\u030A'), - 'dead_aboveverticalline': (0xfe91, u'\u030D'), - 'dead_acute': (0xfe51, u'\u0301'), - 'dead_belowbreve': (0xfe6b, u'\u032E'), - 'dead_belowcircumflex': (0xfe69, u'\u032D'), - 'dead_belowcomma': (0xfe6e, u'\u0326'), - 'dead_belowdiaeresis': (0xfe6c, u'\u0324'), - 'dead_belowdot': (0xfe60, u'\u0323'), - 'dead_belowmacron': (0xfe68, u'\u0331'), - 'dead_belowring': (0xfe67, u'\u0325'), - 'dead_belowtilde': (0xfe6a, u'\u0330'), - 'dead_belowverticalline': (0xfe92, u'\u0329'), - 'dead_breve': (0xfe55, u'\u0306'), - 'dead_capital_schwa': (0xfe8b, None), - 'dead_caron': (0xfe5a, u'\u030C'), - 'dead_cedilla': (0xfe5b, u'\u0327'), - 'dead_circumflex': (0xfe52, u'\u0302'), - 'dead_currency': (0xfe6f, None), - 'dead_diaeresis': (0xfe57, u'\u0308'), - 'dead_doubleacute': (0xfe59, u'\u030B'), - 'dead_doublegrave': (0xfe66, u'\u030F'), - 'dead_e': (0xfe82, None), - 'dead_grave': (0xfe50, u'\u0300'), - 'dead_greek': (0xfe8c, None), - 'dead_hook': (0xfe61, u'\u0309'), - 'dead_horn': (0xfe62, u'\u031B'), - 'dead_i': (0xfe84, None), - 'dead_invertedbreve': (0xfe6d, u'\u032F'), - 'dead_iota': (0xfe5d, u'\u0345'), - 'dead_longsolidusoverlay': (0xfe93, u'\u0338'), - 'dead_lowline': (0xfe90, u'\u0332'), - 'dead_macron': (0xfe54, u'\u0304'), - 'dead_o': (0xfe86, None), - 'dead_ogonek': (0xfe5c, u'\u0328'), - 'dead_semivoiced_sound': (0xfe5f, None), - 'dead_small_schwa': (0xfe8a, None), - 'dead_stroke': (0xfe63, u'\u0335'), - 'dead_tilde': (0xfe53, u'\u0303'), - 'dead_u': (0xfe88, None), - 'dead_voiced_sound': (0xfe5e, None), - 'degree': (0x00b0, u'\u00B0'), - 'diaeresis': (0x00a8, u'\u00A8'), - 'diamond': (0x0aed, u'\u2666'), - 'digitspace': (0x0aa5, u'\u2007'), - 'dintegral': (0x100222C, u'\u222C'), - 'division': (0x00f7, u'\u00F7'), - 'dollar': (0x0024, u'\u0024'), - 'doubbaselinedot': (0x0aaf, u'\u2025'), - 'doubleacute': (0x01bd, u'\u02DD'), - 'doubledagger': (0x0af2, u'\u2021'), - 'doublelowquotemark': (0x0afe, u'\u201E'), - 'downarrow': (0x08fe, u'\u2193'), - 'downstile': (0x0bc4, u'\u230A'), - 'downtack': (0x0bc2, u'\u22A4'), - 'dstroke': (0x01f0, u'\u0111'), - 'e': (0x0065, u'\u0065'), - 'eabovedot': (0x03ec, u'\u0117'), - 'eacute': (0x00e9, u'\u00E9'), - 'ebelowdot': (0x1001eb9, u'\u1EB9'), - 'ecaron': (0x01ec, u'\u011B'), - 'ecircumflex': (0x00ea, u'\u00EA'), - 'ecircumflexacute': (0x1001ebf, u'\u1EBF'), - 'ecircumflexbelowdot': (0x1001ec7, u'\u1EC7'), - 'ecircumflexgrave': (0x1001ec1, u'\u1EC1'), - 'ecircumflexhook': (0x1001ec3, u'\u1EC3'), - 'ecircumflextilde': (0x1001ec5, u'\u1EC5'), - 'ediaeresis': (0x00eb, u'\u00EB'), - 'egrave': (0x00e8, u'\u00E8'), - 'ehook': (0x1001ebb, u'\u1EBB'), - 'eightsubscript': (0x1002088, u'\u2088'), - 'eightsuperior': (0x1002078, u'\u2078'), - 'elementof': (0x1002208, u'\u2208'), - 'ellipsis': (0x0aae, u'\u2026'), - 'em3space': (0x0aa3, u'\u2004'), - 'em4space': (0x0aa4, u'\u2005'), - 'emacron': (0x03ba, u'\u0113'), - 'emdash': (0x0aa9, u'\u2014'), - 'emptyset': (0x1002205, u'\u2205'), - 'emspace': (0x0aa1, u'\u2003'), - 'endash': (0x0aaa, u'\u2013'), - 'eng': (0x03bf, u'\u014B'), - 'enspace': (0x0aa2, u'\u2002'), - 'eogonek': (0x01ea, u'\u0119'), - 'equal': (0x003d, u'\u003D'), - 'eth': (0x00f0, u'\u00F0'), - 'etilde': (0x1001ebd, u'\u1EBD'), - 'exclam': (0x0021, u'\u0021'), - 'exclamdown': (0x00a1, u'\u00A1'), - 'ezh': (0x1000292, u'\u0292'), - 'f': (0x0066, u'\u0066'), - 'fabovedot': (0x1001e1f, u'\u1E1F'), - 'femalesymbol': (0x0af8, u'\u2640'), - 'ff': (0x09e3, u'\u240C'), - 'figdash': (0x0abb, u'\u2012'), - 'fiveeighths': (0x0ac5, u'\u215D'), - 'fivesixths': (0x0ab7, u'\u215A'), - 'fivesubscript': (0x1002085, u'\u2085'), - 'fivesuperior': (0x1002075, u'\u2075'), - 'fourfifths': (0x0ab5, u'\u2158'), - 'foursubscript': (0x1002084, u'\u2084'), - 'foursuperior': (0x1002074, u'\u2074'), - 'fourthroot': (0x100221C, u'\u221C'), - 'function': (0x08f6, u'\u0192'), - 'g': (0x0067, u'\u0067'), - 'gabovedot': (0x02f5, u'\u0121'), - 'gbreve': (0x02bb, u'\u011F'), - 'gcaron': (0x10001e7, u'\u01E7'), - 'gcedilla': (0x03bb, u'\u0123'), - 'gcircumflex': (0x02f8, u'\u011D'), - 'grave': (0x0060, u'\u0060'), - 'greater': (0x003e, u'\u003E'), - 'greaterthanequal': (0x08be, u'\u2265'), - 'guillemotleft': (0x00ab, u'\u00AB'), - 'guillemotright': (0x00bb, u'\u00BB'), - 'h': (0x0068, u'\u0068'), - 'hairspace': (0x0aa8, u'\u200A'), - 'hcircumflex': (0x02b6, u'\u0125'), - 'heart': (0x0aee, u'\u2665'), - 'hebrew_aleph': (0x0ce0, u'\u05D0'), - 'hebrew_ayin': (0x0cf2, u'\u05E2'), - 'hebrew_bet': (0x0ce1, u'\u05D1'), - 'hebrew_chet': (0x0ce7, u'\u05D7'), - 'hebrew_dalet': (0x0ce3, u'\u05D3'), - 'hebrew_doublelowline': (0x0cdf, u'\u2017'), - 'hebrew_finalkaph': (0x0cea, u'\u05DA'), - 'hebrew_finalmem': (0x0ced, u'\u05DD'), - 'hebrew_finalnun': (0x0cef, u'\u05DF'), - 'hebrew_finalpe': (0x0cf3, u'\u05E3'), - 'hebrew_finalzade': (0x0cf5, u'\u05E5'), - 'hebrew_gimel': (0x0ce2, u'\u05D2'), - 'hebrew_he': (0x0ce4, u'\u05D4'), - 'hebrew_kaph': (0x0ceb, u'\u05DB'), - 'hebrew_lamed': (0x0cec, u'\u05DC'), - 'hebrew_mem': (0x0cee, u'\u05DE'), - 'hebrew_nun': (0x0cf0, u'\u05E0'), - 'hebrew_pe': (0x0cf4, u'\u05E4'), - 'hebrew_qoph': (0x0cf7, u'\u05E7'), - 'hebrew_resh': (0x0cf8, u'\u05E8'), - 'hebrew_samech': (0x0cf1, u'\u05E1'), - 'hebrew_shin': (0x0cf9, u'\u05E9'), - 'hebrew_taw': (0x0cfa, u'\u05EA'), - 'hebrew_tet': (0x0ce8, u'\u05D8'), - 'hebrew_waw': (0x0ce5, u'\u05D5'), - 'hebrew_yod': (0x0ce9, u'\u05D9'), - 'hebrew_zade': (0x0cf6, u'\u05E6'), - 'hebrew_zain': (0x0ce6, u'\u05D6'), - 'horizlinescan1': (0x09ef, u'\u23BA'), - 'horizlinescan3': (0x09f0, u'\u23BB'), - 'horizlinescan5': (0x09f1, u'\u2500'), - 'horizlinescan7': (0x09f2, u'\u23BC'), - 'horizlinescan9': (0x09f3, u'\u23BD'), - 'hstroke': (0x02b1, u'\u0127'), - 'ht': (0x09e2, u'\u2409'), - 'hyphen': (0x00ad, u'\u00AD'), - 'i': (0x0069, u'\u0069'), - 'iacute': (0x00ed, u'\u00ED'), - 'ibelowdot': (0x1001ecb, u'\u1ECB'), - 'ibreve': (0x100012d, u'\u012D'), - 'icircumflex': (0x00ee, u'\u00EE'), - 'identical': (0x08cf, u'\u2261'), - 'idiaeresis': (0x00ef, u'\u00EF'), - 'idotless': (0x02b9, u'\u0131'), - 'ifonlyif': (0x08cd, u'\u21D4'), - 'igrave': (0x00ec, u'\u00EC'), - 'ihook': (0x1001ec9, u'\u1EC9'), - 'imacron': (0x03ef, u'\u012B'), - 'implies': (0x08ce, u'\u21D2'), - 'includedin': (0x08da, u'\u2282'), - 'includes': (0x08db, u'\u2283'), - 'infinity': (0x08c2, u'\u221E'), - 'integral': (0x08bf, u'\u222B'), - 'intersection': (0x08dc, u'\u2229'), - 'iogonek': (0x03e7, u'\u012F'), - 'itilde': (0x03b5, u'\u0129'), - 'j': (0x006a, u'\u006A'), - 'jcircumflex': (0x02bc, u'\u0135'), - 'jot': (0x0bca, u'\u2218'), - 'k': (0x006b, u'\u006B'), - 'kana_A': (0x04b1, u'\u30A2'), - 'kana_CHI': (0x04c1, u'\u30C1'), - 'kana_E': (0x04b4, u'\u30A8'), - 'kana_FU': (0x04cc, u'\u30D5'), - 'kana_HA': (0x04ca, u'\u30CF'), - 'kana_HE': (0x04cd, u'\u30D8'), - 'kana_HI': (0x04cb, u'\u30D2'), - 'kana_HO': (0x04ce, u'\u30DB'), - 'kana_I': (0x04b2, u'\u30A4'), - 'kana_KA': (0x04b6, u'\u30AB'), - 'kana_KE': (0x04b9, u'\u30B1'), - 'kana_KI': (0x04b7, u'\u30AD'), - 'kana_KO': (0x04ba, u'\u30B3'), - 'kana_KU': (0x04b8, u'\u30AF'), - 'kana_MA': (0x04cf, u'\u30DE'), - 'kana_ME': (0x04d2, u'\u30E1'), - 'kana_MI': (0x04d0, u'\u30DF'), - 'kana_MO': (0x04d3, u'\u30E2'), - 'kana_MU': (0x04d1, u'\u30E0'), - 'kana_N': (0x04dd, u'\u30F3'), - 'kana_NA': (0x04c5, u'\u30CA'), - 'kana_NE': (0x04c8, u'\u30CD'), - 'kana_NI': (0x04c6, u'\u30CB'), - 'kana_NO': (0x04c9, u'\u30CE'), - 'kana_NU': (0x04c7, u'\u30CC'), - 'kana_O': (0x04b5, u'\u30AA'), - 'kana_RA': (0x04d7, u'\u30E9'), - 'kana_RE': (0x04da, u'\u30EC'), - 'kana_RI': (0x04d8, u'\u30EA'), - 'kana_RO': (0x04db, u'\u30ED'), - 'kana_RU': (0x04d9, u'\u30EB'), - 'kana_SA': (0x04bb, u'\u30B5'), - 'kana_SE': (0x04be, u'\u30BB'), - 'kana_SHI': (0x04bc, u'\u30B7'), - 'kana_SO': (0x04bf, u'\u30BD'), - 'kana_SU': (0x04bd, u'\u30B9'), - 'kana_TA': (0x04c0, u'\u30BF'), - 'kana_TE': (0x04c3, u'\u30C6'), - 'kana_TO': (0x04c4, u'\u30C8'), - 'kana_TSU': (0x04c2, u'\u30C4'), - 'kana_U': (0x04b3, u'\u30A6'), - 'kana_WA': (0x04dc, u'\u30EF'), - 'kana_WO': (0x04a6, u'\u30F2'), - 'kana_YA': (0x04d4, u'\u30E4'), - 'kana_YO': (0x04d6, u'\u30E8'), - 'kana_YU': (0x04d5, u'\u30E6'), - 'kana_a': (0x04a7, u'\u30A1'), - 'kana_closingbracket': (0x04a3, u'\u300D'), - 'kana_comma': (0x04a4, u'\u3001'), - 'kana_conjunctive': (0x04a5, u'\u30FB'), - 'kana_e': (0x04aa, u'\u30A7'), - 'kana_fullstop': (0x04a1, u'\u3002'), - 'kana_i': (0x04a8, u'\u30A3'), - 'kana_o': (0x04ab, u'\u30A9'), - 'kana_openingbracket': (0x04a2, u'\u300C'), - 'kana_tsu': (0x04af, u'\u30C3'), - 'kana_u': (0x04a9, u'\u30A5'), - 'kana_ya': (0x04ac, u'\u30E3'), - 'kana_yo': (0x04ae, u'\u30E7'), - 'kana_yu': (0x04ad, u'\u30E5'), - 'kcedilla': (0x03f3, u'\u0137'), - 'kra': (0x03a2, u'\u0138'), - 'l': (0x006c, u'\u006C'), - 'lacute': (0x01e5, u'\u013A'), - 'latincross': (0x0ad9, u'\u271D'), - 'lbelowdot': (0x1001e37, u'\u1E37'), - 'lcaron': (0x01b5, u'\u013E'), - 'lcedilla': (0x03b6, u'\u013C'), - 'leftarrow': (0x08fb, u'\u2190'), - 'leftdoublequotemark': (0x0ad2, u'\u201C'), - 'leftmiddlecurlybrace': (0x08af, u'\u23A8'), - 'leftradical': (0x08a1, u'\u23B7'), - 'leftsinglequotemark': (0x0ad0, u'\u2018'), - 'leftt': (0x09f4, u'\u251C'), - 'lefttack': (0x0bdc, u'\u22A3'), - 'less': (0x003c, u'\u003C'), - 'lessthanequal': (0x08bc, u'\u2264'), - 'lf': (0x09e5, u'\u240A'), - 'logicaland': (0x08de, u'\u2227'), - 'logicalor': (0x08df, u'\u2228'), - 'lowleftcorner': (0x09ed, u'\u2514'), - 'lowrightcorner': (0x09ea, u'\u2518'), - 'lstroke': (0x01b3, u'\u0142'), - 'm': (0x006d, u'\u006D'), - 'mabovedot': (0x1001e41, u'\u1E41'), - 'macron': (0x00af, u'\u00AF'), - 'malesymbol': (0x0af7, u'\u2642'), - 'maltesecross': (0x0af0, u'\u2720'), - 'masculine': (0x00ba, u'\u00BA'), - 'minus': (0x002d, u'\u002D'), - 'minutes': (0x0ad6, u'\u2032'), - 'mu': (0x00b5, u'\u00B5'), - 'multiply': (0x00d7, u'\u00D7'), - 'musicalflat': (0x0af6, u'\u266D'), - 'musicalsharp': (0x0af5, u'\u266F'), - 'n': (0x006e, u'\u006E'), - 'nabla': (0x08c5, u'\u2207'), - 'nacute': (0x01f1, u'\u0144'), - 'ncaron': (0x01f2, u'\u0148'), - 'ncedilla': (0x03f1, u'\u0146'), - 'ninesubscript': (0x1002089, u'\u2089'), - 'ninesuperior': (0x1002079, u'\u2079'), - 'nl': (0x09e8, u'\u2424'), - 'nobreakspace': (0x00a0, u'\u00A0'), - 'notapproxeq': (0x1002247, u'\u2247'), - 'notelementof': (0x1002209, u'\u2209'), - 'notequal': (0x08bd, u'\u2260'), - 'notidentical': (0x1002262, u'\u2262'), - 'notsign': (0x00ac, u'\u00AC'), - 'ntilde': (0x00f1, u'\u00F1'), - 'numbersign': (0x0023, u'\u0023'), - 'numerosign': (0x06b0, u'\u2116'), - 'o': (0x006f, u'\u006F'), - 'oacute': (0x00f3, u'\u00F3'), - 'obarred': (0x1000275, u'\u0275'), - 'obelowdot': (0x1001ecd, u'\u1ECD'), - 'ocaron': (0x10001d2, u'\u01D2'), - 'ocircumflex': (0x00f4, u'\u00F4'), - 'ocircumflexacute': (0x1001ed1, u'\u1ED1'), - 'ocircumflexbelowdot': (0x1001ed9, u'\u1ED9'), - 'ocircumflexgrave': (0x1001ed3, u'\u1ED3'), - 'ocircumflexhook': (0x1001ed5, u'\u1ED5'), - 'ocircumflextilde': (0x1001ed7, u'\u1ED7'), - 'odiaeresis': (0x00f6, u'\u00F6'), - 'odoubleacute': (0x01f5, u'\u0151'), - 'oe': (0x13bd, u'\u0153'), - 'ogonek': (0x01b2, u'\u02DB'), - 'ograve': (0x00f2, u'\u00F2'), - 'ohook': (0x1001ecf, u'\u1ECF'), - 'ohorn': (0x10001a1, u'\u01A1'), - 'ohornacute': (0x1001edb, u'\u1EDB'), - 'ohornbelowdot': (0x1001ee3, u'\u1EE3'), - 'ohorngrave': (0x1001edd, u'\u1EDD'), - 'ohornhook': (0x1001edf, u'\u1EDF'), - 'ohorntilde': (0x1001ee1, u'\u1EE1'), - 'omacron': (0x03f2, u'\u014D'), - 'oneeighth': (0x0ac3, u'\u215B'), - 'onefifth': (0x0ab2, u'\u2155'), - 'onehalf': (0x00bd, u'\u00BD'), - 'onequarter': (0x00bc, u'\u00BC'), - 'onesixth': (0x0ab6, u'\u2159'), - 'onesubscript': (0x1002081, u'\u2081'), - 'onesuperior': (0x00b9, u'\u00B9'), - 'onethird': (0x0ab0, u'\u2153'), - 'ooblique': (0x00f8, u'\u00F8'), - 'ordfeminine': (0x00aa, u'\u00AA'), - 'oslash': (0x00f8, u'\u00F8'), - 'otilde': (0x00f5, u'\u00F5'), - 'overline': (0x047e, u'\u203E'), - 'p': (0x0070, u'\u0070'), - 'pabovedot': (0x1001e57, u'\u1E57'), - 'paragraph': (0x00b6, u'\u00B6'), - 'parenleft': (0x0028, u'\u0028'), - 'parenright': (0x0029, u'\u0029'), - 'partdifferential': (0x1002202, u'\u2202'), - 'partialderivative': (0x08ef, u'\u2202'), - 'percent': (0x0025, u'\u0025'), - 'period': (0x002e, u'\u002E'), - 'periodcentered': (0x00b7, u'\u00B7'), - 'permille': (0x0ad5, u'\u2030'), - 'phonographcopyright': (0x0afb, u'\u2117'), - 'plus': (0x002b, u'\u002B'), - 'plusminus': (0x00b1, u'\u00B1'), - 'prescription': (0x0ad4, u'\u211E'), - 'prolongedsound': (0x04b0, u'\u30FC'), - 'punctspace': (0x0aa6, u'\u2008'), - 'q': (0x0071, u'\u0071'), - 'quad': (0x0bcc, u'\u2395'), - 'question': (0x003f, u'\u003F'), - 'questiondown': (0x00bf, u'\u00BF'), - 'quotedbl': (0x0022, u'\u0022'), - 'r': (0x0072, u'\u0072'), - 'racute': (0x01e0, u'\u0155'), - 'radical': (0x08d6, u'\u221A'), - 'rcaron': (0x01f8, u'\u0159'), - 'rcedilla': (0x03b3, u'\u0157'), - 'registered': (0x00ae, u'\u00AE'), - 'rightarrow': (0x08fd, u'\u2192'), - 'rightdoublequotemark': (0x0ad3, u'\u201D'), - 'rightmiddlecurlybrace': (0x08b0, u'\u23AC'), - 'rightsinglequotemark': (0x0ad1, u'\u2019'), - 'rightt': (0x09f5, u'\u2524'), - 'righttack': (0x0bfc, u'\u22A2'), - 's': (0x0073, u'\u0073'), - 'sabovedot': (0x1001e61, u'\u1E61'), - 'sacute': (0x01b6, u'\u015B'), - 'scaron': (0x01b9, u'\u0161'), - 'scedilla': (0x01ba, u'\u015F'), - 'schwa': (0x1000259, u'\u0259'), - 'scircumflex': (0x02fe, u'\u015D'), - 'seconds': (0x0ad7, u'\u2033'), - 'section': (0x00a7, u'\u00A7'), - 'semicolon': (0x003b, u'\u003B'), - 'semivoicedsound': (0x04df, u'\u309C'), - 'seveneighths': (0x0ac6, u'\u215E'), - 'sevensubscript': (0x1002087, u'\u2087'), - 'sevensuperior': (0x1002077, u'\u2077'), - 'similarequal': (0x08c9, u'\u2243'), - 'singlelowquotemark': (0x0afd, u'\u201A'), - 'sixsubscript': (0x1002086, u'\u2086'), - 'sixsuperior': (0x1002076, u'\u2076'), - 'slash': (0x002f, u'\u002F'), - 'soliddiamond': (0x09e0, u'\u25C6'), - 'space': (0x0020, u'\u0020'), - 'squareroot': (0x100221A, u'\u221A'), - 'ssharp': (0x00df, u'\u00DF'), - 'sterling': (0x00a3, u'\u00A3'), - 'stricteq': (0x1002263, u'\u2263'), - 't': (0x0074, u'\u0074'), - 'tabovedot': (0x1001e6b, u'\u1E6B'), - 'tcaron': (0x01bb, u'\u0165'), - 'tcedilla': (0x01fe, u'\u0163'), - 'telephone': (0x0af9, u'\u260E'), - 'telephonerecorder': (0x0afa, u'\u2315'), - 'therefore': (0x08c0, u'\u2234'), - 'thinspace': (0x0aa7, u'\u2009'), - 'thorn': (0x00fe, u'\u00FE'), - 'threeeighths': (0x0ac4, u'\u215C'), - 'threefifths': (0x0ab4, u'\u2157'), - 'threequarters': (0x00be, u'\u00BE'), - 'threesubscript': (0x1002083, u'\u2083'), - 'threesuperior': (0x00b3, u'\u00B3'), - 'tintegral': (0x100222D, u'\u222D'), - 'topintegral': (0x08a4, u'\u2320'), - 'topleftparens': (0x08ab, u'\u239B'), - 'topleftsqbracket': (0x08a7, u'\u23A1'), - 'toprightparens': (0x08ad, u'\u239E'), - 'toprightsqbracket': (0x08a9, u'\u23A4'), - 'topt': (0x09f7, u'\u252C'), - 'trademark': (0x0ac9, u'\u2122'), - 'tslash': (0x03bc, u'\u0167'), - 'twofifths': (0x0ab3, u'\u2156'), - 'twosubscript': (0x1002082, u'\u2082'), - 'twosuperior': (0x00b2, u'\u00B2'), - 'twothirds': (0x0ab1, u'\u2154'), - 'u': (0x0075, u'\u0075'), - 'uacute': (0x00fa, u'\u00FA'), - 'ubelowdot': (0x1001ee5, u'\u1EE5'), - 'ubreve': (0x02fd, u'\u016D'), - 'ucircumflex': (0x00fb, u'\u00FB'), - 'udiaeresis': (0x00fc, u'\u00FC'), - 'udoubleacute': (0x01fb, u'\u0171'), - 'ugrave': (0x00f9, u'\u00F9'), - 'uhook': (0x1001ee7, u'\u1EE7'), - 'uhorn': (0x10001b0, u'\u01B0'), - 'uhornacute': (0x1001ee9, u'\u1EE9'), - 'uhornbelowdot': (0x1001ef1, u'\u1EF1'), - 'uhorngrave': (0x1001eeb, u'\u1EEB'), - 'uhornhook': (0x1001eed, u'\u1EED'), - 'uhorntilde': (0x1001eef, u'\u1EEF'), - 'umacron': (0x03fe, u'\u016B'), - 'underscore': (0x005f, u'\u005F'), - 'union': (0x08dd, u'\u222A'), - 'uogonek': (0x03f9, u'\u0173'), - 'uparrow': (0x08fc, u'\u2191'), - 'upleftcorner': (0x09ec, u'\u250C'), - 'uprightcorner': (0x09eb, u'\u2510'), - 'upstile': (0x0bd3, u'\u2308'), - 'uptack': (0x0bce, u'\u22A5'), - 'uring': (0x01f9, u'\u016F'), - 'utilde': (0x03fd, u'\u0169'), - 'v': (0x0076, u'\u0076'), - 'variation': (0x08c1, u'\u221D'), - 'vertbar': (0x09f8, u'\u2502'), - 'voicedsound': (0x04de, u'\u309B'), - 'vt': (0x09e9, u'\u240B'), - 'w': (0x0077, u'\u0077'), - 'wacute': (0x1001e83, u'\u1E83'), - 'wcircumflex': (0x1000175, u'\u0175'), - 'wdiaeresis': (0x1001e85, u'\u1E85'), - 'wgrave': (0x1001e81, u'\u1E81'), - 'x': (0x0078, u'\u0078'), - 'xabovedot': (0x1001e8b, u'\u1E8B'), - 'y': (0x0079, u'\u0079'), - 'yacute': (0x00fd, u'\u00FD'), - 'ybelowdot': (0x1001ef5, u'\u1EF5'), - 'ycircumflex': (0x1000177, u'\u0177'), - 'ydiaeresis': (0x00ff, u'\u00FF'), - 'yen': (0x00a5, u'\u00A5'), - 'ygrave': (0x1001ef3, u'\u1EF3'), - 'yhook': (0x1001ef7, u'\u1EF7'), - 'ytilde': (0x1001ef9, u'\u1EF9'), - 'z': (0x007a, u'\u007A'), - 'zabovedot': (0x01bf, u'\u017C'), - 'zacute': (0x01bc, u'\u017A'), - 'zcaron': (0x01be, u'\u017E'), - 'zerosubscript': (0x1002080, u'\u2080'), - 'zerosuperior': (0x1002070, u'\u2070'), - 'zstroke': (0x10001b6, u'\u01B6')} - -DEAD_KEYS = { - u'\u0307': u'\u02D9', - u'\u030A': u'\u02DA', - u'\u0301': u'\u00B4', - u'\u0306': u'\u02D8', - u'\u030C': u'\u02C7', - u'\u0327': u'\u00B8', - u'\u0302': u'\u005E', - u'\u0308': u'\u00A8', - u'\u030B': u'\u02DD', - u'\u0300': u'\u0060', - u'\u0345': u'\u037A', - u'\u0332': u'\u005F', - u'\u0304': u'\u00AF', - u'\u0328': u'\u02DB', - u'\u0303': u'\u007E'} - -KEYPAD_KEYS = { - 'KP_0': 0xffb0, - 'KP_1': 0xffb1, - 'KP_2': 0xffb2, - 'KP_3': 0xffb3, - 'KP_4': 0xffb4, - 'KP_5': 0xffb5, - 'KP_6': 0xffb6, - 'KP_7': 0xffb7, - 'KP_8': 0xffb8, - 'KP_9': 0xffb9, - 'KP_Add': 0xffab, - 'KP_Begin': 0xff9d, - 'KP_Decimal': 0xffae, - 'KP_Delete': 0xff9f, - 'KP_Divide': 0xffaf, - 'KP_Down': 0xff99, - 'KP_End': 0xff9c, - 'KP_Enter': 0xff8d, - 'KP_Equal': 0xffbd, - 'KP_F1': 0xff91, - 'KP_F2': 0xff92, - 'KP_F3': 0xff93, - 'KP_F4': 0xff94, - 'KP_Home': 0xff95, - 'KP_Insert': 0xff9e, - 'KP_Left': 0xff96, - 'KP_Multiply': 0xffaa, - 'KP_Next': 0xff9b, - 'KP_Page_Down': 0xff9b, - 'KP_Page_Up': 0xff9a, - 'KP_Prior': 0xff9a, - 'KP_Right': 0xff98, - 'KP_Separator': 0xffac, - 'KP_Space': 0xff80, - 'KP_Subtract': 0xffad, - 'KP_Tab': 0xff89, - 'KP_Up': 0xff97} - -CHARS = { - codepoint: name - for name, (keysym, codepoint) in SYMBOLS.items() - if codepoint} - -KEYSYMS = { - keysym: name - for name, (keysym, codepoint) in SYMBOLS.items() - if codepoint} diff --git a/PortablePython/Lib/site-packages/pynput/keyboard/__init__.py b/PortablePython/Lib/site-packages/pynput/keyboard/__init__.py deleted file mode 100644 index 34a1921..0000000 --- a/PortablePython/Lib/site-packages/pynput/keyboard/__init__.py +++ /dev/null @@ -1,249 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The module containing keyboard classes. - -See the documentation for more information. -""" - -# pylint: disable=C0103 -# KeyCode, Key, Controller and Listener are not constants - -import itertools - -from pynput._util import backend, Events - - -backend = backend(__name__) -KeyCode = backend.KeyCode -Key = backend.Key -Controller = backend.Controller -Listener = backend.Listener -del backend - - -# pylint: disable=C0326; it is easier to read column aligned keys -#: The keys used as modifiers; the first value in each tuple is the -#: base modifier to use for subsequent modifiers. -_MODIFIER_KEYS = ( - (Key.alt_gr, (Key.alt_gr.value,)), - (Key.alt, (Key.alt.value, Key.alt_l.value, Key.alt_r.value)), - (Key.cmd, (Key.cmd.value, Key.cmd_l.value, Key.cmd_r.value)), - (Key.ctrl, (Key.ctrl.value, Key.ctrl_l.value, Key.ctrl_r.value)), - (Key.shift, (Key.shift.value, Key.shift_l.value, Key.shift_r.value))) - -#: Normalised modifiers as a mapping from virtual key code to basic modifier. -_NORMAL_MODIFIERS = { - value: key - for combination in _MODIFIER_KEYS - for key, value in zip( - itertools.cycle((combination[0],)), - combination[1])} - -#: Control codes to transform into key codes when typing -_CONTROL_CODES = { - '\n': Key.enter, - '\r': Key.enter, - '\t': Key.tab} -# pylint: enable=C0326 - - -class Events(Events): - """A keyboard event listener supporting synchronous iteration over the - events. - - Possible events are: - - :class:`Events.Press` - A key was pressed. - - :class:`Events.Release` - A key was released. - """ - _Listener = Listener - - class Press(Events.Event): - """A key press event. - """ - def __init__(self, key, injected): - #: The key. - self.key = key - - #: Whether this event is synthetic. - self.injected = injected - - class Release(Events.Event): - """A key release event. - """ - def __init__(self, key, injected): - #: The key. - self.key = key - - #: Whether this event is synthetic. - self.injected = injected - - def __init__(self): - super(Events, self).__init__( - on_press=self.Press, - on_release=self.Release) - - -class HotKey(object): - """A combination of keys acting as a hotkey. - - This class acts as a container of hotkey state for a keyboard listener. - - :param set keys: The collection of keys that must be pressed for this - hotkey to activate. Please note that a common limitation of the - hardware is that at most three simultaneously pressed keys are - supported, so using more keys may not work. - - :param callable on_activate: The activation callback. - """ - def __init__(self, keys, on_activate): - self._state = set() - self._keys = set(keys) - self._on_activate = on_activate - - @staticmethod - def parse(keys): - """Parses a key combination string. - - Key combination strings are sequences of key identifiers separated by - ``'+'``. Key identifiers are either single characters representing a - keyboard key, such as ``'a'``, or special key names identified by names - enclosed by brackets, such as ``''``. - - Keyboard keys are case-insensitive. - - :raises ValueError: if a part of the keys string is invalid, or if it - contains multiple equal parts - """ - def parts(): - start = 0 - for i, c in enumerate(keys): - if c == '+' and i != start: - yield keys[start:i] - start = i + 1 - if start == len(keys): - raise ValueError(keys) - else: - yield keys[start:] - - def parse(s): - if len(s) == 1: - return KeyCode.from_char(s.lower()) - elif len(s) > 2 and (s[0], s[-1]) == ('<', '>'): - p = s[1:-1] - try: - # We want to represent modifiers as Key instances, and all - # other keys as KeyCodes - key = Key[p.lower()] - if key in _NORMAL_MODIFIERS.values(): - return key - else: - return KeyCode.from_vk(key.value.vk) - except KeyError: - try: - return KeyCode.from_vk(int(p)) - except ValueError: - raise ValueError(s) - else: - raise ValueError(s) - - # Split the string and parse the individual parts - raw_parts = list(parts()) - parsed_parts = [ - parse(s) - for s in raw_parts] - - # Ensure no duplicate parts - if len(parsed_parts) != len(set(parsed_parts)): - raise ValueError(keys) - else: - return parsed_parts - - def press(self, key): - """Updates the hotkey state for a pressed key. - - If the key is not currently pressed, but is the last key for the full - combination, the activation callback will be invoked. - - Please note that the callback will only be invoked once. - - :param key: The key being pressed. - :type key: Key or KeyCode - """ - if key in self._keys and key not in self._state: - self._state.add(key) - if self._state == self._keys: - self._on_activate() - - def release(self, key): - """Updates the hotkey state for a released key. - - :param key: The key being released. - :type key: Key or KeyCode - """ - if key in self._state: - self._state.remove(key) - - -class GlobalHotKeys(Listener): - """A keyboard listener supporting a number of global hotkeys. - - This is a convenience wrapper to simplify registering a number of global - hotkeys. - - :param dict hotkeys: A mapping from hotkey description to hotkey action. - Keys are strings passed to :meth:`HotKey.parse`. - - :raises ValueError: if any hotkey description is invalid - """ - def __init__(self, hotkeys, *args, **kwargs): - self._hotkeys = [ - HotKey(HotKey.parse(key), value) - for key, value in hotkeys.items()] - super(GlobalHotKeys, self).__init__( - on_press=self._on_press, - on_release=self._on_release, - *args, - **kwargs) - - def _on_press(self, key, injected): - """The press callback. - - This is automatically registered upon creation. - - :param key: The key provided by the base class. - :param injected: Whether the event was injected. - """ - if not injected: - for hotkey in self._hotkeys: - hotkey.press(self.canonical(key)) - - def _on_release(self, key, injected): - """The release callback. - - This is automatically registered upon creation. - - :param key: The key provided by the base class. - :param injected: Whether the event was injected. - """ - if not injected: - for hotkey in self._hotkeys: - hotkey.release(self.canonical(key)) diff --git a/PortablePython/Lib/site-packages/pynput/keyboard/_base.py b/PortablePython/Lib/site-packages/pynput/keyboard/_base.py deleted file mode 100644 index 6035743..0000000 --- a/PortablePython/Lib/site-packages/pynput/keyboard/_base.py +++ /dev/null @@ -1,754 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -This module contains the base implementation. - -The actual interface to keyboard classes is defined here, but the -implementation is located in a platform dependent module. -""" - -# pylint: disable=R0903 -# We implement stubs - -import contextlib -import enum -import threading -import unicodedata - -import six - -from pynput._util import AbstractListener, prefix -from pynput import _logger - - -class KeyCode(object): - """ - A :class:`KeyCode` represents the description of a key code used by the - operating system. - """ - #: The names of attributes used as platform extensions. - _PLATFORM_EXTENSIONS = [] - - def __init__(self, vk=None, char=None, is_dead=False, **kwargs): - self.vk = vk - self.char = six.text_type(char) if char is not None else None - self.is_dead = is_dead - - if self.is_dead: - try: - self.combining = unicodedata.lookup( - 'COMBINING ' + unicodedata.name(self.char)) - except KeyError: - self.is_dead = False - self.combining = None - if self.is_dead and not self.combining: - raise KeyError(char) - else: - self.combining = None - - for key in self._PLATFORM_EXTENSIONS: - setattr(self, key, kwargs.pop(key, None)) - if kwargs: - raise ValueError(kwargs) - - - def __repr__(self): - if self.is_dead: - return '[%s]' % repr(self.char) - if self.char is not None: - return repr(self.char) - else: - return '<%d>' % self.vk - - def __str__(self): - return repr(self) - - def __eq__(self, other): - if not isinstance(other, self.__class__): - return False - if self.char is not None and other.char is not None: - return self.char == other.char and self.is_dead == other.is_dead - else: - return self.vk == other.vk and all( - getattr(self, f) == getattr(other, f) - for f in self._PLATFORM_EXTENSIONS) - - def __hash__(self): - return hash(repr(self)) - - def join(self, key): - """Applies this dead key to another key and returns the result. - - Joining a dead key with space (``' '``) or itself yields the non-dead - version of this key, if one exists; for example, - ``KeyCode.from_dead('~').join(KeyCode.from_char(' '))`` equals - ``KeyCode.from_char('~')`` and - ``KeyCode.from_dead('~').join(KeyCode.from_dead('~'))``. - - :param KeyCode key: The key to join with this key. - - :return: a key code - - :raises ValueError: if the keys cannot be joined - """ - # A non-dead key cannot be joined - if not self.is_dead: - raise ValueError(self) - - # Joining two of the same keycodes, or joining with space, yields the - # non-dead version of the key - if key.char == ' ' or self == key: - return self.from_char(self.char) - - # Otherwise we combine the characters - if key.char is not None: - combined = unicodedata.normalize( - 'NFC', - key.char + self.combining) - if combined: - return self.from_char(combined) - - raise ValueError(key) - - @classmethod - def from_vk(cls, vk, **kwargs): - """Creates a key from a virtual key code. - - :param vk: The virtual key code. - - :param kwargs: Any other parameters to pass. - - :return: a key code - """ - return cls(vk=vk, **kwargs) - - @classmethod - def from_char(cls, char, **kwargs): - """Creates a key from a character. - - :param str char: The character. - - :return: a key code - """ - return cls(char=char, **kwargs) - - @classmethod - def from_dead(cls, char, **kwargs): - """Creates a dead key. - - :param char: The dead key. This should be the unicode character - representing the stand alone character, such as ``'~'`` for - *COMBINING TILDE*. - - :return: a key code - """ - return cls(char=char, is_dead=True, **kwargs) - - -class Key(enum.Enum): - """A class representing various buttons that may not correspond to - letters. This includes modifier keys and function keys. - - The actual values for these items differ between platforms. Some platforms - may have additional buttons, but these are guaranteed to be present - everywhere. - """ - #: A generic Alt key. This is a modifier. - alt = KeyCode.from_vk(0) - - #: The left Alt key. This is a modifier. - alt_l = KeyCode.from_vk(0) - - #: The right Alt key. This is a modifier. - alt_r = KeyCode.from_vk(0) - - #: The AltGr key. This is a modifier. - alt_gr = KeyCode.from_vk(0) - - #: The Backspace key. - backspace = KeyCode.from_vk(0) - - #: The CapsLock key. - caps_lock = KeyCode.from_vk(0) - - #: A generic command button. On *PC* platforms, this corresponds to the - #: Super key or Windows key, and on *Mac* it corresponds to the Command - #: key. This may be a modifier. - cmd = KeyCode.from_vk(0) - - #: The left command button. On *PC* platforms, this corresponds to the - #: Super key or Windows key, and on *Mac* it corresponds to the Command - #: key. This may be a modifier. - cmd_l = KeyCode.from_vk(0) - - #: The right command button. On *PC* platforms, this corresponds to the - #: Super key or Windows key, and on *Mac* it corresponds to the Command - #: key. This may be a modifier. - cmd_r = KeyCode.from_vk(0) - - #: A generic Ctrl key. This is a modifier. - ctrl = KeyCode.from_vk(0) - - #: The left Ctrl key. This is a modifier. - ctrl_l = KeyCode.from_vk(0) - - #: The right Ctrl key. This is a modifier. - ctrl_r = KeyCode.from_vk(0) - - #: The Delete key. - delete = KeyCode.from_vk(0) - - #: A down arrow key. - down = KeyCode.from_vk(0) - - #: The End key. - end = KeyCode.from_vk(0) - - #: The Enter or Return key. - enter = KeyCode.from_vk(0) - - #: The Esc key. - esc = KeyCode.from_vk(0) - - #: The function keys. F1 to F20 are defined. - f1 = KeyCode.from_vk(0) - f2 = KeyCode.from_vk(0) - f3 = KeyCode.from_vk(0) - f4 = KeyCode.from_vk(0) - f5 = KeyCode.from_vk(0) - f6 = KeyCode.from_vk(0) - f7 = KeyCode.from_vk(0) - f8 = KeyCode.from_vk(0) - f9 = KeyCode.from_vk(0) - f10 = KeyCode.from_vk(0) - f11 = KeyCode.from_vk(0) - f12 = KeyCode.from_vk(0) - f13 = KeyCode.from_vk(0) - f14 = KeyCode.from_vk(0) - f15 = KeyCode.from_vk(0) - f16 = KeyCode.from_vk(0) - f17 = KeyCode.from_vk(0) - f18 = KeyCode.from_vk(0) - f19 = KeyCode.from_vk(0) - f20 = KeyCode.from_vk(0) - - #: The Home key. - home = KeyCode.from_vk(0) - - #: A left arrow key. - left = KeyCode.from_vk(0) - - #: The PageDown key. - page_down = KeyCode.from_vk(0) - - #: The PageUp key. - page_up = KeyCode.from_vk(0) - - #: A right arrow key. - right = KeyCode.from_vk(0) - - #: A generic Shift key. This is a modifier. - shift = KeyCode.from_vk(0) - - #: The left Shift key. This is a modifier. - shift_l = KeyCode.from_vk(0) - - #: The right Shift key. This is a modifier. - shift_r = KeyCode.from_vk(0) - - #: The Space key. - space = KeyCode.from_vk(0) - - #: The Tab key. - tab = KeyCode.from_vk(0) - - #: An up arrow key. - up = KeyCode.from_vk(0) - - #: The play/pause toggle. - media_play_pause = KeyCode.from_vk(0) - - #: The volume mute button. - media_volume_mute = KeyCode.from_vk(0) - - #: The volume down button. - media_volume_down = KeyCode.from_vk(0) - - #: The volume up button. - media_volume_up = KeyCode.from_vk(0) - - #: The previous track button. - media_previous = KeyCode.from_vk(0) - - #: The next track button. - media_next = KeyCode.from_vk(0) - - #: The Insert key. This may be undefined for some platforms. - insert = KeyCode.from_vk(0) - - #: The Menu key. This may be undefined for some platforms. - menu = KeyCode.from_vk(0) - - #: The NumLock key. This may be undefined for some platforms. - num_lock = KeyCode.from_vk(0) - - #: The Pause/Break key. This may be undefined for some platforms. - pause = KeyCode.from_vk(0) - - #: The PrintScreen key. This may be undefined for some platforms. - print_screen = KeyCode.from_vk(0) - - #: The ScrollLock key. This may be undefined for some platforms. - scroll_lock = KeyCode.from_vk(0) - - -class Controller(object): - """A controller for sending virtual keyboard events to the system. - """ - #: The virtual key codes - _KeyCode = KeyCode - - #: The various keys. - _Key = Key - - class InvalidKeyException(Exception): - """The exception raised when an invalid ``key`` parameter is passed to - either :meth:`Controller.press` or :meth:`Controller.release`. - - Its first argument is the ``key`` parameter. - """ - pass - - class InvalidCharacterException(Exception): - """The exception raised when an invalid character is encountered in - the string passed to :meth:`Controller.type`. - - Its first argument is the index of the character in the string, and the - second the character. - """ - pass - - def __init__(self): - self._log = _logger(self.__class__) - self._modifiers_lock = threading.RLock() - self._modifiers = set() - self._caps_lock = False - self._dead_key = None - - def press(self, key): - """Presses a key. - - A key may be either a string of length 1, one of the :class:`Key` - members or a :class:`KeyCode`. - - Strings will be transformed to :class:`KeyCode` using - :meth:`KeyCode.char`. Members of :class:`Key` will be translated to - their :meth:`~Key.value`. - - :param key: The key to press. - - :raises InvalidKeyException: if the key is invalid - - :raises ValueError: if ``key`` is a string, but its length is not ``1`` - """ - resolved = self._resolve(key) - if resolved is None: - raise self.InvalidKeyException(key) - self._update_modifiers(resolved, True) - - # Update caps lock state - if resolved == self._Key.caps_lock.value: - self._caps_lock = not self._caps_lock - - # If we currently have a dead key pressed, join it with this key - original = resolved - if self._dead_key: - try: - resolved = self._dead_key.join(resolved) - except ValueError: - self._handle(self._dead_key, True) - self._handle(self._dead_key, False) - - # If the key is a dead key, keep it for later - if resolved.is_dead: - self._dead_key = resolved - return - - try: - self._handle(resolved, True) - except self.InvalidKeyException: - if resolved != original: - self._handle(self._dead_key, True) - self._handle(self._dead_key, False) - self._handle(original, True) - - self._dead_key = None - - def release(self, key): - """Releases a key. - - A key may be either a string of length 1, one of the :class:`Key` - members or a :class:`KeyCode`. - - Strings will be transformed to :class:`KeyCode` using - :meth:`KeyCode.char`. Members of :class:`Key` will be translated to - their :meth:`~Key.value`. - - :param key: The key to release. If this is a string, it is passed to - :meth:`touches` and the returned releases are used. - - :raises InvalidKeyException: if the key is invalid - - :raises ValueError: if ``key`` is a string, but its length is not ``1`` - """ - resolved = self._resolve(key) - if resolved is None: - raise self.InvalidKeyException(key) - self._update_modifiers(resolved, False) - - # Ignore released dead keys - if resolved.is_dead: - return - - self._handle(resolved, False) - - def tap(self, key): - """Presses and releases a key. - - This is equivalent to the following code:: - - controller.press(key) - controller.release(key) - - :param key: The key to press. - - :raises InvalidKeyException: if the key is invalid - - :raises ValueError: if ``key`` is a string, but its length is not ``1`` - """ - self.press(key) - self.release(key) - - def touch(self, key, is_press): - """Calls either :meth:`press` or :meth:`release` depending on the value - of ``is_press``. - - :param key: The key to press or release. - - :param bool is_press: Whether to press the key. - - :raises InvalidKeyException: if the key is invalid - """ - if is_press: - self.press(key) - else: - self.release(key) - - @contextlib.contextmanager - def pressed(self, *args): - """Executes a block with some keys pressed. - - :param keys: The keys to keep pressed. - """ - for key in args: - self.press(key) - - try: - yield - finally: - for key in reversed(args): - self.release(key) - - def type(self, string): - """Types a string. - - This method will send all key presses and releases necessary to type - all characters in the string. - - :param str string: The string to type. - - :raises InvalidCharacterException: if an untypable character is - encountered - """ - from . import _CONTROL_CODES - for i, character in enumerate(string): - key = _CONTROL_CODES.get(character, character) - try: - self.press(key) - self.release(key) - - except (ValueError, self.InvalidKeyException): - raise self.InvalidCharacterException(i, character) - - @property - @contextlib.contextmanager - def modifiers(self): - """The currently pressed modifier keys. - - Please note that this reflects only the internal state of this - controller, and not the state of the operating system keyboard buffer. - This property cannot be used to determine whether a key is physically - pressed. - - Only the generic modifiers will be set; when pressing either - :attr:`Key.shift_l`, :attr:`Key.shift_r` or :attr:`Key.shift`, only - :attr:`Key.shift` will be present. - - Use this property within a context block thus:: - - with controller.modifiers as modifiers: - with_block() - - This ensures that the modifiers cannot be modified by another thread. - """ - with self._modifiers_lock: - yield set( - self._as_modifier(modifier) - for modifier in self._modifiers) - - @property - def alt_pressed(self): - """Whether any *alt* key is pressed. - - Please note that this reflects only the internal state of this - controller. See :attr:`modifiers` for more information. - """ - with self.modifiers as modifiers: - return self._Key.alt in modifiers - - @property - def alt_gr_pressed(self): - """Whether *altgr* is pressed. - - Please note that this reflects only the internal state of this - controller. See :attr:`modifiers` for more information. - """ - with self.modifiers as modifiers: - return self._Key.alt_gr in modifiers - - @property - def ctrl_pressed(self): - """Whether any *ctrl* key is pressed. - - Please note that this reflects only the internal state of this - controller. See :attr:`modifiers` for more information. - """ - with self.modifiers as modifiers: - return self._Key.ctrl in modifiers - - @property - def shift_pressed(self): - """Whether any *shift* key is pressed, or *caps lock* is toggled. - - Please note that this reflects only the internal state of this - controller. See :attr:`modifiers` for more information. - """ - if self._caps_lock: - return True - - with self.modifiers as modifiers: - return self._Key.shift in modifiers - - def _resolve(self, key): - """Resolves a key to a :class:`KeyCode` instance. - - This method will convert any key representing a character to uppercase - if a shift modifier is active. - - :param key: The key to resolve. - - :return: a key code, or ``None`` if it cannot be resolved - """ - # Use the value for the key constants - if key in (k for k in self._Key): - return key.value - - # Convert strings to key codes - if isinstance(key, six.string_types): - if len(key) != 1: - raise ValueError(key) - return self._KeyCode.from_char(key) - - # Assume this is a proper key - if isinstance(key, self._KeyCode): - if key.char is not None and self.shift_pressed: - return self._KeyCode(vk=key.vk, char=key.char.upper()) - else: - return key - - def _update_modifiers(self, key, is_press): - """Updates the current modifier list. - - If ``key`` is not a modifier, no action is taken. - - :param key: The key being pressed or released. - """ - # Check whether the key is a modifier - if self._as_modifier(key): - with self._modifiers_lock: - if is_press: - self._modifiers.add(key) - else: - try: - self._modifiers.remove(key) - except KeyError: - pass - - def _as_modifier(self, key): - """Returns a key as the modifier used internally if defined. - - This method will convert values like :attr:`Key.alt_r.value` and - :attr:`Key.shift_l.value` to :attr:`Key.alt` and :attr:`Key.shift`. - - :param key: The possible modifier key. - - :return: the base modifier key, or ``None`` if ``key`` is not a - modifier - """ - from . import _NORMAL_MODIFIERS - return _NORMAL_MODIFIERS.get(key, None) - - def _handle(self, key, is_press): - """The platform implementation of the actual emitting of keyboard - events. - - This is a platform dependent implementation. - - :param Key key: The key to handle. - - :param bool is_press: Whether this is a key press event. - """ - raise NotImplementedError() - - -# pylint: disable=W0223; This is also an abstract class -class Listener(AbstractListener): - """A listener for keyboard events. - - Instances of this class can be used as context managers. This is equivalent - to the following code:: - - listener.start() - try: - listener.wait() - with_statements() - finally: - listener.stop() - - This class inherits from :class:`threading.Thread` and supports all its - methods. It will set :attr:`daemon` to ``True`` when created. - - All callback arguments are optional; a callback may take less arguments - than actually passed, but not more, unless they are optional. - - :param callable on_press: The callback to call when a button is pressed. - - It will be called with the arguments ``(key, injected)``, where ``key`` - is a :class:`KeyCode`, a :class:`Key` or ``None`` if the key is - unknown, and ``injected`` whether the event was injected and thus not - generated by an actual input device. - - Please note that not all backends support ``injected`` and will always - set it to ``False``. - - :param callable on_release: The callback to call when a button is released. - - It will be called with the arguments ``(key, injected)``, where ``key`` - is a :class:`KeyCode`, a :class:`Key` or ``None`` if the key is - unknown, and ``injected`` whether the event was injected and thus not - generated by an actual input device. - - Please note that not all backends support ``injected`` and will always - set it to ``False``. - - :param bool suppress: Whether to suppress events. Setting this to ``True`` - will prevent the input events from being passed to the rest of the - system. - - :param kwargs: Any non-standard platform dependent options. These should be - prefixed with the platform name thus: ``darwin_``, ``uinput_``, - ``xorg_`` or ``win32_``. - - Supported values are: - - ``darwin_intercept`` - A callable taking the arguments ``(event_type, event)``, where - ``event_type`` is ``Quartz.kCGEventKeyDown`` or - ``Quartz.kCGEventKeyUp``, and ``event`` is a ``CGEventRef``. - - This callable can freely modify the event using functions like - ``Quartz.CGEventSetIntegerValueField``. If this callable does not - return the event, the event is suppressed system wide. - - ``uinput_device_paths`` - A list of device paths. - - If this is specified, *pynput* will limit the number of devices - checked for the capabilities needed to those passed, otherwise all - system devices will be used. Passing this might be required if an - incorrect device is chosen. - - ``win32_event_filter`` - A callable taking the arguments ``(msg, data)``, where ``msg`` is - the current message, and ``data`` associated data as a - `KBDLLHOOKSTRUCT `_. - - If this callback returns ``False``, the event will not be - propagated to the listener callback. - - If ``self.suppress_event()`` is called, the event is suppressed - system wide. - """ - def __init__(self, on_press=None, on_release=None, suppress=False, - **kwargs): - self._log = _logger(self.__class__) - option_prefix = prefix(Listener, self.__class__) - self._options = { - key[len(option_prefix):]: value - for key, value in kwargs.items() - if key.startswith(option_prefix)} - super(Listener, self).__init__( - on_press=self._wrap(on_press, 2), - on_release=self._wrap(on_release, 2), - suppress=suppress) -# pylint: enable=W0223 - - def canonical(self, key): - """Performs normalisation of a key. - - This method attempts to convert key events to their canonical form, so - that events will equal regardless of modifier state. - - This method will convert upper case keys to lower case keys, convert - any modifiers with a right and left version to the same value, and may - slow perform additional platform dependent normalisation. - - :param key: The key to normalise. - :type key: Key or KeyCode - - :return: a key - :rtype: Key or KeyCode - """ - from pynput.keyboard import Key, KeyCode, _NORMAL_MODIFIERS - if isinstance(key, KeyCode) and key.char is not None: - return KeyCode.from_char(key.char.lower()) - elif isinstance(key, Key) and key.value in _NORMAL_MODIFIERS: - return _NORMAL_MODIFIERS[key.value] - elif isinstance(key, Key) and key.value.vk is not None: - return KeyCode.from_vk(key.value.vk) - else: - return key diff --git a/PortablePython/Lib/site-packages/pynput/keyboard/_darwin.py b/PortablePython/Lib/site-packages/pynput/keyboard/_darwin.py deleted file mode 100644 index 4065164..0000000 --- a/PortablePython/Lib/site-packages/pynput/keyboard/_darwin.py +++ /dev/null @@ -1,367 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The keyboard implementation for *macOS*. -""" - -# pylint: disable=C0111 -# The documentation is extracted from the base classes - -# pylint: disable=R0903 -# We implement stubs - -import enum - -from Quartz import ( - CGEventCreateKeyboardEvent, - CGEventGetFlags, - CGEventGetIntegerValueField, - CGEventGetType, - CGEventKeyboardGetUnicodeString, - CGEventKeyboardSetUnicodeString, - CGEventMaskBit, - CGEventPost, - CGEventSetFlags, - kCGEventFlagMaskAlternate, - kCGEventFlagMaskCommand, - kCGEventFlagMaskControl, - kCGEventFlagMaskShift, - kCGEventFlagsChanged, - kCGEventKeyDown, - kCGEventKeyUp, - kCGHIDEventTap, - kCGKeyboardEventKeycode, - NSEvent, - NSSystemDefined) - -from pynput._util.darwin import ( - get_unicode_to_keycode_map, - keycode_context, - ListenerMixin) -from pynput._util.darwin_vks import SYMBOLS -from . import _base - - -# From hidsystem/ev_keymap.h -NX_KEYTYPE_PLAY = 16 -NX_KEYTYPE_MUTE = 7 -NX_KEYTYPE_SOUND_DOWN = 1 -NX_KEYTYPE_SOUND_UP = 0 -NX_KEYTYPE_NEXT = 17 -NX_KEYTYPE_PREVIOUS = 18 -NX_KEYTYPE_EJECT = 14 - -# pylint: disable=C0103; We want to use the names from the C API -# This is undocumented, but still widely known -kSystemDefinedEventMediaKeysSubtype = 8 - -# We extract this here since the name is very long -otherEventWithType = getattr( - NSEvent, - 'otherEventWithType_' - 'location_' - 'modifierFlags_' - 'timestamp_' - 'windowNumber_' - 'context_' - 'subtype_' - 'data1_' - 'data2_') -# pylint: enable=C0103 - - -class KeyCode(_base.KeyCode): - _PLATFORM_EXTENSIONS = ( - # Whether this is a media key - '_is_media', - ) - - # Be explicit about fields - _is_media = None - - @classmethod - def _from_media(cls, vk, **kwargs): - """Creates a media key from a key code. - - :param int vk: The key code. - - :return: a key code - """ - return cls.from_vk(vk, _is_media=True, **kwargs) - - def _event(self, modifiers, mapping, is_pressed): - """This key as a *Quartz* event. - - :param set modifiers: The currently active modifiers. - - :param mapping: The current keyboard mapping. - - :param bool is_press: Whether to generate a press event. - - :return: a *Quartz* event - """ - vk = self.vk or mapping.get(self.char) - if self._is_media: - result = otherEventWithType( - NSSystemDefined, - (0, 0), - 0xa00 if is_pressed else 0xb00, - 0, - 0, - 0, - 8, - (self.vk << 16) | ((0xa if is_pressed else 0xb) << 8), - -1).CGEvent() - else: - result = CGEventCreateKeyboardEvent( - None, 0 if vk is None else vk, is_pressed) - - CGEventSetFlags( - result, - 0 - | (kCGEventFlagMaskAlternate - if Key.alt in modifiers else 0) - - | (kCGEventFlagMaskCommand - if Key.cmd in modifiers else 0) - - | (kCGEventFlagMaskControl - if Key.ctrl in modifiers else 0) - - | (kCGEventFlagMaskShift - if Key.shift in modifiers else 0)) - - if vk is None and self.char is not None: - CGEventKeyboardSetUnicodeString( - result, len(self.char), self.char) - - return result - - -# pylint: disable=W0212 -class Key(enum.Enum): - # Default keys - alt = KeyCode.from_vk(0x3A) - alt_l = KeyCode.from_vk(0x3A) - alt_r = KeyCode.from_vk(0x3D) - alt_gr = KeyCode.from_vk(0x3D) - backspace = KeyCode.from_vk(0x33) - caps_lock = KeyCode.from_vk(0x39) - cmd = KeyCode.from_vk(0x37) - cmd_l = KeyCode.from_vk(0x37) - cmd_r = KeyCode.from_vk(0x36) - ctrl = KeyCode.from_vk(0x3B) - ctrl_l = KeyCode.from_vk(0x3B) - ctrl_r = KeyCode.from_vk(0x3E) - delete = KeyCode.from_vk(0x75) - down = KeyCode.from_vk(0x7D) - end = KeyCode.from_vk(0x77) - enter = KeyCode.from_vk(0x24) - esc = KeyCode.from_vk(0x35) - f1 = KeyCode.from_vk(0x7A) - f2 = KeyCode.from_vk(0x78) - f3 = KeyCode.from_vk(0x63) - f4 = KeyCode.from_vk(0x76) - f5 = KeyCode.from_vk(0x60) - f6 = KeyCode.from_vk(0x61) - f7 = KeyCode.from_vk(0x62) - f8 = KeyCode.from_vk(0x64) - f9 = KeyCode.from_vk(0x65) - f10 = KeyCode.from_vk(0x6D) - f11 = KeyCode.from_vk(0x67) - f12 = KeyCode.from_vk(0x6F) - f13 = KeyCode.from_vk(0x69) - f14 = KeyCode.from_vk(0x6B) - f15 = KeyCode.from_vk(0x71) - f16 = KeyCode.from_vk(0x6A) - f17 = KeyCode.from_vk(0x40) - f18 = KeyCode.from_vk(0x4F) - f19 = KeyCode.from_vk(0x50) - f20 = KeyCode.from_vk(0x5A) - home = KeyCode.from_vk(0x73) - left = KeyCode.from_vk(0x7B) - page_down = KeyCode.from_vk(0x79) - page_up = KeyCode.from_vk(0x74) - right = KeyCode.from_vk(0x7C) - shift = KeyCode.from_vk(0x38) - shift_l = KeyCode.from_vk(0x38) - shift_r = KeyCode.from_vk(0x3C) - space = KeyCode.from_vk(0x31, char=' ') - tab = KeyCode.from_vk(0x30) - up = KeyCode.from_vk(0x7E) - - media_play_pause = KeyCode._from_media(NX_KEYTYPE_PLAY) - media_volume_mute = KeyCode._from_media(NX_KEYTYPE_MUTE) - media_volume_down = KeyCode._from_media(NX_KEYTYPE_SOUND_DOWN) - media_volume_up = KeyCode._from_media(NX_KEYTYPE_SOUND_UP) - media_previous = KeyCode._from_media(NX_KEYTYPE_PREVIOUS) - media_next = KeyCode._from_media(NX_KEYTYPE_NEXT) - media_eject = KeyCode._from_media(NX_KEYTYPE_EJECT) -# pylint: enable=W0212 - - -class Controller(_base.Controller): - _KeyCode = KeyCode - _Key = Key - - def __init__(self): - super(Controller, self).__init__() - self._mapping = get_unicode_to_keycode_map() - - def _handle(self, key, is_press): - with self.modifiers as modifiers: - CGEventPost( - kCGHIDEventTap, - (key if key not in (k for k in Key) else key.value)._event( - modifiers, self._mapping, is_press)) - - -class Listener(ListenerMixin, _base.Listener): - #: The events that we listen to - _EVENTS = ( - CGEventMaskBit(kCGEventKeyDown) | - CGEventMaskBit(kCGEventKeyUp) | - CGEventMaskBit(kCGEventFlagsChanged) | - CGEventMaskBit(NSSystemDefined) - ) - - # pylint: disable=W0212 - #: A mapping from keysym to special key - _SPECIAL_KEYS = { - (key.value.vk, key.value._is_media): key - for key in Key} - # pylint: enable=W0212 - - #: The event flags set for the various modifier keys - _MODIFIER_FLAGS = { - Key.alt: kCGEventFlagMaskAlternate, - Key.alt_l: kCGEventFlagMaskAlternate, - Key.alt_r: kCGEventFlagMaskAlternate, - Key.cmd: kCGEventFlagMaskCommand, - Key.cmd_l: kCGEventFlagMaskCommand, - Key.cmd_r: kCGEventFlagMaskCommand, - Key.ctrl: kCGEventFlagMaskControl, - Key.ctrl_l: kCGEventFlagMaskControl, - Key.ctrl_r: kCGEventFlagMaskControl, - Key.shift: kCGEventFlagMaskShift, - Key.shift_l: kCGEventFlagMaskShift, - Key.shift_r: kCGEventFlagMaskShift} - - def __init__(self, *args, **kwargs): - super(Listener, self).__init__(*args, **kwargs) - self._flags = 0 - self._context = None - self._intercept = self._options.get( - 'intercept', - None) - - def _run(self): - with keycode_context() as context: - self._context = context - try: - super(Listener, self)._run() - finally: - self._context = None - - def _handle_message(self, _proxy, event_type, event, _refcon, injected): - # Convert the event to a KeyCode; this may fail, and in that case we - # pass None - try: - key = self._event_to_key(event) - except IndexError: - key = None - - try: - if event_type == kCGEventKeyDown: - # This is a normal key press - self.on_press(key, injected) - - elif event_type == kCGEventKeyUp: - # This is a normal key release - self.on_release(key, injected) - - elif key == Key.caps_lock: - # We only get an event when caps lock is toggled, so we fake - # press and release - self.on_press(key, injected) - self.on_release(key, injected) - - elif event_type == NSSystemDefined: - sys_event = NSEvent.eventWithCGEvent_(event) - if sys_event.subtype() == kSystemDefinedEventMediaKeysSubtype: - # The key in the special key dict; True since it is a media - # key - key = ((sys_event.data1() & 0xffff0000) >> 16, True) - if key in self._SPECIAL_KEYS: - flags = sys_event.data1() & 0x0000ffff - is_press = ((flags & 0xff00) >> 8) == 0x0a - if is_press: - self.on_press(self._SPECIAL_KEYS[key]) - else: - self.on_release(self._SPECIAL_KEYS[key]) - - else: - # This is a modifier event---excluding caps lock---for which we - # must check the current modifier state to determine whether - # the key was pressed or released - flags = CGEventGetFlags(event) - is_press = flags & self._MODIFIER_FLAGS.get(key, 0) - if is_press: - self.on_press(key, injected) - else: - self.on_release(key, injected) - - finally: - # Store the current flag mask to be able to detect modifier state - # changes - self._flags = CGEventGetFlags(event) - - def _event_to_key(self, event): - """Converts a *Quartz* event to a :class:`KeyCode`. - - :param event: The event to convert. - - :return: a :class:`pynput.keyboard.KeyCode` - - :raises IndexError: if the key code is invalid - """ - vk = CGEventGetIntegerValueField( - event, kCGKeyboardEventKeycode) - event_type = CGEventGetType(event) - is_media = True if event_type == NSSystemDefined else None - - # First try special keys... - key = (vk, is_media) - if key in self._SPECIAL_KEYS: - return self._SPECIAL_KEYS[key] - - # ...then try characters... - length, chars = CGEventKeyboardGetUnicodeString( - event, 100, None, None) - try: - printable = chars.isprintable() - except AttributeError: - printable = chars.isalnum() - if not printable and vk in SYMBOLS \ - and CGEventGetFlags(event) \ - & kCGEventFlagMaskControl: - return KeyCode.from_char(SYMBOLS[vk], vk=vk) - elif length > 0: - return KeyCode.from_char(chars, vk=vk) - - # ...and fall back on a virtual key code - return KeyCode.from_vk(vk) diff --git a/PortablePython/Lib/site-packages/pynput/keyboard/_dummy.py b/PortablePython/Lib/site-packages/pynput/keyboard/_dummy.py deleted file mode 100644 index 10727f6..0000000 --- a/PortablePython/Lib/site-packages/pynput/keyboard/_dummy.py +++ /dev/null @@ -1,23 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -This module contains a dummy implementation. - -It cannot be used, but importing it will not raise any exceptions. -""" - -from ._base import Controller, Key, KeyCode, Listener diff --git a/PortablePython/Lib/site-packages/pynput/keyboard/_uinput.py b/PortablePython/Lib/site-packages/pynput/keyboard/_uinput.py deleted file mode 100644 index 2f63dd3..0000000 --- a/PortablePython/Lib/site-packages/pynput/keyboard/_uinput.py +++ /dev/null @@ -1,446 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The keyboard implementation for *uinput*. -""" - -# pylint: disable=C0111 -# The documentation is extracted from the base classes - -# pylint: disable=R0903 -# We implement stubs - -import enum -import errno -import functools -import os -import re -import subprocess - -import evdev - -from evdev.events import KeyEvent - -from pynput._util import xorg_keysyms -from pynput._util.uinput import ListenerMixin -from . import _base - - -class KeyCode(_base.KeyCode): - _PLATFORM_EXTENSIONS = ( - # The name for this key - '_x_name', - '_kernel_name', - ) - - # Be explicit about fields - _x_name = None - _kernel_name = None -# pylint: enable=W0212 - - @classmethod - def _from_name(cls, x_name, kernel_name, **kwargs): - """Creates a key from a name. - - :param str x_name: The X name. - - :param str kernel_name: The kernel name. - - :return: a key code - """ - try: - vk = getattr(evdev.ecodes, kernel_name) - except AttributeError: - vk = None - return cls.from_vk( - vk, _x_name=x_name, _kernel_name=kernel_name, **kwargs) - - -# pylint: disable=W0212 -class Key(enum.Enum): - alt = KeyCode._from_name('Alt_L', 'KEY_LEFTALT') - alt_l = KeyCode._from_name('Alt_L', 'KEY_LEFTALT') - alt_r = KeyCode._from_name('Alt_R', 'KEY_RIGHTALT') - alt_gr = KeyCode._from_name('Mode_switch', 'KEY_RIGHTALT') - backspace = KeyCode._from_name('BackSpace', 'KEY_BACKSPACE') - caps_lock = KeyCode._from_name('Caps_Lock', 'KEY_CAPSLOCK') - cmd = KeyCode._from_name('Super_L', 'KEY_LEFTMETA') - cmd_l = KeyCode._from_name('Super_L', 'KEY_LEFTMETA') - cmd_r = KeyCode._from_name('Super_R', 'KEY_RIGHTMETA') - ctrl = KeyCode._from_name('Control_L', 'KEY_LEFTCTRL') - ctrl_l = KeyCode._from_name('Control_L', 'KEY_LEFTCTRL') - ctrl_r = KeyCode._from_name('Control_R', 'KEY_RIGHTCTRL') - delete = KeyCode._from_name('Delete', 'KEY_DELETE') - down = KeyCode._from_name('Down', 'KEY_DOWN') - end = KeyCode._from_name('End', 'KEY_END') - enter = KeyCode._from_name('Return', 'KEY_ENTER') - esc = KeyCode._from_name('Escape', 'KEY_ESC') - f1 = KeyCode._from_name('F1', 'KEY_F1') - f2 = KeyCode._from_name('F2', 'KEY_F2') - f3 = KeyCode._from_name('F3', 'KEY_F3') - f4 = KeyCode._from_name('F4', 'KEY_F4') - f5 = KeyCode._from_name('F5', 'KEY_F5') - f6 = KeyCode._from_name('F6', 'KEY_F6') - f7 = KeyCode._from_name('F7', 'KEY_F7') - f8 = KeyCode._from_name('F8', 'KEY_F8') - f9 = KeyCode._from_name('F9', 'KEY_F9') - f10 = KeyCode._from_name('F10', 'KEY_F10') - f11 = KeyCode._from_name('F11', 'KEY_F11') - f12 = KeyCode._from_name('F12', 'KEY_F12') - f13 = KeyCode._from_name('F13', 'KEY_F13') - f14 = KeyCode._from_name('F14', 'KEY_F14') - f15 = KeyCode._from_name('F15', 'KEY_F15') - f16 = KeyCode._from_name('F16', 'KEY_F16') - f17 = KeyCode._from_name('F17', 'KEY_F17') - f18 = KeyCode._from_name('F18', 'KEY_F18') - f19 = KeyCode._from_name('F19', 'KEY_F19') - f20 = KeyCode._from_name('F20', 'KEY_F20') - home = KeyCode._from_name('Home', 'KEY_HOME') - left = KeyCode._from_name('Left', 'KEY_LEFT') - page_down = KeyCode._from_name('Page_Down', 'KEY_PAGEDOWN') - page_up = KeyCode._from_name('Page_Up', 'KEY_PAGEUP') - right = KeyCode._from_name('Right', 'KEY_RIGHT') - shift = KeyCode._from_name('Shift_L', 'KEY_LEFTSHIFT') - shift_l = KeyCode._from_name('Shift_L', 'KEY_LEFTSHIFT') - shift_r = KeyCode._from_name('Shift_R', 'KEY_RIGHTSHIFT') - space = KeyCode._from_name('space', 'KEY_SPACE', char=' ') - tab = KeyCode._from_name('Tab', 'KEY_TAB', char='\t') - up = KeyCode._from_name('Up', 'KEY_UP') - - media_play_pause = KeyCode._from_name('Play', 'KEY_PLAYPAUSE') - media_volume_mute = KeyCode._from_name('Mute', 'KEY_MUTE') - media_volume_down = KeyCode._from_name('LowerVolume', 'KEY_VOLUMEDOWN') - media_volume_up = KeyCode._from_name('RaiseVolume', 'KEY_VOLUMEUP') - media_previous = KeyCode._from_name('Prev', 'KEY_PREVIOUSSONG') - media_next = KeyCode._from_name('Next', 'KEY_NEXTSONG') - - insert = KeyCode._from_name('Insert', 'KEY_INSERT') - menu = KeyCode._from_name('Menu', 'KEY_MENU') - num_lock = KeyCode._from_name('Num_Lock', 'KEY_NUMLOCK') - pause = KeyCode._from_name('Pause', 'KEY_PAUSE') - print_screen = KeyCode._from_name('Print', 'KEY_SYSRQ') - scroll_lock = KeyCode._from_name('Scroll_Lock', 'KEY_SCROLLLOCK') -# pylint: enable=W0212 - - -class Layout(object): - """A description of the keyboard layout. - """ - #: A regular expression to parse keycodes in the dumpkeys output - #: - #: The groups are: keycode number, key names. - KEYCODE_RE = re.compile( - r'keycode\s+(\d+)\s+=(.*)') - - class Key(object): - """A key in a keyboard layout. - """ - def __init__(self, normal, shifted, alt, alt_shifted): - self._values = ( - normal, - shifted, - alt, - alt_shifted) - - def __str__(self): - return ('<' - 'normal: {}, ' - 'shifted: {}, ' - 'alternative: {}, ' - 'shifted alternative: {}>').format( - self.normal, self.shifted, self.alt, self.alt_shifted) - - __repr__ = __str__ - - def __iter__(self): - return iter(self._values) - - def __getitem__(self, i): - return self._values[i] - - @property - def normal(self): - """The normal key. - """ - return self._values[0] - - @property - def shifted(self): - """The shifted key. - """ - return self._values[1] - - @property - def alt(self): - """The alternative key. - """ - return self._values[2] - - @property - def alt_shifted(self): - """The shifted alternative key. - """ - return self._values[3] - - def __init__(self): - def as_char(k): - return k.value.char if isinstance(k, Key) else k.char - self._vk_table = self._load() - self._char_table = { - as_char(key): ( - vk, - set() - | {Key.shift} if i & 1 else set() - | {Key.alt_gr} if i & 2 else set()) - for vk, keys in self._vk_table.items() - for i, key in enumerate(keys) - if key is not None and as_char(key) is not None} - - def for_vk(self, vk, modifiers): - """Reads a key for a virtual key code and modifier state. - - :param int vk: The virtual key code. - - :param set modifiers: A set of modifiers. - - :return: a mapped key - - :raises KeyError: if ``vk`` is an unknown key - """ - return self._vk_table[vk][ - 0 - | (1 if Key.shift in modifiers else 0) - | (2 if Key.alt_gr in modifiers else 0)] - - def for_char(self, char): - """Reads a virtual key code and modifier state for a character. - - :param str char: The character. - - :return: the tuple ``(vk, modifiers)`` - - :raises KeyError: if ``vk`` is an unknown key - """ - return self._char_table[char] - - @functools.lru_cache() - def _load(self): - """Loads the keyboard layout. - - For simplicity, we call out to the ``dumpkeys`` binary. In the future, - we may want to implement this ourselves. - """ - result = {} - for keycode, names in self.KEYCODE_RE.findall( - subprocess.check_output( - ['dumpkeys', '--full-table', '--keys-only']).decode('utf-8')): - vk = int(keycode) - keys = tuple( - self._parse(vk, name) - for name in names.split()[:4]) - if any(key is not None for key in keys): - result[vk] = self.Key(*keys) - return result - - def _parse(self, vk, name): - """Parses a single key from the ``dumpkeys`` output. - - :param int vk: The key code. - - :param str name: The key name. - - :return: a key representation - """ - try: - # First try special keys... - return next( - key - for key in Key - if key.value._x_name == name) - except StopIteration: - # ...then characters... - try: - _, char = xorg_keysyms.SYMBOLS[name.lstrip('+')] - if char: - return KeyCode.from_char(char, vk=vk) - except KeyError: - pass - - # ...and finally special dumpkeys names - try: - return KeyCode.from_char({ - 'one': '1', - 'two': '2', - 'three': '3', - 'four': '4', - 'five': '5', - 'six': '6', - 'seven': '7', - 'eight': '8', - 'nine': '9', - 'zero': '0'}[name]) - except KeyError: - pass - - -class Controller(_base.Controller): - _KeyCode = KeyCode - _Key = Key - - def __init__(self, *args, **kwargs): - super(Controller, self).__init__(*args, **kwargs) - self._layout = LAYOUT - self._dev = evdev.UInput() - - def __del__(self): - if hasattr(self, '_dev'): - self._dev.close() - - def _handle(self, key, is_press): - # Resolve the key to a virtual key code and a possible set of required - # modifiers - try: - vk, required_modifiers = self._to_vk_and_modifiers(key) - except ValueError: - raise self.InvalidKeyException(key) - - # Determine how we need to modify the modifier state - if is_press and required_modifiers is not None: - with self.modifiers as modifiers: - vk, required_modifiers = self._layout.for_char(key.char) - to_press = { - getattr(evdev.ecodes, key.value._kernel_name) - for key in (required_modifiers - modifiers)} - to_release = { - getattr(evdev.ecodes, key.value._kernel_name) - for key in (modifiers - required_modifiers)} - else: - to_release = set() - to_press = set() - - # Update the modifier state, send the key, and finally release any - # modifiers - cleanup = [] - try: - for k in to_release: - self._send(k, False) - cleanup.append((k, True)) - for k in to_press: - self._send(k, True) - cleanup.append((k, False)) - - self._send(vk, is_press) - - finally: - for e in reversed(cleanup): - # pylint: disable E722; we want to suppress exceptions - try: - self._send(*e) - except: - pass - # pylint: enable E722 - - self._dev.syn() - - def _to_vk_and_modifiers(self, key): - """Resolves a key to a virtual key code and a modifier set. - - :param key: The key to resolve. - :type key: Key or KeyCode - - :return: a virtual key code and possible required modifiers - """ - if hasattr(key, 'vk') and key.vk is not None: - return (key.vk, None) - elif hasattr(key, 'char') and key.char is not None: - return self._layout.for_char(key.char) - else: - raise ValueError(key) - - def _send(self, vk, is_press): - """Sends a virtual key event. - - This method does not perform ``SYN``. - - :param int vk: The virtual key. - - :param bool is_press: Whether this is a press event. - """ - self._dev.write(evdev.ecodes.EV_KEY, vk, int(is_press)) - - -class Listener(ListenerMixin, _base.Listener): - _EVENTS = ( - evdev.ecodes.EV_KEY,) - - #: A - _MODIFIERS = { - Key.alt.value.vk: Key.alt, - Key.alt_l.value.vk: Key.alt, - Key.alt_r.value.vk: Key.alt, - Key.alt_gr.value.vk: Key.alt_gr, - Key.shift.value.vk: Key.shift, - Key.shift_l.value.vk: Key.shift, - Key.shift_r.value.vk: Key.shift} - - def __init__(self, *args, **kwargs): - super(Listener, self).__init__(*args, **kwargs) - self._layout = LAYOUT - self._modifiers = set() - - def _handle_message(self, event): - is_press = event.value in (KeyEvent.key_down, KeyEvent.key_hold) - vk = event.code - - # Update the modifier state - if vk in self._MODIFIERS: - modifier = self._MODIFIERS[vk] - if is_press: - self._modifiers.add(modifier) - elif modifier in self._modifiers: - self._modifiers.remove(modifier) - - # Attempt to map the virtual key code to a key - try: - key = self._layout.for_vk(vk, self._modifiers) - except KeyError: - try: - key = next( - key - for key in Key - if key.value.vk == vk) - except StopIteration: - key = KeyCode.from_vk(vk) - - # We do not know whether these events are injected - if is_press: - self.on_press(key, False) - else: - self.on_release(key, False) - - -try: - #: The keyboard layout. - LAYOUT = Layout() -except subprocess.CalledProcessError as e: - raise ImportError('failed to load keyboard layout: "' + str(e) + ( - '"; please make sure you are root' if os.getuid() != 1 else '"')) -except OSError as e: - raise ImportError({ - errno.ENOENT: 'the binary dumpkeys is not installed'}.get( - e.args[0], - str(e))) diff --git a/PortablePython/Lib/site-packages/pynput/keyboard/_win32.py b/PortablePython/Lib/site-packages/pynput/keyboard/_win32.py deleted file mode 100644 index fbbcc98..0000000 --- a/PortablePython/Lib/site-packages/pynput/keyboard/_win32.py +++ /dev/null @@ -1,389 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The keyboard implementation for *Windows*. -""" - -# pylint: disable=C0111 -# The documentation is extracted from the base classes - -# pylint: disable=R0903 -# We implement stubs - -import contextlib -import ctypes -import enum -import six - -from ctypes import wintypes - -import pynput._util.win32_vks as VK - -from pynput._util import AbstractListener -from pynput._util.win32 import ( - INPUT, - INPUT_union, - KEYBDINPUT, - KeyTranslator, - ListenerMixin, - MapVirtualKey, - SendInput, - SystemHook, - VkKeyScan) -from . import _base - - -class KeyCode(_base.KeyCode): - _PLATFORM_EXTENSIONS = ( - # Any extra flags. - '_flags', - - #: The scan code. - '_scan', - ) - - # Be explicit about fields - _flags = None - _scan = None - - def _parameters(self, is_press): - """The parameters to pass to ``SendInput`` to generate this key. - - :param bool is_press: Whether to generate a press event. - - :return: all arguments to pass to ``SendInput`` for this key - - :rtype: dict - - :raise ValueError: if this key is a unicode character that cannot be - represented by a single UTF-16 value - """ - if self.vk: - vk = self.vk - scan = self._scan \ - or MapVirtualKey(vk, MapVirtualKey.MAPVK_VK_TO_VSC) - flags = 0 - elif ord(self.char) > 0xFFFF: - raise ValueError - else: - res = VkKeyScan(self.char) - if (res >> 8) & 0xFF == 0: - vk = res & 0xFF - scan = self._scan \ - or MapVirtualKey(vk, MapVirtualKey.MAPVK_VK_TO_VSC) - flags = 0 - else: - vk = 0 - scan = ord(self.char) - flags = KEYBDINPUT.UNICODE - state_flags = (KEYBDINPUT.KEYUP if not is_press else 0) - return dict( - dwFlags=(self._flags or 0) | flags | state_flags, - wVk=vk, - wScan=scan) - - @classmethod - def _from_ext(cls, vk, **kwargs): - """Creates an extended key code. - - :param vk: The virtual key code. - - :param kwargs: Any other parameters to pass. - - :return: a key code - """ - return cls.from_vk(vk, _flags=KEYBDINPUT.EXTENDEDKEY, **kwargs) - - -# pylint: disable=W0212 -class Key(enum.Enum): - alt = KeyCode.from_vk(VK.MENU) - alt_l = KeyCode.from_vk(VK.LMENU) - alt_r = KeyCode._from_ext(VK.RMENU) - alt_gr = KeyCode.from_vk(VK.RMENU) - backspace = KeyCode.from_vk(VK.BACK) - caps_lock = KeyCode.from_vk(VK.CAPITAL) - cmd = KeyCode.from_vk(VK.LWIN) - cmd_l = KeyCode.from_vk(VK.LWIN) - cmd_r = KeyCode.from_vk(VK.RWIN) - ctrl = KeyCode.from_vk(VK.CONTROL) - ctrl_l = KeyCode.from_vk(VK.LCONTROL) - ctrl_r = KeyCode._from_ext(VK.RCONTROL) - delete = KeyCode._from_ext(VK.DELETE) - down = KeyCode._from_ext(VK.DOWN) - end = KeyCode._from_ext(VK.END) - enter = KeyCode.from_vk(VK.RETURN) - esc = KeyCode.from_vk(VK.ESCAPE) - f1 = KeyCode.from_vk(VK.F1) - f2 = KeyCode.from_vk(VK.F2) - f3 = KeyCode.from_vk(VK.F3) - f4 = KeyCode.from_vk(VK.F4) - f5 = KeyCode.from_vk(VK.F5) - f6 = KeyCode.from_vk(VK.F6) - f7 = KeyCode.from_vk(VK.F7) - f8 = KeyCode.from_vk(VK.F8) - f9 = KeyCode.from_vk(VK.F9) - f10 = KeyCode.from_vk(VK.F10) - f11 = KeyCode.from_vk(VK.F11) - f12 = KeyCode.from_vk(VK.F12) - f13 = KeyCode.from_vk(VK.F13) - f14 = KeyCode.from_vk(VK.F14) - f15 = KeyCode.from_vk(VK.F15) - f16 = KeyCode.from_vk(VK.F16) - f17 = KeyCode.from_vk(VK.F17) - f18 = KeyCode.from_vk(VK.F18) - f19 = KeyCode.from_vk(VK.F19) - f20 = KeyCode.from_vk(VK.F20) - f21 = KeyCode.from_vk(VK.F21) - f22 = KeyCode.from_vk(VK.F22) - f23 = KeyCode.from_vk(VK.F23) - f24 = KeyCode.from_vk(VK.F24) - home = KeyCode._from_ext(VK.HOME) - left = KeyCode._from_ext(VK.LEFT) - page_down = KeyCode._from_ext(VK.NEXT) - page_up = KeyCode._from_ext(VK.PRIOR) - right = KeyCode._from_ext(VK.RIGHT) - shift = KeyCode.from_vk(VK.LSHIFT) - shift_l = KeyCode.from_vk(VK.LSHIFT) - shift_r = KeyCode.from_vk(VK.RSHIFT) - space = KeyCode.from_vk(VK.SPACE, char=' ') - tab = KeyCode.from_vk(VK.TAB) - up = KeyCode._from_ext(VK.UP) - - media_play_pause = KeyCode._from_ext(VK.MEDIA_PLAY_PAUSE) - media_stop = KeyCode._from_ext(VK.MEDIA_STOP) - media_volume_mute = KeyCode._from_ext(VK.VOLUME_MUTE) - media_volume_down = KeyCode._from_ext(VK.VOLUME_DOWN) - media_volume_up = KeyCode._from_ext(VK.VOLUME_UP) - media_previous = KeyCode._from_ext(VK.MEDIA_PREV_TRACK) - media_next = KeyCode._from_ext(VK.MEDIA_NEXT_TRACK) - - insert = KeyCode._from_ext(VK.INSERT) - menu = KeyCode.from_vk(VK.APPS) - num_lock = KeyCode._from_ext(VK.NUMLOCK) - pause = KeyCode.from_vk(VK.PAUSE) - print_screen = KeyCode._from_ext(VK.SNAPSHOT) - scroll_lock = KeyCode.from_vk(VK.SCROLL) -# pylint: enable=W0212 - - -class Controller(_base.Controller): - _KeyCode = KeyCode - _Key = Key - - def __init__(self, *args, **kwargs): - super(Controller, self).__init__(*args, **kwargs) - - def _handle(self, key, is_press): - try: - SendInput( - 1, - ctypes.byref(INPUT( - type=INPUT.KEYBOARD, - value=INPUT_union( - ki=KEYBDINPUT(**key._parameters(is_press))))), - ctypes.sizeof(INPUT)) - except ValueError: - # If key._parameters raises ValueError, the key is a unicode - # characters outsice of the range of a single UTF-16 value, and we - # must break it up into its surrogates - byte_data = bytearray(key.char.encode('utf-16le')) - surrogates = [ - byte_data[i] | (byte_data[i + 1] << 8) - for i in range(0, len(byte_data), 2)] - - state_flags = KEYBDINPUT.UNICODE \ - | (KEYBDINPUT.KEYUP if not is_press else 0) - - SendInput( - len(surrogates), - (INPUT * len(surrogates))(*( - INPUT( - INPUT.KEYBOARD, - INPUT_union( - ki=KEYBDINPUT( - dwFlags=state_flags, - wScan=scan))) - for scan in surrogates)), - ctypes.sizeof(INPUT)) - - -class Listener(ListenerMixin, _base.Listener): - #: The Windows hook ID for low level keyboard events, ``WH_KEYBOARD_LL`` - _EVENTS = 13 - - _WM_INPUTLANGCHANGE = 0x0051 - _WM_KEYDOWN = 0x0100 - _WM_KEYUP = 0x0101 - _WM_SYSKEYDOWN = 0x0104 - _WM_SYSKEYUP = 0x0105 - - # A bit flag attached to messages indicating that the payload is an actual - # UTF-16 character code - _UTF16_FLAG = 0x1000 - - # A bit flag attached to messages indicating that the event was injected - _INJECTED_FLAG = 0x2000 - - # A special virtual key code designating unicode characters - _VK_PACKET = 0xE7 - - #: The messages that correspond to a key press - _PRESS_MESSAGES = (_WM_KEYDOWN, _WM_SYSKEYDOWN) - - #: The messages that correspond to a key release - _RELEASE_MESSAGES = (_WM_KEYUP, _WM_SYSKEYUP) - - #: Additional window messages to propagate to the subclass handler. - _WM_NOTIFICATIONS = ( - _WM_INPUTLANGCHANGE, - ) - - #: A mapping from keysym to special key - _SPECIAL_KEYS = { - key.value.vk: key - for key in Key} - - _HANDLED_EXCEPTIONS = ( - SystemHook.SuppressException,) - - class _KBDLLHOOKSTRUCT(ctypes.Structure): - """Contains information about a mouse event passed to a - ``WH_KEYBOARD_LL`` hook procedure, ``LowLevelKeyboardProc``. - """ - LLKHF_INJECTED = 0x00000010 - LLKHF_LOWER_IL_INJECTED = 0x00000002 - _fields_ = [ - ('vkCode', wintypes.DWORD), - ('scanCode', wintypes.DWORD), - ('flags', wintypes.DWORD), - ('time', wintypes.DWORD), - ('dwExtraInfo', ctypes.c_void_p)] - - #: A pointer to a :class:`KBDLLHOOKSTRUCT` - _LPKBDLLHOOKSTRUCT = ctypes.POINTER(_KBDLLHOOKSTRUCT) - - def __init__(self, *args, **kwargs): - super(Listener, self).__init__(*args, **kwargs) - self._translator = KeyTranslator() - self._event_filter = self._options.get( - 'event_filter', - lambda msg, data: True) - - def _convert(self, code, msg, lpdata): - if code != SystemHook.HC_ACTION: - return - - data = ctypes.cast(lpdata, self._LPKBDLLHOOKSTRUCT).contents - is_packet = data.vkCode == self._VK_PACKET - injected = (data.flags & (0 - | self._KBDLLHOOKSTRUCT.LLKHF_INJECTED - | self._KBDLLHOOKSTRUCT.LLKHF_LOWER_IL_INJECTED)) != 0 - message = (msg - | (self._UTF16_FLAG if is_packet else 0) - | (self._INJECTED_FLAG if injected else 0)) - - # Suppress further propagation of the event if it is filtered - if self._event_filter(msg, data) is False: - return None - elif is_packet: - return (message, data.scanCode) - else: - return (message, data.vkCode) - - @AbstractListener._emitter - def _process(self, wparam, lparam): - msg = wparam - vk = lparam - - # If the key has the UTF-16 flag, we treat it as a unicode character, - # otherwise convert the event to a KeyCode; this may fail, and in that - # case we pass None - is_utf16 = msg & self._UTF16_FLAG - injected = bool(msg & self._INJECTED_FLAG) - message = msg & ~(self._UTF16_FLAG | self._INJECTED_FLAG) - if is_utf16: - scan = vk - key = KeyCode.from_char(six.unichr(scan)) - else: - try: - key = self._event_to_key(msg, vk) - except OSError: - key = None - - if message in self._PRESS_MESSAGES: - self.on_press(key, injected) - - elif message in self._RELEASE_MESSAGES: - self.on_release(key, injected) - - # pylint: disable=R0201 - @contextlib.contextmanager - def _receive(self): - """An empty context manager; we do not need to fake keyboard events. - """ - yield - # pylint: enable=R0201 - - def _on_notification(self, code, wparam, lparam): - """Receives ``WM_INPUTLANGCHANGE`` and updates the cached layout. - """ - if code == self._WM_INPUTLANGCHANGE: - self._translator.update_layout() - - def _event_to_key(self, msg, vk): - """Converts an :class:`_KBDLLHOOKSTRUCT` to a :class:`KeyCode`. - - :param msg: The message received. - - :param vk: The virtual key code to convert. - - :return: a :class:`pynput.keyboard.KeyCode` - - :raises OSError: if the message and data could not be converted - """ - # If the virtual key code corresponds to a Key value, we prefer that - if vk in self._SPECIAL_KEYS: - return self._SPECIAL_KEYS[vk] - else: - return KeyCode(**self._translate( - vk, - msg in self._PRESS_MESSAGES)) - - def _translate(self, vk, is_press): - """Translates a virtual key code to a parameter list passable to - :class:`pynput.keyboard.KeyCode`. - - :param int vk: The virtual key code. - - :param bool is_press: Whether this is a press event. - - :return: a parameter list to the :class:`pynput.keyboard.KeyCode` - constructor - """ - return self._translator(vk, is_press) - - def canonical(self, key): - # If the key has a scan code, and we can find the character for it, - # return that, otherwise call the super class - scan = getattr(key, '_scan', None) - if scan is not None: - char = self._translator.char_from_scan(scan) - if char is not None: - return KeyCode.from_char(char) - - return super(Listener, self).canonical(key) diff --git a/PortablePython/Lib/site-packages/pynput/keyboard/_xorg.py b/PortablePython/Lib/site-packages/pynput/keyboard/_xorg.py deleted file mode 100644 index 7011a5a..0000000 --- a/PortablePython/Lib/site-packages/pynput/keyboard/_xorg.py +++ /dev/null @@ -1,667 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The keyboard implementation for *Xorg*. -""" - -# pylint: disable=C0111 -# The documentation is extracted from the base classes - -# pylint: disable=R0903 -# We implement stubs - -# pylint: disable=W0611 -try: - import pynput._util.xorg -except Exception as e: - raise ImportError('failed to acquire X connection: {}'.format(str(e)), e) -# pylint: enable=W0611 - -import enum -import threading - -import Xlib.display -import Xlib.ext -import Xlib.ext.xtest -import Xlib.X -import Xlib.XK -import Xlib.protocol -import Xlib.keysymdef.xkb - -from pynput._util import NotifierMixin -from pynput._util.xorg import ( - alt_mask, - alt_gr_mask, - char_to_keysym, - display_manager, - index_to_shift, - keyboard_mapping, - ListenerMixin, - numlock_mask, - shift_to_index, - symbol_to_keysym) -from pynput._util.xorg_keysyms import ( - CHARS, - DEAD_KEYS, - KEYPAD_KEYS, - KEYSYMS, - SYMBOLS) -from . import _base - - -class KeyCode(_base.KeyCode): - _PLATFORM_EXTENSIONS = ( - # The symbol name for this key - '_symbol', - ) - - # Be explicit about fields - _symbol = None - - @classmethod - def _from_symbol(cls, symbol, **kwargs): - """Creates a key from a symbol. - - :param str symbol: The symbol name. - - :return: a key code - """ - # First try simple translation - keysym = Xlib.XK.string_to_keysym(symbol) - if keysym: - return cls.from_vk(keysym, _symbol=symbol, **kwargs) - - # If that fails, try checking a module attribute of Xlib.keysymdef.xkb - if not keysym: - # pylint: disable=W0702; we want to ignore errors - try: - symbol = 'XK_' + symbol - return cls.from_vk( - getattr(Xlib.keysymdef.xkb, symbol, 0), - _symbol=symbol, - **kwargs) - except: - return cls.from_vk( - SYMBOLS.get(symbol, (0,))[0], - _symbol=symbol, - **kwargs) - # pylint: enable=W0702 - - @classmethod - def _from_media(cls, name, **kwargs): - """Creates a media key from a partial name. - - :param str name: The name. The actual symbol name will be this string - with ``'XF86_Audio'`` prepended. - - :return: a key code - """ - return cls._from_symbol('XF86_Audio' + name, **kwargs) - - -# pylint: disable=W0212 -class Key(enum.Enum): - # Default keys - alt = KeyCode._from_symbol('Alt_L') - alt_l = KeyCode._from_symbol('Alt_L') - alt_r = KeyCode._from_symbol('Alt_R') - alt_gr = KeyCode._from_symbol('Mode_switch') - backspace = KeyCode._from_symbol('BackSpace') - caps_lock = KeyCode._from_symbol('Caps_Lock') - cmd = KeyCode._from_symbol('Super_L') - cmd_l = KeyCode._from_symbol('Super_L') - cmd_r = KeyCode._from_symbol('Super_R') - ctrl = KeyCode._from_symbol('Control_L') - ctrl_l = KeyCode._from_symbol('Control_L') - ctrl_r = KeyCode._from_symbol('Control_R') - delete = KeyCode._from_symbol('Delete') - down = KeyCode._from_symbol('Down') - end = KeyCode._from_symbol('End') - enter = KeyCode._from_symbol('Return') - esc = KeyCode._from_symbol('Escape') - f1 = KeyCode._from_symbol('F1') - f2 = KeyCode._from_symbol('F2') - f3 = KeyCode._from_symbol('F3') - f4 = KeyCode._from_symbol('F4') - f5 = KeyCode._from_symbol('F5') - f6 = KeyCode._from_symbol('F6') - f7 = KeyCode._from_symbol('F7') - f8 = KeyCode._from_symbol('F8') - f9 = KeyCode._from_symbol('F9') - f10 = KeyCode._from_symbol('F10') - f11 = KeyCode._from_symbol('F11') - f12 = KeyCode._from_symbol('F12') - f13 = KeyCode._from_symbol('F13') - f14 = KeyCode._from_symbol('F14') - f15 = KeyCode._from_symbol('F15') - f16 = KeyCode._from_symbol('F16') - f17 = KeyCode._from_symbol('F17') - f18 = KeyCode._from_symbol('F18') - f19 = KeyCode._from_symbol('F19') - f20 = KeyCode._from_symbol('F20') - home = KeyCode._from_symbol('Home') - left = KeyCode._from_symbol('Left') - page_down = KeyCode._from_symbol('Page_Down') - page_up = KeyCode._from_symbol('Page_Up') - right = KeyCode._from_symbol('Right') - shift = KeyCode._from_symbol('Shift_L') - shift_l = KeyCode._from_symbol('Shift_L') - shift_r = KeyCode._from_symbol('Shift_R') - space = KeyCode._from_symbol('space', char=' ') - tab = KeyCode._from_symbol('Tab') - up = KeyCode._from_symbol('Up') - - media_play_pause = KeyCode._from_media('Play') - media_volume_mute = KeyCode._from_media('Mute') - media_volume_down = KeyCode._from_media('LowerVolume') - media_volume_up = KeyCode._from_media('RaiseVolume') - media_previous = KeyCode._from_media('Prev') - media_next = KeyCode._from_media('Next') - - insert = KeyCode._from_symbol('Insert') - menu = KeyCode._from_symbol('Menu') - num_lock = KeyCode._from_symbol('Num_Lock') - pause = KeyCode._from_symbol('Pause') - print_screen = KeyCode._from_symbol('Print') - scroll_lock = KeyCode._from_symbol('Scroll_Lock') -# pylint: enable=W0212 - - -class Controller(NotifierMixin, _base.Controller): - _KeyCode = KeyCode - _Key = Key - - #: The shift mask for :attr:`Key.ctrl` - CTRL_MASK = Xlib.X.ControlMask - - #: The shift mask for :attr:`Key.shift` - SHIFT_MASK = Xlib.X.ShiftMask - - def __init__(self, *args, **kwargs): - super(Controller, self).__init__(*args, **kwargs) - self._display = Xlib.display.Display() - self._keyboard_mapping = None - self._borrows = {} - self._borrow_lock = threading.RLock() - - # pylint: disable=C0103; this is treated as a class scope constant, but - # we cannot set it in the class scope, as it requires a Display instance - self.ALT_MASK = alt_mask(self._display) - self.ALT_GR_MASK = alt_gr_mask(self._display) - # pylint: enable=C0103 - - def __del__(self): - if hasattr(self, '_display'): - self._display.close() - - @property - def keyboard_mapping(self): - """A mapping from *keysyms* to *key codes*. - - Each value is the tuple ``(key_code, shift_state)``. By sending an - event with the specified *key code* and shift state, the specified - *keysym* will be touched. - """ - if not self._keyboard_mapping: - self._update_keyboard_mapping() - return self._keyboard_mapping - - def _handle(self, key, is_press): - """Resolves a key identifier and sends a keyboard event. - - :param int key: The key to handle. - :param bool is_press: Whether this is a press. - """ - event = Xlib.display.event.KeyPress if is_press \ - else Xlib.display.event.KeyRelease - keysym = self._keysym(key) - - # Make sure to verify that the key was resolved - if keysym is None: - raise self.InvalidKeyException(key) - - # If the key has a virtual key code, use that immediately with - # fake_input; fake input,being an X server extension, has access to - # more internal state that we do - if key.vk is not None: - with display_manager(self._display) as dm: - Xlib.ext.xtest.fake_input( - dm, - Xlib.X.KeyPress if is_press else Xlib.X.KeyRelease, - dm.keysym_to_keycode(key.vk)) - - # Otherwise use XSendEvent; we need to use this in the general case to - # work around problems with keyboard layouts - else: - try: - keycode, shift_state = self.keyboard_mapping[keysym] - self._send_key(event, keycode, shift_state) - - except KeyError: - with self._borrow_lock: - keycode, index, count = self._borrows[keysym] - self._send_key( - event, - keycode, - index_to_shift(self._display, index)) - count += 1 if is_press else -1 - self._borrows[keysym] = (keycode, index, count) - - # Notify any running listeners - self._emit('_on_fake_event', key, is_press) - - def _keysym(self, key): - """Converts a key to a *keysym*. - - :param KeyCode key: The key code to convert. - """ - return self._resolve_dead(key) if key.is_dead else None \ - or self._resolve_special(key) \ - or self._resolve_normal(key) \ - or self._resolve_borrowed(key) \ - or self._resolve_borrowing(key) - - def _send_key(self, event, keycode, shift_state): - """Sends a single keyboard event. - - :param event: The *X* keyboard event. - - :param int keycode: The calculated keycode. - - :param int shift_state: The shift state. The actual value used is - :attr:`shift_state` or'd with this value. - """ - with display_manager(self._display) as dm, self.modifiers as modifiers: - # Under certain cimcumstances, such as when running under Xephyr, - # the value returned by dm.get_input_focus is an int - window = dm.get_input_focus().focus - send_event = getattr( - window, - 'send_event', - lambda event: dm.send_event(window, event)) - send_event(event( - detail=keycode, - state=shift_state | self._shift_mask(modifiers), - time=0, - root=dm.screen().root, - window=window, - same_screen=0, - child=Xlib.X.NONE, - root_x=0, root_y=0, event_x=0, event_y=0)) - - def _resolve_dead(self, key): - """Tries to resolve a dead key. - - :param str identifier: The identifier to resolve. - """ - # pylint: disable=W0702; we want to ignore errors - try: - keysym, _ = SYMBOLS[CHARS[key.combining]] - except: - return None - # pylint: enable=W0702 - - if keysym not in self.keyboard_mapping: - return None - - return keysym - - def _resolve_special(self, key): - """Tries to resolve a special key. - - A special key has the :attr:`~KeyCode.vk` attribute set. - - :param KeyCode key: The key to resolve. - """ - if not key.vk: - return None - - return key.vk - - def _resolve_normal(self, key): - """Tries to resolve a normal key. - - A normal key exists on the keyboard, and is typed by pressing - and releasing a simple key, possibly in combination with a modifier. - - :param KeyCode key: The key to resolve. - """ - keysym = self._key_to_keysym(key) - if keysym is None: - return None - - if keysym not in self.keyboard_mapping: - return None - - return keysym - - def _resolve_borrowed(self, key): - """Tries to resolve a key by looking up the already borrowed *keysyms*. - - A borrowed *keysym* does not exist on the keyboard, but has been - temporarily added to the layout. - - :param KeyCode key: The key to resolve. - """ - keysym = self._key_to_keysym(key) - if keysym is None: - return None - - with self._borrow_lock: - if keysym not in self._borrows: - return None - - return keysym - - def _resolve_borrowing(self, key): - """Tries to resolve a key by modifying the layout temporarily. - - A borrowed *keysym* does not exist on the keyboard, but is temporarily - added to the layout. - - :param KeyCode key: The key to resolve. - """ - keysym = self._key_to_keysym(key) - if keysym is None: - return None - - mapping = self._display.get_keyboard_mapping(8, 255 - 8) - - def i2kc(index): - return index + 8 - - def kc2i(keycode): - return keycode - 8 - - #: Finds a keycode and index by looking at already used keycodes - def reuse(): - for _, (keycode, _, _) in self._borrows.items(): - keycodes = mapping[kc2i(keycode)] - - # Only the first four items are addressable by X - for index in range(4): - if not keycodes[index]: - return keycode, index - - #: Finds a keycode and index by using a new keycode - def borrow(): - for i, keycodes in enumerate(mapping): - if not any(keycodes): - return i2kc(i), 0 - - #: Finds a keycode and index by reusing an old, unused one - def overwrite(): - for keysym, (keycode, index, count) in self._borrows.items(): - if count < 1: - del self._borrows[keysym] - return keycode, index - - #: Registers a keycode for a specific key and modifier state - def register(dm, keycode, index): - i = kc2i(keycode) - - # Check for use of empty mapping with a character that has upper - # and lower forms - lower = key.char.lower() - upper = key.char.upper() - if lower != upper and len(lower) == 1 and len(upper) == 1 and all( - m == Xlib.XK.NoSymbol - for m in mapping[i]): - lower = self._key_to_keysym(KeyCode.from_char(lower)) - upper = self._key_to_keysym(KeyCode.from_char(upper)) - if lower: - mapping[i][0] = lower - self._borrows[lower] = (keycode, 0, 0) - if upper: - mapping[i][1] = upper - self._borrows[upper] = (keycode, 1, 0) - else: - mapping[i][index] = keysym - self._borrows[keysym] = (keycode, index, 0) - dm.change_keyboard_mapping(keycode, mapping[i:i + 1]) - - try: - with display_manager(self._display) as dm, self._borrow_lock as _: - # First try an already used keycode, then try a new one, and - # fall back on reusing one that is not currently pressed - register(dm, *( - reuse() or - borrow() or - overwrite())) - return keysym - - except TypeError: - return None - - def _key_to_keysym(self, key): - """Converts a character key code to a *keysym*. - - :param KeyCode key: The key code. - - :return: a keysym if found - :rtype: int or None - """ - # If the key code already has a VK, simply return it - if key.vk is not None: - return key.vk - - # If the character has no associated symbol, we try to map the - # character to a keysym - symbol = CHARS.get(key.char, None) - if symbol is None: - return char_to_keysym(key.char) - - # Otherwise we attempt to convert the symbol to a keysym - # pylint: disable=W0702; we want to ignore errors - try: - return symbol_to_keysym(symbol) - except: - try: - return SYMBOLS[symbol][0] - except: - return None - # pylint: enable=W0702 - - def _shift_mask(self, modifiers): - """The *X* modifier mask to apply for a set of modifiers. - - :param set modifiers: A set of active modifiers for which to get the - shift mask. - """ - return ( - 0 - | (self.ALT_MASK - if Key.alt in modifiers else 0) - - | (self.ALT_GR_MASK - if Key.alt_gr in modifiers else 0) - - | (self.CTRL_MASK - if Key.ctrl in modifiers else 0) - - | (self.SHIFT_MASK - if Key.shift in modifiers else 0)) - - def _update_keyboard_mapping(self): - """Updates the keyboard mapping. - """ - with display_manager(self._display) as dm: - self._keyboard_mapping = keyboard_mapping(dm) - - -@Controller._receiver -class Listener(ListenerMixin, _base.Listener): - _EVENTS = ( - Xlib.X.KeyPress, - Xlib.X.KeyRelease) - - #: A mapping from keysym to special key - _SPECIAL_KEYS = { - key.value.vk: key - for key in Key} - - #: A mapping from numeric keypad keys to keys - _KEYPAD_KEYS = { - KEYPAD_KEYS['KP_0']: KeyCode.from_char('0'), - KEYPAD_KEYS['KP_1']: KeyCode.from_char('1'), - KEYPAD_KEYS['KP_2']: KeyCode.from_char('2'), - KEYPAD_KEYS['KP_3']: KeyCode.from_char('3'), - KEYPAD_KEYS['KP_4']: KeyCode.from_char('4'), - KEYPAD_KEYS['KP_5']: KeyCode.from_char('5'), - KEYPAD_KEYS['KP_6']: KeyCode.from_char('6'), - KEYPAD_KEYS['KP_7']: KeyCode.from_char('7'), - KEYPAD_KEYS['KP_8']: KeyCode.from_char('8'), - KEYPAD_KEYS['KP_9']: KeyCode.from_char('9'), - KEYPAD_KEYS['KP_Add']: KeyCode.from_char('+'), - KEYPAD_KEYS['KP_Decimal']: KeyCode.from_char(','), - KEYPAD_KEYS['KP_Delete']: Key.delete, - KEYPAD_KEYS['KP_Divide']: KeyCode.from_char('/'), - KEYPAD_KEYS['KP_Down']: Key.down, - KEYPAD_KEYS['KP_End']: Key.end, - KEYPAD_KEYS['KP_Enter']: Key.enter, - KEYPAD_KEYS['KP_Equal']: KeyCode.from_char('='), - KEYPAD_KEYS['KP_F1']: Key.f1, - KEYPAD_KEYS['KP_F2']: Key.f2, - KEYPAD_KEYS['KP_F3']: Key.f3, - KEYPAD_KEYS['KP_F4']: Key.f4, - KEYPAD_KEYS['KP_Home']: Key.home, - KEYPAD_KEYS['KP_Insert']: Key.insert, - KEYPAD_KEYS['KP_Left']: Key.left, - KEYPAD_KEYS['KP_Multiply']: KeyCode.from_char('*'), - KEYPAD_KEYS['KP_Page_Down']: Key.page_down, - KEYPAD_KEYS['KP_Page_Up']: Key.page_up, - KEYPAD_KEYS['KP_Right']: Key.right, - KEYPAD_KEYS['KP_Space']: Key.space, - KEYPAD_KEYS['KP_Subtract']: KeyCode.from_char('-'), - KEYPAD_KEYS['KP_Tab']: Key.tab, - KEYPAD_KEYS['KP_Up']: Key.up} - - def __init__(self, *args, **kwargs): - super(Listener, self).__init__(*args, **kwargs) - self._keyboard_mapping = None - - def _run(self): - with self._receive(): - super(Listener, self)._run() - - def _initialize(self, display): - # Get the keyboard mapping to be able to translate event details to - # key codes - min_keycode = display.display.info.min_keycode - keycode_count = display.display.info.max_keycode - min_keycode + 1 - self._keyboard_mapping = display.get_keyboard_mapping( - min_keycode, keycode_count) - - def _handle_message(self, display, event, injected): - # Convert the event to a KeyCode; this may fail, and in that case we - # pass None - try: - key = self._event_to_key(display, event) - except IndexError: - key = None - - if event.type == Xlib.X.KeyPress: - self.on_press(key, injected) - - elif event.type == Xlib.X.KeyRelease: - self.on_release(key, injected) - - def _suppress_start(self, display): - display.screen().root.grab_keyboard( - self._event_mask, Xlib.X.GrabModeAsync, Xlib.X.GrabModeAsync, - Xlib.X.CurrentTime) - - def _suppress_stop(self, display): - display.ungrab_keyboard(Xlib.X.CurrentTime) - - def _on_fake_event(self, key, is_press): - """The handler for fake press events sent by the controllers. - - :param KeyCode key: The key pressed. - - :param bool is_press: Whether this is a press event. - """ - (self.on_press if is_press else self.on_release)( - self._SPECIAL_KEYS.get(key.vk, key), True) - - def _keycode_to_keysym(self, display, keycode, index): - """Converts a keycode and shift state index to a keysym. - - This method uses a simplified version of the *X* convention to locate - the correct keysym in the display table: since this method is only used - to locate special keys, alphanumeric keys are not treated specially. - - :param display: The current *X* display. - - :param keycode: The keycode. - - :param index: The shift state index. - - :return: a keysym - """ - keysym = display.keycode_to_keysym(keycode, index) - if keysym: - return keysym - elif index & 0x2: - return self._keycode_to_keysym(display, keycode, index & ~0x2) - elif index & 0x1: - return self._keycode_to_keysym(display, keycode, index & ~0x1) - else: - return 0 - - def _event_to_key(self, display, event): - """Converts an *X* event to a :class:`KeyCode`. - - :param display: The current *X* display. - - :param event: The event to convert. - - :return: a :class:`pynput.keyboard.KeyCode` - - :raises IndexError: if the key code is invalid - """ - keycode = event.detail - index = shift_to_index(display, event.state) - - # First try special keys... - keysym = self._keycode_to_keysym(display, keycode, index) - if keysym in self._SPECIAL_KEYS: - return self._SPECIAL_KEYS[keysym] - elif keysym in self._KEYPAD_KEYS: - # We must recalculate the index if numlock is active; index 1 is the - # one to use - try: - return self._KEYPAD_KEYS[ - self._keycode_to_keysym( - display, - keycode, - bool(event.state & numlock_mask(display)))] - except KeyError: - # Since we recalculated the key, this may happen - pass - - # ...then try characters... - name = KEYSYMS.get(keysym, None) - if name is not None and name in SYMBOLS: - char = SYMBOLS[name][1].upper() if index & 1 else SYMBOLS[name][1] - if char in DEAD_KEYS: - return KeyCode.from_dead(DEAD_KEYS[char], vk=keysym) - else: - return KeyCode.from_char(char, vk=keysym) - - # ...and fall back on a virtual key code - return KeyCode.from_vk(keysym) diff --git a/PortablePython/Lib/site-packages/pynput/mouse/__init__.py b/PortablePython/Lib/site-packages/pynput/mouse/__init__.py deleted file mode 100644 index 3456629..0000000 --- a/PortablePython/Lib/site-packages/pynput/mouse/__init__.py +++ /dev/null @@ -1,107 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The module containing mouse classes. - -See the documentation for more information. -""" - -# pylint: disable=C0103 -# Button, Controller and Listener are not constants - -from pynput._util import backend, Events - - -backend = backend(__name__) -Button = backend.Button -Controller = backend.Controller -Listener = backend.Listener -del backend - - -class Events(Events): - """A mouse event listener supporting synchronous iteration over the events. - - Possible events are: - - :class:`Events.Move` - The mouse was moved. - - :class:`Events.Click` - A mouse button was pressed or released. - - :class:`Events.Scroll` - The device was scrolled. - """ - _Listener = Listener - - class Move(Events.Event): - """A move event. - """ - def __init__(self, x, y, injected): - #: The X screen coordinate. - self.x = x - - #: The Y screen coordinate. - self.y = y - - #: Whether this event is synthetic. - self.injected = injected - - class Click(Events.Event): - """A click event. - """ - def __init__(self, x, y, button, pressed, injected): - #: The X screen coordinate. - self.x = x - - #: The Y screen coordinate. - self.y = y - - #: The button. - self.button = button - - #: Whether the button was pressed. - self.pressed = pressed - - #: Whether this event is synthetic. - self.injected = injected - - class Scroll(Events.Event): - """A scroll event. - """ - def __init__(self, x, y, dx, dy, injected): - #: The X screen coordinate. - self.x = x - - #: The Y screen coordinate. - self.y = y - - #: The number of horisontal steps. - self.dx = dx - - #: The number of vertical steps. - self.dy = dy - - #: Whether this event is synthetic. - self.injected = injected - - def __init__(self): - super(Events, self).__init__( - on_move=self.Move, - on_click=self.Click, - on_scroll=self.Scroll) diff --git a/PortablePython/Lib/site-packages/pynput/mouse/_base.py b/PortablePython/Lib/site-packages/pynput/mouse/_base.py deleted file mode 100644 index 186a7d7..0000000 --- a/PortablePython/Lib/site-packages/pynput/mouse/_base.py +++ /dev/null @@ -1,281 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -This module contains the base implementation. - -The actual interface to mouse classes is defined here, but the implementation -is located in a platform dependent module. -""" - -# pylint: disable=R0903 -# We implement stubs - -import enum - -from pynput._util import AbstractListener, prefix -from pynput import _logger - - -class Button(enum.Enum): - """The various buttons. - - The actual values for these items differ between platforms. Some - platforms may have additional buttons, but these are guaranteed to be - present everywhere. - """ - #: An unknown button was pressed - unknown = 0 - - #: The left button - left = 1 - - #: The middle button - middle = 2 - - #: The right button - right = 3 - - -class Controller(object): - """A controller for sending virtual mouse events to the system. - """ - def __init__(self): - self._log = _logger(self.__class__) - - @property - def position(self): - """The current position of the mouse pointer. - - This is the tuple ``(x, y)``, and setting it will move the pointer. - """ - return self._position_get() - - @position.setter - def position(self, pos): - self._position_set(pos) - - def scroll(self, dx, dy): - """Sends scroll events. - - :param int dx: The horizontal scroll. The units of scrolling is - undefined. - - :param int dy: The vertical scroll. The units of scrolling is - undefined. - - :raises ValueError: if the values are invalid, for example out of - bounds - """ - self._scroll(dx, dy) - - def press(self, button): - """Emits a button press event at the current position. - - :param Button button: The button to press. - """ - self._press(button) - - def release(self, button): - """Emits a button release event at the current position. - - :param Button button: The button to release. - """ - self._release(button) - - def move(self, dx, dy): - """Moves the mouse pointer a number of pixels from its current - position. - - :param int dx: The horizontal offset. - - :param int dy: The vertical offset. - - :raises ValueError: if the values are invalid, for example out of - bounds - """ - self.position = tuple(sum(i) for i in zip(self.position, (dx, dy))) - - def click(self, button, count=1): - """Emits a button click event at the current position. - - The default implementation sends a series of press and release events. - - :param Button button: The button to click. - - :param int count: The number of clicks to send. - """ - with self as controller: - for _ in range(count): - controller.press(button) - controller.release(button) - - def __enter__(self): - """Begins a series of clicks. - - In the default :meth:`click` implementation, the return value of this - method is used for the calls to :meth:`press` and :meth:`release` - instead of ``self``. - - The default implementation is a no-op. - """ - return self - - def __exit__(self, exc_type, value, traceback): - """Ends a series of clicks. - """ - pass - - def _position_get(self): - """The implementation of the getter for :attr:`position`. - - This is a platform dependent implementation. - """ - raise NotImplementedError() - - def _position_set(self, pos): - """The implementation of the setter for :attr:`position`. - - This is a platform dependent implementation. - """ - raise NotImplementedError() - - def _scroll(self, dx, dy): - """The implementation of the :meth:`scroll` method. - - This is a platform dependent implementation. - """ - raise NotImplementedError() - - def _press(self, button): - """The implementation of the :meth:`press` method. - - This is a platform dependent implementation. - """ - raise NotImplementedError() - - def _release(self, button): - """The implementation of the :meth:`release` method. - - This is a platform dependent implementation. - """ - raise NotImplementedError() - - -# pylint: disable=W0223; This is also an abstract class -class Listener(AbstractListener): - """A listener for mouse events. - - Instances of this class can be used as context managers. This is equivalent - to the following code:: - - listener.start() - try: - listener.wait() - with_statements() - finally: - listener.stop() - - This class inherits from :class:`threading.Thread` and supports all its - methods. It will set :attr:`daemon` to ``True`` when created. - - All callback arguments are optional; a callback may take less arguments - than actually passed, but not more, unless they are optional. - - :param callable on_move: The callback to call when mouse move events occur. - - It will be called with the arguments ``(x, y, injected)``, where ``(x, - y)`` is the new pointer position and ``injected`` whether the event was - injected and thus not generated by an actual input device. If this - callback raises :class:`StopException` or returns ``False``, the - listener is stopped. - - Please note that not all backends support ``injected`` and will always - set it to ``False``. - - :param callable on_click: The callback to call when a mouse button is - clicked. - - It will be called with the arguments ``(x, y, button, pressed, - injected)``, where ``(x, y)`` is the new pointer position, ``button`` - is one of the :class:`Button`, ``pressed`` is whether the button was - pressed and ``injected`` whether the event was injected and thus not - generated by an actual input device. - - If this callback raises :class:`StopException` or returns ``False``, - the listener is stopped. - - Please note that not all backends support ``injected`` and will always - set it to ``False``. - - :param callable on_scroll: The callback to call when mouse scroll - events occur. - - It will be called with the arguments ``(x, y, dx, dy, injected)``, - where ``(x, y)`` is the new pointer position, and ``(dx, dy)`` is the - scroll vector and ``injected`` whether the event was injected and thus - not generated by an actual input device. - - If this callback raises :class:`StopException` or returns ``False``, - the listener is stopped. - - Please note that not all backends support ``injected`` and will always - set it to ``False``. - - :param bool suppress: Whether to suppress events. Setting this to ``True`` - will prevent the input events from being passed to the rest of the - system. - - :param kwargs: Any non-standard platform dependent options. These should be - prefixed with the platform name thus: ``darwin_``, ``xorg_`` or - ``win32_``. - - Supported values are: - - ``darwin_intercept`` - A callable taking the arguments ``(event_type, event)``, where - ``event_type`` is any mouse related event type constant, and - ``event`` is a ``CGEventRef``. - - This callable can freely modify the event using functions like - ``Quartz.CGEventSetIntegerValueField``. If this callable does not - return the event, the event is suppressed system wide. - - ``win32_event_filter`` - A callable taking the arguments ``(msg, data)``, where ``msg`` is - the current message, and ``data`` associated data as a - `MSLLHOOKSTRUCT `_. - - If this callback returns ``False``, the event will not - be propagated to the listener callback. - - If ``self.suppress_event()`` is called, the event is suppressed - system wide. - """ - def __init__(self, on_move=None, on_click=None, on_scroll=None, - suppress=False, **kwargs): - self._log = _logger(self.__class__) - option_prefix = prefix(Listener, self.__class__) - self._options = { - key[len(option_prefix):]: value - for key, value in kwargs.items() - if key.startswith(option_prefix)} - super(Listener, self).__init__( - on_move=self._wrap(on_move, 3), - on_click=self._wrap(on_click, 5), - on_scroll=self._wrap(on_scroll, 5), - suppress=suppress) -# pylint: enable=W0223 diff --git a/PortablePython/Lib/site-packages/pynput/mouse/_darwin.py b/PortablePython/Lib/site-packages/pynput/mouse/_darwin.py deleted file mode 100644 index b5dbe3c..0000000 --- a/PortablePython/Lib/site-packages/pynput/mouse/_darwin.py +++ /dev/null @@ -1,212 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The mouse implementation for *macOS*. -""" - -# pylint: disable=C0111 -# The documentation is extracted from the base classes - -# pylint: disable=R0903 -# We implement stubs - -import enum -import Quartz - -from AppKit import NSEvent - -from pynput._util.darwin import ( - ListenerMixin) -from . import _base - - -def _button_value(base_name, mouse_button): - """Generates the value tuple for a :class:`Button` value. - - :param str base_name: The base name for the button. This should be a string - like ``'kCGEventLeftMouse'``. - - :param int mouse_button: The mouse button ID. - - :return: a value tuple - """ - return ( - tuple( - getattr(Quartz, '%sMouse%s' % (base_name, name)) - for name in ('Down', 'Up', 'Dragged')), - mouse_button) - - -class Button(enum.Enum): - """The various buttons. - """ - unknown = None - left = _button_value('kCGEventLeft', 0) - middle = _button_value('kCGEventOther', 2) - right = _button_value('kCGEventRight', 1) - - -class Controller(_base.Controller): - #: The scroll speed - _SCROLL_SPEED = 10 - - def __init__(self, *args, **kwargs): - super(Controller, self).__init__(*args, **kwargs) - self._click = None - self._drag_button = None - - def _position_get(self): - pos = NSEvent.mouseLocation() - - return pos.x, Quartz.CGDisplayPixelsHigh(0) - pos.y - - def _position_set(self, pos): - try: - (_, _, mouse_type), mouse_button = self._drag_button.value - except AttributeError: - mouse_type = Quartz.kCGEventMouseMoved - mouse_button = 0 - - Quartz.CGEventPost( - Quartz.kCGHIDEventTap, - Quartz.CGEventCreateMouseEvent( - None, - mouse_type, - pos, - mouse_button)) - - def _scroll(self, dx, dy): - dx = int(dx) - dy = int(dy) - - Quartz.CGEventPost( - Quartz.kCGHIDEventTap, - Quartz.CGEventCreateScrollWheelEvent( - None, - Quartz.kCGScrollEventUnitPixel, - 2, - dy * self._SCROLL_SPEED, - dx * self._SCROLL_SPEED)) - - def _press(self, button): - (press, _, _), mouse_button = button.value - event = Quartz.CGEventCreateMouseEvent( - None, - press, - self.position, - mouse_button) - - # If we are performing a click, we need to set this state flag - if self._click is not None: - self._click += 1 - Quartz.CGEventSetIntegerValueField( - event, - Quartz.kCGMouseEventClickState, - self._click) - - Quartz.CGEventPost(Quartz.kCGHIDEventTap, event) - - # Store the button to enable dragging - self._drag_button = button - - def _release(self, button): - (_, release, _), mouse_button = button.value - event = Quartz.CGEventCreateMouseEvent( - None, - release, - self.position, - mouse_button) - - # If we are performing a click, we need to set this state flag - if self._click is not None: - Quartz.CGEventSetIntegerValueField( - event, - Quartz.kCGMouseEventClickState, - self._click) - - Quartz.CGEventPost(Quartz.kCGHIDEventTap, event) - - if button == self._drag_button: - self._drag_button = None - - def __enter__(self): - self._click = 0 - return self - - def __exit__(self, exc_type, value, traceback): - self._click = None - - -class Listener(ListenerMixin, _base.Listener): - #: The events that we listen to - _EVENTS = ( - Quartz.CGEventMaskBit(Quartz.kCGEventMouseMoved) | - Quartz.CGEventMaskBit(Quartz.kCGEventLeftMouseDown) | - Quartz.CGEventMaskBit(Quartz.kCGEventLeftMouseUp) | - Quartz.CGEventMaskBit(Quartz.kCGEventLeftMouseDragged) | - Quartz.CGEventMaskBit(Quartz.kCGEventRightMouseDown) | - Quartz.CGEventMaskBit(Quartz.kCGEventRightMouseUp) | - Quartz.CGEventMaskBit(Quartz.kCGEventRightMouseDragged) | - Quartz.CGEventMaskBit(Quartz.kCGEventOtherMouseDown) | - Quartz.CGEventMaskBit(Quartz.kCGEventOtherMouseUp) | - Quartz.CGEventMaskBit(Quartz.kCGEventOtherMouseDragged) | - Quartz.CGEventMaskBit(Quartz.kCGEventScrollWheel)) - - def __init__(self, *args, **kwargs): - super(Listener, self).__init__(*args, **kwargs) - self._intercept = self._options.get( - 'intercept', - None) - - def _handle_message(self, _proxy, event_type, event, _refcon, injected): - """The callback registered with *macOS* for mouse events. - - This method will call the callbacks registered on initialisation. - """ - try: - (px, py) = Quartz.CGEventGetLocation(event) - except AttributeError: - # This happens during teardown of the virtual machine - return - - # Quickly detect the most common event type - if event_type == Quartz.kCGEventMouseMoved: - self.on_move(px, py, injected) - - elif event_type == Quartz.kCGEventScrollWheel: - dx = Quartz.CGEventGetIntegerValueField( - event, - Quartz.kCGScrollWheelEventDeltaAxis2) - dy = Quartz.CGEventGetIntegerValueField( - event, - Quartz.kCGScrollWheelEventDeltaAxis1) - self.on_scroll(px, py, dx, dy, injected) - - else: - for button in Button: - try: - (press, release, drag), _ = button.value - except TypeError: - # Button.unknown cannot be enumerated - continue - - # Press and release generate click events, and drag - # generates move events - if event_type in (press, release): - self.on_click(px, py, button, event_type == press, injected) - elif event_type == drag: - self.on_move(px, py, injected) diff --git a/PortablePython/Lib/site-packages/pynput/mouse/_dummy.py b/PortablePython/Lib/site-packages/pynput/mouse/_dummy.py deleted file mode 100644 index c0a8a74..0000000 --- a/PortablePython/Lib/site-packages/pynput/mouse/_dummy.py +++ /dev/null @@ -1,22 +0,0 @@ -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -This module contains a dummy implementation. - -It cannot be used, but importing it will not raise any exceptions. -""" - -from ._base import Button, Controller, Listener diff --git a/PortablePython/Lib/site-packages/pynput/mouse/_win32.py b/PortablePython/Lib/site-packages/pynput/mouse/_win32.py deleted file mode 100644 index 1c0dbb5..0000000 --- a/PortablePython/Lib/site-packages/pynput/mouse/_win32.py +++ /dev/null @@ -1,226 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The mouse implementation for *Windows*. -""" - -# pylint: disable=C0111 -# The documentation is extracted from the base classes - -# pylint: disable=R0903 -# We implement stubs - -import ctypes -import enum - -from ctypes import ( - windll, - wintypes) - -from pynput._util import NotifierMixin -from pynput._util.win32 import ( - INPUT, - INPUT_union, - ListenerMixin, - MOUSEINPUT, - SendInput, - SystemHook) -from . import _base - -#: A constant used as a factor when constructing mouse scroll data. -WHEEL_DELTA = 120 - - -class Button(enum.Enum): - """The various buttons. - """ - unknown = None - left = (MOUSEINPUT.LEFTUP, MOUSEINPUT.LEFTDOWN, 0) - middle = (MOUSEINPUT.MIDDLEUP, MOUSEINPUT.MIDDLEDOWN, 0) - right = (MOUSEINPUT.RIGHTUP, MOUSEINPUT.RIGHTDOWN, 0) - x1 = (MOUSEINPUT.XUP, MOUSEINPUT.XDOWN, MOUSEINPUT.XBUTTON1) - x2 = (MOUSEINPUT.XUP, MOUSEINPUT.XDOWN, MOUSEINPUT.XBUTTON2) - - -class Controller(NotifierMixin, _base.Controller): - __GetCursorPos = windll.user32.GetCursorPos - __SetCursorPos = windll.user32.SetCursorPos - - def __init__(self, *args, **kwargs): - super(Controller, self).__init__(*args, **kwargs) - - def _position_get(self): - point = wintypes.POINT() - if self.__GetCursorPos(ctypes.byref(point)): - return (point.x, point.y) - else: - return None - - def _position_set(self, pos): - pos = int(pos[0]), int(pos[1]) - self.__SetCursorPos(*pos) - self._emit('on_move', *pos, True) - - def _scroll(self, dx, dy): - if dy: - SendInput( - 1, - ctypes.byref(INPUT( - type=INPUT.MOUSE, - value=INPUT_union( - mi=MOUSEINPUT( - dwFlags=MOUSEINPUT.WHEEL, - mouseData=int(dy * WHEEL_DELTA))))), - ctypes.sizeof(INPUT)) - - if dx: - SendInput( - 1, - ctypes.byref(INPUT( - type=INPUT.MOUSE, - value=INPUT_union( - mi=MOUSEINPUT( - dwFlags=MOUSEINPUT.HWHEEL, - mouseData=int(dx * WHEEL_DELTA))))), - ctypes.sizeof(INPUT)) - - if dx or dy: - px, py = self._position_get() - self._emit('on_scroll', px, py, dx, dy, True) - - def _press(self, button): - SendInput( - 1, - ctypes.byref(INPUT( - type=INPUT.MOUSE, - value=INPUT_union( - mi=MOUSEINPUT( - dwFlags=button.value[1], - mouseData=button.value[2])))), - ctypes.sizeof(INPUT)) - - def _release(self, button): - SendInput( - 1, - ctypes.byref(INPUT( - type=INPUT.MOUSE, - value=INPUT_union( - mi=MOUSEINPUT( - dwFlags=button.value[0], - mouseData=button.value[2])))), - ctypes.sizeof(INPUT)) - - -@Controller._receiver -class Listener(ListenerMixin, _base.Listener): - #: The Windows hook ID for low level mouse events, ``WH_MOUSE_LL`` - _EVENTS = 14 - - WM_LBUTTONDOWN = 0x0201 - WM_LBUTTONUP = 0x0202 - WM_MBUTTONDOWN = 0x0207 - WM_MBUTTONUP = 0x0208 - WM_MOUSEMOVE = 0x0200 - WM_MOUSEWHEEL = 0x020A - WM_MOUSEHWHEEL = 0x020E - WM_RBUTTONDOWN = 0x0204 - WM_RBUTTONUP = 0x0205 - WM_XBUTTONDOWN = 0x20B - WM_XBUTTONUP = 0x20C - - MK_XBUTTON1 = 0x0020 - MK_XBUTTON2 = 0x0040 - - XBUTTON1 = 1 - XBUTTON2 = 2 - - #: A mapping from messages to button events - CLICK_BUTTONS = { - WM_LBUTTONDOWN: (Button.left, True), - WM_LBUTTONUP: (Button.left, False), - WM_MBUTTONDOWN: (Button.middle, True), - WM_MBUTTONUP: (Button.middle, False), - WM_RBUTTONDOWN: (Button.right, True), - WM_RBUTTONUP: (Button.right, False)} - - #: A mapping from message to X button events. - X_BUTTONS = { - WM_XBUTTONDOWN: { - XBUTTON1: (Button.x1, True), - XBUTTON2: (Button.x2, True)}, - WM_XBUTTONUP: { - XBUTTON1: (Button.x1, False), - XBUTTON2: (Button.x2, False)}} - - #: A mapping from messages to scroll vectors - SCROLL_BUTTONS = { - WM_MOUSEWHEEL: (0, 1), - WM_MOUSEHWHEEL: (1, 0)} - - _HANDLED_EXCEPTIONS = ( - SystemHook.SuppressException,) - - class _MSLLHOOKSTRUCT(ctypes.Structure): - """Contains information about a mouse event passed to a ``WH_MOUSE_LL`` - hook procedure, ``MouseProc``. - """ - LLMHF_INJECTED = 0x00000001 - LLMHF_LOWER_IL_INJECTED = 0x00000002 - _fields_ = [ - ('pt', wintypes.POINT), - ('mouseData', wintypes.DWORD), - ('flags', wintypes.DWORD), - ('time', wintypes.DWORD), - ('dwExtraInfo', ctypes.c_void_p)] - - #: A pointer to a :class:`_MSLLHOOKSTRUCT` - _LPMSLLHOOKSTRUCT = ctypes.POINTER(_MSLLHOOKSTRUCT) - - def __init__(self, *args, **kwargs): - super(Listener, self).__init__(*args, **kwargs) - self._event_filter = self._options.get( - 'event_filter', - lambda msg, data: True) - - def _handle_message(self, code, msg, lpdata): - if code != SystemHook.HC_ACTION: - return - - data = ctypes.cast(lpdata, self._LPMSLLHOOKSTRUCT).contents - injected = data.flags & (0 - | self._MSLLHOOKSTRUCT.LLMHF_INJECTED - | self._MSLLHOOKSTRUCT.LLMHF_LOWER_IL_INJECTED) != 0 - - # Suppress further propagation of the event if it is filtered - if self._event_filter(msg, data) is False: - return - - if msg == self.WM_MOUSEMOVE: - self.on_move(data.pt.x, data.pt.y,injected) - - elif msg in self.CLICK_BUTTONS: - button, pressed = self.CLICK_BUTTONS[msg] - self.on_click(data.pt.x, data.pt.y, button, pressed, injected) - - elif msg in self.X_BUTTONS: - button, pressed = self.X_BUTTONS[msg][data.mouseData >> 16] - self.on_click(data.pt.x, data.pt.y, button, pressed, injected) - - elif msg in self.SCROLL_BUTTONS: - mx, my = self.SCROLL_BUTTONS[msg] - dd = wintypes.SHORT(data.mouseData >> 16).value // WHEEL_DELTA - self.on_scroll(data.pt.x, data.pt.y, dd * mx, dd * my, injected) diff --git a/PortablePython/Lib/site-packages/pynput/mouse/_xorg.py b/PortablePython/Lib/site-packages/pynput/mouse/_xorg.py deleted file mode 100644 index 93b0a98..0000000 --- a/PortablePython/Lib/site-packages/pynput/mouse/_xorg.py +++ /dev/null @@ -1,184 +0,0 @@ -# coding=utf-8 -# pynput -# Copyright (C) 2015-2024 Moses Palmér -# -# This program is free software: you can redistribute it and/or modify it under -# the terms of the GNU Lesser General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) any -# later version. -# -# This program is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -# details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see . -""" -The keyboard implementation for *Xorg*. -""" - -# pylint: disable=C0111 -# The documentation is extracted from the base classes - - -# pylint: disable=E1101,E1102 -# We dynamically generate the Button class - -# pylint: disable=R0903 -# We implement stubs - -# pylint: disable=W0611 -try: - import pynput._util.xorg -except Exception as e: - raise ImportError('failed to acquire X connection: {}'.format(str(e)), e) -# pylint: enable=W0611 - -import enum -import Xlib.display -import Xlib.ext -import Xlib.ext.xtest -import Xlib.X -import Xlib.protocol - -from pynput._util.xorg import ( - display_manager, - ListenerMixin) -from . import _base - - -# pylint: disable=C0103 -Button = enum.Enum( - 'Button', - module=__name__, - names=[ - ('unknown', None), - ('left', 1), - ('middle', 2), - ('right', 3), - ('scroll_up', 4), - ('scroll_down', 5), - ('scroll_left', 6), - ('scroll_right', 7)] + [ - ('button%d' % i, i) - for i in range(8, 31)]) -# pylint: enable=C0103 - - -class Controller(_base.Controller): - def __init__(self, *args, **kwargs): - super(Controller, self).__init__(*args, **kwargs) - self._display = Xlib.display.Display() - - def __del__(self): - if hasattr(self, '_display'): - self._display.close() - - def _position_get(self): - with display_manager(self._display) as dm: - qp = dm.screen().root.query_pointer() - return (qp.root_x, qp.root_y) - - def _position_set(self, pos): - px, py = self._check_bounds(*pos) - with display_manager(self._display) as dm: - Xlib.ext.xtest.fake_input(dm, Xlib.X.MotionNotify, x=px, y=py) - - def _scroll(self, dx, dy): - dx, dy = self._check_bounds(dx, dy) - if dy: - self.click( - button=Button.scroll_up if dy > 0 else Button.scroll_down, - count=abs(dy)) - - if dx: - self.click( - button=Button.scroll_right if dx > 0 else Button.scroll_left, - count=abs(dx)) - - def _press(self, button): - with display_manager(self._display) as dm: - Xlib.ext.xtest.fake_input(dm, Xlib.X.ButtonPress, button.value) - - def _release(self, button): - with display_manager(self._display) as dm: - Xlib.ext.xtest.fake_input(dm, Xlib.X.ButtonRelease, button.value) - - def _check_bounds(self, *args): - """Checks the arguments and makes sure they are within the bounds of a - short integer. - - :param args: The values to verify. - """ - if not all( - (-0x7fff - 1) <= number <= 0x7fff - for number in args): - raise ValueError(args) - else: - return tuple(int(p) for p in args) - - -class Listener(ListenerMixin, _base.Listener): - #: A mapping from button values to scroll directions - _SCROLL_BUTTONS = { - Button.scroll_up.value: (0, 1), - Button.scroll_down.value: (0, -1), - Button.scroll_right.value: (1, 0), - Button.scroll_left.value: (-1, 0)} - - _EVENTS = ( - Xlib.X.ButtonPressMask, - Xlib.X.ButtonReleaseMask) - - def __init__(self, *args, **kwargs): - super(Listener, self).__init__(*args, **kwargs) - - def _handle_message(self, dummy_display, event, injected): - px = event.root_x - py = event.root_y - - if event.type == Xlib.X.ButtonPress: - # Scroll events are sent as button presses with the scroll - # button codes - scroll = self._SCROLL_BUTTONS.get(event.detail, None) - if scroll: - self.on_scroll( - px, py, scroll[0], scroll[1], injected) - else: - self.on_click( - px, py, self._button(event.detail), True, injected) - - elif event.type == Xlib.X.ButtonRelease: - # Send an event only if this was not a scroll event - if event.detail not in self._SCROLL_BUTTONS: - self.on_click( - px, py, self._button(event.detail), False, injected) - - else: - self.on_move(px, py, injected) - - - def _suppress_start(self, display): - display.screen().root.grab_pointer( - True, self._event_mask, Xlib.X.GrabModeAsync, Xlib.X.GrabModeAsync, - 0, 0, Xlib.X.CurrentTime) - - def _suppress_stop(self, display): - display.ungrab_pointer(Xlib.X.CurrentTime) - - # pylint: disable=R0201 - def _button(self, detail): - """Creates a mouse button from an event detail. - - If the button is unknown, :attr:`Button.unknown` is returned. - - :param detail: The event detail. - - :return: a button - """ - try: - return Button(detail) - except ValueError: - return Button.unknown - # pylint: enable=R0201 diff --git a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/INSTALLER b/PortablePython/Lib/site-packages/six-1.17.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/LICENSE b/PortablePython/Lib/site-packages/six-1.17.0.dist-info/LICENSE deleted file mode 100644 index 1cc22a5..0000000 --- a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -Copyright (c) 2010-2024 Benjamin Peterson - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/METADATA b/PortablePython/Lib/site-packages/six-1.17.0.dist-info/METADATA deleted file mode 100644 index cfde03c..0000000 --- a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/METADATA +++ /dev/null @@ -1,43 +0,0 @@ -Metadata-Version: 2.1 -Name: six -Version: 1.17.0 -Summary: Python 2 and 3 compatibility utilities -Home-page: https://github.com/benjaminp/six -Author: Benjamin Peterson -Author-email: benjamin@python.org -License: MIT -Classifier: Development Status :: 5 - Production/Stable -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 3 -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Libraries -Classifier: Topic :: Utilities -Requires-Python: >=2.7, !=3.0.*, !=3.1.*, !=3.2.* -License-File: LICENSE - -.. image:: https://img.shields.io/pypi/v/six.svg - :target: https://pypi.org/project/six/ - :alt: six on PyPI - -.. image:: https://readthedocs.org/projects/six/badge/?version=latest - :target: https://six.readthedocs.io/ - :alt: six's documentation on Read the Docs - -.. image:: https://img.shields.io/badge/license-MIT-green.svg - :target: https://github.com/benjaminp/six/blob/master/LICENSE - :alt: MIT License badge - -Six is a Python 2 and 3 compatibility library. It provides utility functions -for smoothing over the differences between the Python versions with the goal of -writing Python code that is compatible on both Python versions. See the -documentation for more information on what is provided. - -Six supports Python 2.7 and 3.3+. It is contained in only one Python -file, so it can be easily copied into your project. (The copyright and license -notice must be retained.) - -Online documentation is at https://six.readthedocs.io/. - -Bugs can be reported to https://github.com/benjaminp/six. The code can also -be found there. diff --git a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/RECORD b/PortablePython/Lib/site-packages/six-1.17.0.dist-info/RECORD deleted file mode 100644 index 603afd7..0000000 --- a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/RECORD +++ /dev/null @@ -1,8 +0,0 @@ -__pycache__/six.cpython-313.pyc,, -six-1.17.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -six-1.17.0.dist-info/LICENSE,sha256=Q3W6IOK5xsTnytKUCmKP2Q6VzD1Q7pKq51VxXYuh-9A,1066 -six-1.17.0.dist-info/METADATA,sha256=ViBCB4wnUlSfbYp8htvF3XCAiKe-bYBnLsewcQC3JGg,1658 -six-1.17.0.dist-info/RECORD,, -six-1.17.0.dist-info/WHEEL,sha256=pxeNX5JdtCe58PUSYP9upmc7jdRPgvT0Gm9kb1SHlVw,109 -six-1.17.0.dist-info/top_level.txt,sha256=_iVH_iYEtEXnD8nYGQYpYFUvkUW9sEO1GYbkeKSAais,4 -six.py,sha256=xRyR9wPT1LNpbJI8tf7CE-BeddkhU5O--sfy-mo5BN8,34703 diff --git a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/WHEEL b/PortablePython/Lib/site-packages/six-1.17.0.dist-info/WHEEL deleted file mode 100644 index 104f387..0000000 --- a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (75.6.0) -Root-Is-Purelib: true -Tag: py2-none-any -Tag: py3-none-any - diff --git a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/top_level.txt b/PortablePython/Lib/site-packages/six-1.17.0.dist-info/top_level.txt deleted file mode 100644 index ffe2fce..0000000 --- a/PortablePython/Lib/site-packages/six-1.17.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -six diff --git a/PortablePython/Lib/site-packages/six.py b/PortablePython/Lib/site-packages/six.py deleted file mode 100644 index 3de5969..0000000 --- a/PortablePython/Lib/site-packages/six.py +++ /dev/null @@ -1,1003 +0,0 @@ -# Copyright (c) 2010-2024 Benjamin Peterson -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -"""Utilities for writing code that runs on Python 2 and 3""" - -from __future__ import absolute_import - -import functools -import itertools -import operator -import sys -import types - -__author__ = "Benjamin Peterson " -__version__ = "1.17.0" - - -# Useful for very coarse version differentiation. -PY2 = sys.version_info[0] == 2 -PY3 = sys.version_info[0] == 3 -PY34 = sys.version_info[0:2] >= (3, 4) - -if PY3: - string_types = str, - integer_types = int, - class_types = type, - text_type = str - binary_type = bytes - - MAXSIZE = sys.maxsize -else: - string_types = basestring, - integer_types = (int, long) - class_types = (type, types.ClassType) - text_type = unicode - binary_type = str - - if sys.platform.startswith("java"): - # Jython always uses 32 bits. - MAXSIZE = int((1 << 31) - 1) - else: - # It's possible to have sizeof(long) != sizeof(Py_ssize_t). - class X(object): - - def __len__(self): - return 1 << 31 - try: - len(X()) - except OverflowError: - # 32-bit - MAXSIZE = int((1 << 31) - 1) - else: - # 64-bit - MAXSIZE = int((1 << 63) - 1) - del X - -if PY34: - from importlib.util import spec_from_loader -else: - spec_from_loader = None - - -def _add_doc(func, doc): - """Add documentation to a function.""" - func.__doc__ = doc - - -def _import_module(name): - """Import module, returning the module after the last dot.""" - __import__(name) - return sys.modules[name] - - -class _LazyDescr(object): - - def __init__(self, name): - self.name = name - - def __get__(self, obj, tp): - result = self._resolve() - setattr(obj, self.name, result) # Invokes __set__. - try: - # This is a bit ugly, but it avoids running this again by - # removing this descriptor. - delattr(obj.__class__, self.name) - except AttributeError: - pass - return result - - -class MovedModule(_LazyDescr): - - def __init__(self, name, old, new=None): - super(MovedModule, self).__init__(name) - if PY3: - if new is None: - new = name - self.mod = new - else: - self.mod = old - - def _resolve(self): - return _import_module(self.mod) - - def __getattr__(self, attr): - _module = self._resolve() - value = getattr(_module, attr) - setattr(self, attr, value) - return value - - -class _LazyModule(types.ModuleType): - - def __init__(self, name): - super(_LazyModule, self).__init__(name) - self.__doc__ = self.__class__.__doc__ - - def __dir__(self): - attrs = ["__doc__", "__name__"] - attrs += [attr.name for attr in self._moved_attributes] - return attrs - - # Subclasses should override this - _moved_attributes = [] - - -class MovedAttribute(_LazyDescr): - - def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): - super(MovedAttribute, self).__init__(name) - if PY3: - if new_mod is None: - new_mod = name - self.mod = new_mod - if new_attr is None: - if old_attr is None: - new_attr = name - else: - new_attr = old_attr - self.attr = new_attr - else: - self.mod = old_mod - if old_attr is None: - old_attr = name - self.attr = old_attr - - def _resolve(self): - module = _import_module(self.mod) - return getattr(module, self.attr) - - -class _SixMetaPathImporter(object): - - """ - A meta path importer to import six.moves and its submodules. - - This class implements a PEP302 finder and loader. It should be compatible - with Python 2.5 and all existing versions of Python3 - """ - - def __init__(self, six_module_name): - self.name = six_module_name - self.known_modules = {} - - def _add_module(self, mod, *fullnames): - for fullname in fullnames: - self.known_modules[self.name + "." + fullname] = mod - - def _get_module(self, fullname): - return self.known_modules[self.name + "." + fullname] - - def find_module(self, fullname, path=None): - if fullname in self.known_modules: - return self - return None - - def find_spec(self, fullname, path, target=None): - if fullname in self.known_modules: - return spec_from_loader(fullname, self) - return None - - def __get_module(self, fullname): - try: - return self.known_modules[fullname] - except KeyError: - raise ImportError("This loader does not know module " + fullname) - - def load_module(self, fullname): - try: - # in case of a reload - return sys.modules[fullname] - except KeyError: - pass - mod = self.__get_module(fullname) - if isinstance(mod, MovedModule): - mod = mod._resolve() - else: - mod.__loader__ = self - sys.modules[fullname] = mod - return mod - - def is_package(self, fullname): - """ - Return true, if the named module is a package. - - We need this method to get correct spec objects with - Python 3.4 (see PEP451) - """ - return hasattr(self.__get_module(fullname), "__path__") - - def get_code(self, fullname): - """Return None - - Required, if is_package is implemented""" - self.__get_module(fullname) # eventually raises ImportError - return None - get_source = get_code # same as get_code - - def create_module(self, spec): - return self.load_module(spec.name) - - def exec_module(self, module): - pass - -_importer = _SixMetaPathImporter(__name__) - - -class _MovedItems(_LazyModule): - - """Lazy loading of moved objects""" - __path__ = [] # mark as package - - -_moved_attributes = [ - MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), - MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), - MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), - MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), - MovedAttribute("intern", "__builtin__", "sys"), - MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), - MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), - MovedAttribute("getoutput", "commands", "subprocess"), - MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), - MovedAttribute("reduce", "__builtin__", "functools"), - MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), - MovedAttribute("StringIO", "StringIO", "io"), - MovedAttribute("UserDict", "UserDict", "collections", "IterableUserDict", "UserDict"), - MovedAttribute("UserList", "UserList", "collections"), - MovedAttribute("UserString", "UserString", "collections"), - MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), - MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), - MovedModule("builtins", "__builtin__"), - MovedModule("configparser", "ConfigParser"), - MovedModule("collections_abc", "collections", "collections.abc" if sys.version_info >= (3, 3) else "collections"), - MovedModule("copyreg", "copy_reg"), - MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), - MovedModule("dbm_ndbm", "dbm", "dbm.ndbm"), - MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread" if sys.version_info < (3, 9) else "_thread"), - MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), - MovedModule("http_cookies", "Cookie", "http.cookies"), - MovedModule("html_entities", "htmlentitydefs", "html.entities"), - MovedModule("html_parser", "HTMLParser", "html.parser"), - MovedModule("http_client", "httplib", "http.client"), - MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), - MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), - MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), - MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), - MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), - MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), - MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), - MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), - MovedModule("cPickle", "cPickle", "pickle"), - MovedModule("queue", "Queue"), - MovedModule("reprlib", "repr"), - MovedModule("socketserver", "SocketServer"), - MovedModule("_thread", "thread", "_thread"), - MovedModule("tkinter", "Tkinter"), - MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), - MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), - MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), - MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), - MovedModule("tkinter_tix", "Tix", "tkinter.tix"), - MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), - MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), - MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), - MovedModule("tkinter_colorchooser", "tkColorChooser", - "tkinter.colorchooser"), - MovedModule("tkinter_commondialog", "tkCommonDialog", - "tkinter.commondialog"), - MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), - MovedModule("tkinter_font", "tkFont", "tkinter.font"), - MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), - MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", - "tkinter.simpledialog"), - MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), - MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), - MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), - MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), - MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), -] -# Add windows specific modules. -if sys.platform == "win32": - _moved_attributes += [ - MovedModule("winreg", "_winreg"), - ] - -for attr in _moved_attributes: - setattr(_MovedItems, attr.name, attr) - if isinstance(attr, MovedModule): - _importer._add_module(attr, "moves." + attr.name) -del attr - -_MovedItems._moved_attributes = _moved_attributes - -moves = _MovedItems(__name__ + ".moves") -_importer._add_module(moves, "moves") - - -class Module_six_moves_urllib_parse(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_parse""" - - -_urllib_parse_moved_attributes = [ - MovedAttribute("ParseResult", "urlparse", "urllib.parse"), - MovedAttribute("SplitResult", "urlparse", "urllib.parse"), - MovedAttribute("parse_qs", "urlparse", "urllib.parse"), - MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), - MovedAttribute("urldefrag", "urlparse", "urllib.parse"), - MovedAttribute("urljoin", "urlparse", "urllib.parse"), - MovedAttribute("urlparse", "urlparse", "urllib.parse"), - MovedAttribute("urlsplit", "urlparse", "urllib.parse"), - MovedAttribute("urlunparse", "urlparse", "urllib.parse"), - MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), - MovedAttribute("quote", "urllib", "urllib.parse"), - MovedAttribute("quote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote", "urllib", "urllib.parse"), - MovedAttribute("unquote_plus", "urllib", "urllib.parse"), - MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), - MovedAttribute("urlencode", "urllib", "urllib.parse"), - MovedAttribute("splitquery", "urllib", "urllib.parse"), - MovedAttribute("splittag", "urllib", "urllib.parse"), - MovedAttribute("splituser", "urllib", "urllib.parse"), - MovedAttribute("splitvalue", "urllib", "urllib.parse"), - MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), - MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), - MovedAttribute("uses_params", "urlparse", "urllib.parse"), - MovedAttribute("uses_query", "urlparse", "urllib.parse"), - MovedAttribute("uses_relative", "urlparse", "urllib.parse"), -] -for attr in _urllib_parse_moved_attributes: - setattr(Module_six_moves_urllib_parse, attr.name, attr) -del attr - -Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes - -_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), - "moves.urllib_parse", "moves.urllib.parse") - - -class Module_six_moves_urllib_error(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_error""" - - -_urllib_error_moved_attributes = [ - MovedAttribute("URLError", "urllib2", "urllib.error"), - MovedAttribute("HTTPError", "urllib2", "urllib.error"), - MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), -] -for attr in _urllib_error_moved_attributes: - setattr(Module_six_moves_urllib_error, attr.name, attr) -del attr - -Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes - -_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), - "moves.urllib_error", "moves.urllib.error") - - -class Module_six_moves_urllib_request(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_request""" - - -_urllib_request_moved_attributes = [ - MovedAttribute("urlopen", "urllib2", "urllib.request"), - MovedAttribute("install_opener", "urllib2", "urllib.request"), - MovedAttribute("build_opener", "urllib2", "urllib.request"), - MovedAttribute("pathname2url", "urllib", "urllib.request"), - MovedAttribute("url2pathname", "urllib", "urllib.request"), - MovedAttribute("getproxies", "urllib", "urllib.request"), - MovedAttribute("Request", "urllib2", "urllib.request"), - MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), - MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), - MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), - MovedAttribute("BaseHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), - MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), - MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), - MovedAttribute("FileHandler", "urllib2", "urllib.request"), - MovedAttribute("FTPHandler", "urllib2", "urllib.request"), - MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), - MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), - MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), - MovedAttribute("urlretrieve", "urllib", "urllib.request"), - MovedAttribute("urlcleanup", "urllib", "urllib.request"), - MovedAttribute("proxy_bypass", "urllib", "urllib.request"), - MovedAttribute("parse_http_list", "urllib2", "urllib.request"), - MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), -] -if sys.version_info[:2] < (3, 14): - _urllib_request_moved_attributes.extend( - [ - MovedAttribute("URLopener", "urllib", "urllib.request"), - MovedAttribute("FancyURLopener", "urllib", "urllib.request"), - ] - ) -for attr in _urllib_request_moved_attributes: - setattr(Module_six_moves_urllib_request, attr.name, attr) -del attr - -Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes - -_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), - "moves.urllib_request", "moves.urllib.request") - - -class Module_six_moves_urllib_response(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_response""" - - -_urllib_response_moved_attributes = [ - MovedAttribute("addbase", "urllib", "urllib.response"), - MovedAttribute("addclosehook", "urllib", "urllib.response"), - MovedAttribute("addinfo", "urllib", "urllib.response"), - MovedAttribute("addinfourl", "urllib", "urllib.response"), -] -for attr in _urllib_response_moved_attributes: - setattr(Module_six_moves_urllib_response, attr.name, attr) -del attr - -Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes - -_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), - "moves.urllib_response", "moves.urllib.response") - - -class Module_six_moves_urllib_robotparser(_LazyModule): - - """Lazy loading of moved objects in six.moves.urllib_robotparser""" - - -_urllib_robotparser_moved_attributes = [ - MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), -] -for attr in _urllib_robotparser_moved_attributes: - setattr(Module_six_moves_urllib_robotparser, attr.name, attr) -del attr - -Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes - -_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), - "moves.urllib_robotparser", "moves.urllib.robotparser") - - -class Module_six_moves_urllib(types.ModuleType): - - """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" - __path__ = [] # mark as package - parse = _importer._get_module("moves.urllib_parse") - error = _importer._get_module("moves.urllib_error") - request = _importer._get_module("moves.urllib_request") - response = _importer._get_module("moves.urllib_response") - robotparser = _importer._get_module("moves.urllib_robotparser") - - def __dir__(self): - return ['parse', 'error', 'request', 'response', 'robotparser'] - -_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), - "moves.urllib") - - -def add_move(move): - """Add an item to six.moves.""" - setattr(_MovedItems, move.name, move) - - -def remove_move(name): - """Remove item from six.moves.""" - try: - delattr(_MovedItems, name) - except AttributeError: - try: - del moves.__dict__[name] - except KeyError: - raise AttributeError("no such move, %r" % (name,)) - - -if PY3: - _meth_func = "__func__" - _meth_self = "__self__" - - _func_closure = "__closure__" - _func_code = "__code__" - _func_defaults = "__defaults__" - _func_globals = "__globals__" -else: - _meth_func = "im_func" - _meth_self = "im_self" - - _func_closure = "func_closure" - _func_code = "func_code" - _func_defaults = "func_defaults" - _func_globals = "func_globals" - - -try: - advance_iterator = next -except NameError: - def advance_iterator(it): - return it.next() -next = advance_iterator - - -try: - callable = callable -except NameError: - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) - - -if PY3: - def get_unbound_function(unbound): - return unbound - - create_bound_method = types.MethodType - - def create_unbound_method(func, cls): - return func - - Iterator = object -else: - def get_unbound_function(unbound): - return unbound.im_func - - def create_bound_method(func, obj): - return types.MethodType(func, obj, obj.__class__) - - def create_unbound_method(func, cls): - return types.MethodType(func, None, cls) - - class Iterator(object): - - def next(self): - return type(self).__next__(self) - - callable = callable -_add_doc(get_unbound_function, - """Get the function out of a possibly unbound function""") - - -get_method_function = operator.attrgetter(_meth_func) -get_method_self = operator.attrgetter(_meth_self) -get_function_closure = operator.attrgetter(_func_closure) -get_function_code = operator.attrgetter(_func_code) -get_function_defaults = operator.attrgetter(_func_defaults) -get_function_globals = operator.attrgetter(_func_globals) - - -if PY3: - def iterkeys(d, **kw): - return iter(d.keys(**kw)) - - def itervalues(d, **kw): - return iter(d.values(**kw)) - - def iteritems(d, **kw): - return iter(d.items(**kw)) - - def iterlists(d, **kw): - return iter(d.lists(**kw)) - - viewkeys = operator.methodcaller("keys") - - viewvalues = operator.methodcaller("values") - - viewitems = operator.methodcaller("items") -else: - def iterkeys(d, **kw): - return d.iterkeys(**kw) - - def itervalues(d, **kw): - return d.itervalues(**kw) - - def iteritems(d, **kw): - return d.iteritems(**kw) - - def iterlists(d, **kw): - return d.iterlists(**kw) - - viewkeys = operator.methodcaller("viewkeys") - - viewvalues = operator.methodcaller("viewvalues") - - viewitems = operator.methodcaller("viewitems") - -_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") -_add_doc(itervalues, "Return an iterator over the values of a dictionary.") -_add_doc(iteritems, - "Return an iterator over the (key, value) pairs of a dictionary.") -_add_doc(iterlists, - "Return an iterator over the (key, [values]) pairs of a dictionary.") - - -if PY3: - def b(s): - return s.encode("latin-1") - - def u(s): - return s - unichr = chr - import struct - int2byte = struct.Struct(">B").pack - del struct - byte2int = operator.itemgetter(0) - indexbytes = operator.getitem - iterbytes = iter - import io - StringIO = io.StringIO - BytesIO = io.BytesIO - del io - _assertCountEqual = "assertCountEqual" - if sys.version_info[1] <= 1: - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" - else: - _assertRaisesRegex = "assertRaisesRegex" - _assertRegex = "assertRegex" - _assertNotRegex = "assertNotRegex" -else: - def b(s): - return s - # Workaround for standalone backslash - - def u(s): - return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") - unichr = unichr - int2byte = chr - - def byte2int(bs): - return ord(bs[0]) - - def indexbytes(buf, i): - return ord(buf[i]) - iterbytes = functools.partial(itertools.imap, ord) - import StringIO - StringIO = BytesIO = StringIO.StringIO - _assertCountEqual = "assertItemsEqual" - _assertRaisesRegex = "assertRaisesRegexp" - _assertRegex = "assertRegexpMatches" - _assertNotRegex = "assertNotRegexpMatches" -_add_doc(b, """Byte literal""") -_add_doc(u, """Text literal""") - - -def assertCountEqual(self, *args, **kwargs): - return getattr(self, _assertCountEqual)(*args, **kwargs) - - -def assertRaisesRegex(self, *args, **kwargs): - return getattr(self, _assertRaisesRegex)(*args, **kwargs) - - -def assertRegex(self, *args, **kwargs): - return getattr(self, _assertRegex)(*args, **kwargs) - - -def assertNotRegex(self, *args, **kwargs): - return getattr(self, _assertNotRegex)(*args, **kwargs) - - -if PY3: - exec_ = getattr(moves.builtins, "exec") - - def reraise(tp, value, tb=None): - try: - if value is None: - value = tp() - if value.__traceback__ is not tb: - raise value.with_traceback(tb) - raise value - finally: - value = None - tb = None - -else: - def exec_(_code_, _globs_=None, _locs_=None): - """Execute code in a namespace.""" - if _globs_ is None: - frame = sys._getframe(1) - _globs_ = frame.f_globals - if _locs_ is None: - _locs_ = frame.f_locals - del frame - elif _locs_ is None: - _locs_ = _globs_ - exec("""exec _code_ in _globs_, _locs_""") - - exec_("""def reraise(tp, value, tb=None): - try: - raise tp, value, tb - finally: - tb = None -""") - - -if sys.version_info[:2] > (3,): - exec_("""def raise_from(value, from_value): - try: - raise value from from_value - finally: - value = None -""") -else: - def raise_from(value, from_value): - raise value - - -print_ = getattr(moves.builtins, "print", None) -if print_ is None: - def print_(*args, **kwargs): - """The new-style print function for Python 2.4 and 2.5.""" - fp = kwargs.pop("file", sys.stdout) - if fp is None: - return - - def write(data): - if not isinstance(data, basestring): - data = str(data) - # If the file has an encoding, encode unicode with it. - if (isinstance(fp, file) and - isinstance(data, unicode) and - fp.encoding is not None): - errors = getattr(fp, "errors", None) - if errors is None: - errors = "strict" - data = data.encode(fp.encoding, errors) - fp.write(data) - want_unicode = False - sep = kwargs.pop("sep", None) - if sep is not None: - if isinstance(sep, unicode): - want_unicode = True - elif not isinstance(sep, str): - raise TypeError("sep must be None or a string") - end = kwargs.pop("end", None) - if end is not None: - if isinstance(end, unicode): - want_unicode = True - elif not isinstance(end, str): - raise TypeError("end must be None or a string") - if kwargs: - raise TypeError("invalid keyword arguments to print()") - if not want_unicode: - for arg in args: - if isinstance(arg, unicode): - want_unicode = True - break - if want_unicode: - newline = unicode("\n") - space = unicode(" ") - else: - newline = "\n" - space = " " - if sep is None: - sep = space - if end is None: - end = newline - for i, arg in enumerate(args): - if i: - write(sep) - write(arg) - write(end) -if sys.version_info[:2] < (3, 3): - _print = print_ - - def print_(*args, **kwargs): - fp = kwargs.get("file", sys.stdout) - flush = kwargs.pop("flush", False) - _print(*args, **kwargs) - if flush and fp is not None: - fp.flush() - -_add_doc(reraise, """Reraise an exception.""") - -if sys.version_info[0:2] < (3, 4): - # This does exactly the same what the :func:`py3:functools.update_wrapper` - # function does on Python versions after 3.2. It sets the ``__wrapped__`` - # attribute on ``wrapper`` object and it doesn't raise an error if any of - # the attributes mentioned in ``assigned`` and ``updated`` are missing on - # ``wrapped`` object. - def _update_wrapper(wrapper, wrapped, - assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - for attr in assigned: - try: - value = getattr(wrapped, attr) - except AttributeError: - continue - else: - setattr(wrapper, attr, value) - for attr in updated: - getattr(wrapper, attr).update(getattr(wrapped, attr, {})) - wrapper.__wrapped__ = wrapped - return wrapper - _update_wrapper.__doc__ = functools.update_wrapper.__doc__ - - def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, - updated=functools.WRAPPER_UPDATES): - return functools.partial(_update_wrapper, wrapped=wrapped, - assigned=assigned, updated=updated) - wraps.__doc__ = functools.wraps.__doc__ - -else: - wraps = functools.wraps - - -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - - def __new__(cls, name, this_bases, d): - if sys.version_info[:2] >= (3, 7): - # This version introduced PEP 560 that requires a bit - # of extra care (we mimic what is done by __build_class__). - resolved_bases = types.resolve_bases(bases) - if resolved_bases is not bases: - d['__orig_bases__'] = bases - else: - resolved_bases = bases - return meta(name, resolved_bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - - -def add_metaclass(metaclass): - """Class decorator for creating a class with a metaclass.""" - def wrapper(cls): - orig_vars = cls.__dict__.copy() - slots = orig_vars.get('__slots__') - if slots is not None: - if isinstance(slots, str): - slots = [slots] - for slots_var in slots: - orig_vars.pop(slots_var) - orig_vars.pop('__dict__', None) - orig_vars.pop('__weakref__', None) - if hasattr(cls, '__qualname__'): - orig_vars['__qualname__'] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def ensure_binary(s, encoding='utf-8', errors='strict'): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, binary_type): - return s - if isinstance(s, text_type): - return s.encode(encoding, errors) - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding='utf-8', errors='strict'): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - # Optimization: Fast return for the common case. - if type(s) is str: - return s - if PY2 and isinstance(s, text_type): - return s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - return s.decode(encoding, errors) - elif not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - return s - - -def ensure_text(s, encoding='utf-8', errors='strict'): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def python_2_unicode_compatible(klass): - """ - A class decorator that defines __unicode__ and __str__ methods under Python 2. - Under Python 3 it does nothing. - - To support Python 2 and 3 with a single code base, define a __str__ method - returning text and apply this decorator to the class. - """ - if PY2: - if '__str__' not in klass.__dict__: - raise ValueError("@python_2_unicode_compatible cannot be applied " - "to %s because it doesn't define __str__()." % - klass.__name__) - klass.__unicode__ = klass.__str__ - klass.__str__ = lambda self: self.__unicode__().encode('utf-8') - return klass - - -# Complete the moves implementation. -# This code is at the end of this module to speed up module loading. -# Turn this module into a package. -__path__ = [] # required for PEP 302 and PEP 451 -__package__ = __name__ # see PEP 366 @ReservedAssignment -if globals().get("__spec__") is not None: - __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable -# Remove other six meta path importers, since they cause problems. This can -# happen if six is removed from sys.modules and then reloaded. (Setuptools does -# this for some reason.) -if sys.meta_path: - for i, importer in enumerate(sys.meta_path): - # Here's some real nastiness: Another "instance" of the six module might - # be floating around. Therefore, we can't use isinstance() to check for - # the six meta path importer, since the other six instance will have - # inserted an importer with different class. - if (type(importer).__name__ == "_SixMetaPathImporter" and - importer.name == __name__): - del sys.meta_path[i] - break - del i, importer -# Finally, add the importer to the meta path import hook. -sys.meta_path.append(_importer) diff --git a/PortablePython/_asyncio.pyd b/PortablePython/_asyncio.pyd deleted file mode 100644 index dd16af6b746f5b5c3dbf53ee8216ae78df1758cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77288 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 diff --git a/PortablePython/_ctypes.pyd b/PortablePython/_ctypes.pyd deleted file mode 100644 index 018eda190098ef6be242c0aa2450e6b4899db42f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140632 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⪻)M0SF48j_QtGf_;fSh*odn0p9ugun7`Msn+ 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�I^GtGCa#*S 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 C&<*PV diff --git a/PortablePython/_decimal.pyd b/PortablePython/_decimal.pyd deleted file mode 100644 index 7dfb6006110fcff6e769498c40650a1a68da0030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283992 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%0A;qqt^>F%pcg^~ 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 diff --git a/PortablePython/_lzma.pyd b/PortablePython/_lzma.pyd deleted file mode 100644 index 98781edf6ae5c9d79e0cfabd5fd9fdd59193adfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160232 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 diff --git a/PortablePython/_overlapped.pyd b/PortablePython/_overlapped.pyd deleted file mode 100644 index 5ea0657be5e3de70cc1560e86c653ff3706bbc6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58200 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 M;*B1*WPwck4-C$N^8f$< diff --git a/PortablePython/_queue.pyd b/PortablePython/_queue.pyd deleted file mode 100644 index 7632b73d7140546bd5e7ceccbb9c741b6ab0ee36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35672 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 diff --git a/PortablePython/_remote_debugging.pyd b/PortablePython/_remote_debugging.pyd deleted file mode 100644 index f29eddd0fd518d59d1e572e94928ba438aeec1af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44376 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 sxg(z~Dn{Z4m>G&^uV@ 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 Gru_rq*AL_X diff --git a/PortablePython/_socket.pyd b/PortablePython/_socket.pyd deleted file mode 100644 index e249f3015f4b0069a597e2f16c4aa9afd2653261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87384 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 JLw8`E1^~Bv41)jw diff --git a/PortablePython/_sqlite3.pyd b/PortablePython/_sqlite3.pyd deleted file mode 100644 index 52e4bc2c0cb31564c38d05c075cbca4ff317faa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132440 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 Dj{=whlTQ=J~`z{J$|FY)5$@Hzr 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 z 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%0A`YOs;u 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≺;pQtD7I zDvR!UarYT*uvce|eLCE4)Z;#*JMR0L-XqhwKVr}NWP7omhG^DPGnDmIM`7+C*m|!6 zHs7*u@Sy!?Di`+_TJ|QmF%|p5%iGL7_860KFNND96J_Q0-HmmRdo7TgyZ5Yj;_q8f zohbfJAg3o`->jxwqE$30fl=MAj+=MCEC?I^>3l@)W;+w0oh*Ad&uxGlsmQC{wx z1G74TJuXfs9qb?b*fJl3n)zr#aPKOZ`AGVi=+&ei+&yJy?BU|RGWLOb>}=V`PT=n~ zVQq(d=|Rkgd)@(SV#7n8U+HLE zHSTZ5{hON)tkJivn7tn3bSD|>1iq8rRwv=^X;?8EJ??36{hXd@!Tp_JjNhC+wew5> zcmD?WZqSE12MhOa#5#yNG?qmOwaNNs?4!j<0m4baWfu!LE0cy}g+f1n&^=y_rBH$Mq{1)hygXbmf$ zXwGUjDA?*Ttzk_FJA-)jMqzf7@H{l)T`>v^K$suGQjPLUKv)IBB8|dy2rEHYM?ZRg znSLt-+%90ffK3A47SM_6fnTtIBLz$qP$ys&%B9}{0Z$0{&EtIdaRF-tTqR(MfYSs_ z5Kt|kQa~F4e-`pB7mzCy|85HBKZic)w@1Kr0FW_JSeFSt6@Q?9) zJuV7(T)+bYZWVBqfb#{^2$&$?U;zUJ^b(K>*euA|C}5p{I|Qr{Fj>&YJv>iHzpDa% zBH#f5w+gsiz!Cwc2{=)}SOLQX^b*iQz?*{J&k0yB;0^)T3btFM`#W4X@!Pi^tKlKZ?ov!fkQa zcNvb5AP-lKlq9Vo3Qm2J;MXTV3$v71+HieA9u>=$$P#9y45jzwxYy#@9tFxy8I3mz zk*0`V4ZkW%Gc-*Dp^EV8D?+aelAr(~^P6J4art;rYdRdBz;}SAkfoA@#ThAF{(?3? z7E(j&cuNc(6;1TRXV{`5wtf>87DT8PTmP-*Zr-eM;(AIxu}1}G|TS`-!D4$wA;E65*LNbWw^2tk@rymHtf zPFHkFY~}nGc}QVNc$-d(@5*s?fV|^#v@=l^l*Ef439A{GpF{61a>0TLFfXLwteL9- zuO&yS7564G^h-`#ppTQH^wfxW=0&h!=%1W#h-N%mu$)A^HJOvA6>R5olp(fGbjrAV zyt$q+oka?9c>(#TH7J>0P8Cgn+J--~M?5ncZ{y+JD$!OraaaV-;;rdI>aI`*_wK9~ zW55ZMk};aFTPQUiuN|hq1n4_@!cmk?hxfx7zAwaEDKg=kh}Y{7qx>o1JEAn`Oq{8* zUs_9wD~uD|W3f}Mp(CPG_P?dKbxRgPl4cdc?D?=$WaF($+_^9wN2F>>rdv4^n?^1*-!EF~o^LvKjQDM(Mrgi8mrAW=wOEY)o3$<>T^sL(#O1ro%bqVuqEYYjk+}5t^%`c_%XoypI{Y&zOuR zBTpz=F$i-)T%mAKpdYSHBUuyRo`oi~IkK@uTK%j9tsYM7^2i$<_x>}weZ>8_$7xuk zQ7AuNA&@zl(csB-ykuxFst^^>62~GWF*${_P~s!U=cMc5111_aTF6!yty_|4I3edk zY%8RV(WVz=Woh-Ilo8ZFGIY@3AmZ}iYDHX_{V)EH(m?RWul?8HxvGEq`*@1-L}nxH zIPiXUd5-�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 z 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 diff --git a/PortablePython/libcrypto-3.dll b/PortablePython/libcrypto-3.dll deleted file mode 100644 index b7a525aa3b7f1391dc85c314d333eab25ce1bde8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5231472 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Š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¥nG_K&L4nj=ZvLasA#||%3fVmT*K|rVD_VLCo$@0as0TxP8guBu#FuW@*ocq zUc**j32oV1qQdyK0`%>+1d;{0a<>~ydR1CgrGlwoe-0?pY@LS%=c7d2?vPc zk3&0~y7Mtv#webW+S%$x8^fGmsx!B#3okr1@>=lAN6y}*f~=wy_v84A@dF}3rhCa? z5WxuqRj
    m&20fw+{-1=-yU?fA;Ww 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 >J#U>-?^ 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%0AuTG0U#Jr4ujZyniFc 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 z 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 C^c6S& diff --git a/PortablePython/_wmi.pyd b/PortablePython/_wmi.pyd deleted file mode 100644 index 2ac520ff0de87a4a88687fc952c54b0a6b8946f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40792 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 diff --git a/PortablePython/_zoneinfo.pyd b/PortablePython/_zoneinfo.pyd deleted file mode 100644 index db27d13006ddf5f380abfb4342dfa91d8523b7f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51544 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 V&mlc1;AxZS#7+att{BL){{Xo8x*z}m diff --git a/PortablePython/_zstd.pyd b/PortablePython/_zstd.pyd deleted file mode 100644 index 2a3fe89ee6e52bd223f6597fb050158671267de3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503640 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