Skip to main content

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.

Comments

No comments yet. Be the first!