One command to explain your Python environment, trace imports, and detect shadows.
Project description
pywho
One command to explain your Python environment, trace imports, and detect shadows.
Ever asked "Which Python am I running? Why did import X load that file? Do I have any files shadowing real modules?" — pywho answers all of it instantly.
Quick Reference
| Command | Description |
|---|---|
pywho |
Show a full report of your Python environment |
pywho --json |
Output environment report as JSON |
pywho --packages |
Include all installed packages in the report |
pywho --no-pip |
Skip pip version detection (faster) |
pywho trace <module> |
Trace where an import resolves and show search order |
pywho trace <module> --verbose |
Trace with full sys.path search log |
pywho trace <module> --json |
Trace output as JSON |
pywho scan . |
Scan project for files that shadow stdlib/installed packages |
pywho scan . --no-installed |
Scan against stdlib only (skip installed packages) |
pywho scan . --json |
Scan output as JSON |
python -m pywho |
Run as a Python module |
Table of Contents
Getting Started
pip install pywho
Or with uv:
uv pip install pywho
Or run without installing:
uvx pywho
Why pywho?
- "Works on my machine" is the #1 debugging friction in Python. pywho kills it with one command.
- Paste the output into a GitHub issue, Slack message, or Stack Overflow question. Done.
- Zero dependencies. Pure stdlib. Works everywhere Python runs.
- Cross-platform. Linux, macOS, Windows. Python 3.9+.
Usage
Environment Inspection
pywho
pywho - Python Environment Inspector
==============================================
Interpreter
Executable: /Users/dev/.venv/bin/python3
Version: 3.12.3 (CPython)
Compiler: Clang 15.0.0 (clang-1500.3.9.4)
Architecture: 64-bit
Platform
System: Darwin 24.1.0
Machine: arm64
Virtual Environment
Active: Yes
Type: uv
Path: /Users/dev/myproject/.venv
Prompt: myproject
Paths
Prefix: /Users/dev/myproject/.venv
Base Prefix: /opt/homebrew/Cellar/python@3.12/...
Site-packages: /Users/dev/myproject/.venv/lib/python3.12/site-packages
Package Manager
Detected: uv
pip version: 24.0
sys.path
[0] (empty string = cwd)
[1] /opt/homebrew/.../python312.zip
[2] /opt/homebrew/.../python3.12
...
JSON output (for CI, scripts, sharing)
pywho --json
Include installed packages
pywho --packages
Skip pip version check (faster)
pywho --no-pip
Run as module
python -m pywho
Import Tracing
Trace exactly where an import resolves and why:
pywho trace requests
Import Resolution: requests
========================================
Resolved to: /Users/dev/.venv/lib/python3.12/site-packages/requests/__init__.py
Module type: third-party (package)
Cached: No
Search order:
[0] /Users/dev/myproject -> not found
[1] /usr/lib/python3.12 -> not found
[2] ~/.venv/lib/.../site-packages -> FOUND
Full search log
pywho trace json --verbose
JSON trace output
pywho trace requests --json
Shadow detection (single module)
$ pywho trace requests
WARNING: './requests.py' shadows installed package 'requests'
Shadow Scanning
Scan an entire project for files that shadow stdlib or installed packages:
$ pywho scan .
Found 2 shadow(s)
2 HIGH (stdlib)
[HIGH] math.py
shadows stdlib module 'math'
[HIGH] json.py
shadows stdlib module 'json'
Scan with JSON output
pywho scan . --json
Scan stdlib only (skip installed packages)
pywho scan . --no-installed
Smart exclusions — these directories are automatically skipped: .venv, __pycache__, node_modules, dist, build, .git, and more.
Python API
Environment inspection
from pywho import inspect_environment
report = inspect_environment()
print(report.executable) # /usr/bin/python3
print(report.venv.is_active) # True
print(report.venv.type) # "uv"
print(report.package_manager) # "uv"
# Get JSON-serializable dict
data = report.to_dict()
Import tracing
from pywho import trace_import
trace = trace_import("requests")
print(trace.resolved_path) # /path/to/requests/__init__.py
print(trace.module_type) # ModuleType.THIRD_PARTY
print(trace.is_cached) # True
print(trace.shadows) # [] (empty = no shadows)
if trace.shadows:
for s in trace.shadows:
print(f"WARNING: {s.description}")
Shadow scanning
from pywho import scan_path
from pathlib import Path
results = scan_path(Path("."))
for r in results:
print(f"[{r.severity.value.upper()}] {r.path} shadows {r.module_name}")
What It Detects
Interpreters
- CPython, PyPy, and other implementations
- Version, compiler, architecture (32/64-bit)
- Build date
Virtual environments
| Type | Detection method |
|---|---|
| venv | sys.prefix != sys.base_prefix |
| virtualenv | orig-prefix.txt in lib directory |
| uv | uv = in pyvenv.cfg |
| conda | CONDA_DEFAULT_ENV env var |
| poetry | POETRY_ACTIVE env var |
| pipenv | PIPENV_ACTIVE env var |
Package managers
Detects: pip, uv, conda, poetry, pipenv, pyenv
Paths
sys.prefix,sys.base_prefix,sys.exec_prefix- All
site-packagesdirectories - Full
sys.pathwith index numbers
Packages
With --packages: lists all installed packages with versions and locations.
Import shadows
- Single-module detection via
pywho trace - Project-wide scanning via
pywho scan - Severity levels: HIGH (stdlib) and MEDIUM (installed)
Use Cases
| Scenario | Command |
|---|---|
| Debug "works on my machine" | pywho --json → paste into issue |
| Verify onboarding setup | pywho |
| CI environment snapshots | pywho --json --packages > env.json |
| Find why an import is wrong | pywho trace <module> |
| Audit project for shadows | pywho scan . |
| Ask users for their env | "Please run pywho" |
Platforms
| Platform | Status |
|---|---|
| Linux | ✅ Supported |
| macOS | ✅ Supported |
| Windows | ✅ Supported |
| Python | Status |
|---|---|
| 3.9+ | ✅ Supported |
| 3.10 – 3.14 | ✅ Tested in CI |
Development
git clone https://github.com/AhsanSheraz/pywho.git
cd pywho
uv venv && source .venv/bin/activate
uv pip install -e ".[dev]"
pytest -v
mypy src/pywho
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pywho-0.3.0.tar.gz.
File metadata
- Download URL: pywho-0.3.0.tar.gz
- Upload date:
- Size: 17.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c41b671583a7bdddf2053ada81ded4c1fabd26ba28a08299c560507a69c08b96
|
|
| MD5 |
6df3488d77fa67f301908acd895bedc3
|
|
| BLAKE2b-256 |
933f27cf0aeba4ecb1c08e745323b07e56831a7dd6768718fa3cc9c0b2bca822
|
Provenance
The following attestation bundles were made for pywho-0.3.0.tar.gz:
Publisher:
ci.yml on AhsanSheraz/pywho
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pywho-0.3.0.tar.gz -
Subject digest:
c41b671583a7bdddf2053ada81ded4c1fabd26ba28a08299c560507a69c08b96 - Sigstore transparency entry: 1107826622
- Sigstore integration time:
-
Permalink:
AhsanSheraz/pywho@1d3256ae2f538a51f386b4e0d71019f3ad69a8e6 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/AhsanSheraz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@1d3256ae2f538a51f386b4e0d71019f3ad69a8e6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pywho-0.3.0-py3-none-any.whl.
File metadata
- Download URL: pywho-0.3.0-py3-none-any.whl
- Upload date:
- Size: 19.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4a5e960cdb1ab1bc68a40d0baeddd92aa02fa3e919937aafce4e83051656ab6
|
|
| MD5 |
fe2926625c428de8af082051628ea36d
|
|
| BLAKE2b-256 |
84df58c828c598c88a9b908434a3b734cb0af45eb35923ed20b509ac7ac80a99
|
Provenance
The following attestation bundles were made for pywho-0.3.0-py3-none-any.whl:
Publisher:
ci.yml on AhsanSheraz/pywho
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pywho-0.3.0-py3-none-any.whl -
Subject digest:
f4a5e960cdb1ab1bc68a40d0baeddd92aa02fa3e919937aafce4e83051656ab6 - Sigstore transparency entry: 1107826627
- Sigstore integration time:
-
Permalink:
AhsanSheraz/pywho@1d3256ae2f538a51f386b4e0d71019f3ad69a8e6 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/AhsanSheraz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@1d3256ae2f538a51f386b4e0d71019f3ad69a8e6 -
Trigger Event:
push
-
Statement type: