Many Processes, Many Interpreters (Why VS Code Shows Different Python Versions)
Modern Python tooling doesn’t run on “one Python.” Instead, different parts of your development environment may be running different Python interpreters concurrently, each with its own purpose.
This is why you may see:
- One version in
poetry env info - A different version in the VS Code status bar
- Another version running the language server
- Yet another version building wheels, linting, formatting, or running tests
All of these are normal — because each subsystem invokes Python independently.
1. Your project interpreter
This is the Python interpreter located in your virtual environment:
./.venv/bin/python → Python 3.x
This interpreter is used for:
- Running your code
- Executing scripts inside the venv
- Tools installed inside the venv (pytest, ruff, black, mypy, etc.)
- Poetry’s isolated runtime
- VS Code intellisense (eventually…)
This is the one you care about for correctness.
2. The global interpreter
When VS Code starts, it boots using whichever Python is first in your PATH.
This might be:
/usr/bin/python3.10
This interpreter may be used for:
- Bootstrapping VS Code’s Python extension
- Running the Pylance language server (initially)
- Running extension host utilities
- Providing Python paths before a venv is selected
VS Code launching with a global Python does not affect your project unless the extension fails to switch over properly.
3. The language server interpreter
VS Code’s Python tooling (Pylance, the Python extension) is itself a program that needs a Python executable to operate.
The language server:
- Starts before you select an interpreter
- Often stays bound to the Python it started with
- Sometimes fails to restart automatically when selecting a new interpreter
- May display its own Python version in the bottom status bar (misleading)
This is why the status bar can show something like:
Python 3.10.19 (qlir-py3.13)
even though your actual venv is Python 3.13.7.
4. Tools that may use their own Python processes
Some tools don’t use your venv Python at all unless configured:
Ruff
Runs as a separate Rust binary → doesn’t care about Python versions.
Mypy
May spawn its own Python interpreter based on your configuration.
Pytest
Runs under the selected interpreter, but discovery may use the global one.
Poetry
Uses your system Python + its own internal environment to manage deps.
Debug Adapter
VS Code’s debugger uses the interpreter you select, but its own internal processes may still run under a global Python.
5. The result: many interpreters simultaneously
At any moment, you may have processes running under:
./.venv/bin/python(the actual project)/usr/bin/python3.10(global)- An internal Poetry Python (
python3.13) - VS Code’s extension host Python
- The Python fork used for building wheels
- The Python used by testing or linting tools
This is completely normal.