Nested subprocess `python -m ...` fails module resolution only when parent is launched via debugpy

Abierto
#2,002 4 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Necesita aclaración
Estado de actividad
Tranquilo
Stack tecnológico
python
Área
devtools

Línea de trabajo

Comienza reproduciendo el fallo con la estructura de launch.json de VS Code y con python -m debugpy --listen ... -m ...; después compara el entorno y la resolución de módulos de subprocess.run anidado con el lanzamiento sin depuración. El trabajo estará completo cuando se identifique si debugpy provoca la resolución diferente de -m y se documente o implemente una solución determinista, cubriendo también la disposición src/ en Windows y el caso de PYTHONPATH.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Summary

In a Windows project with src/ layout, a parent Python module runs correctly under debugpy, but a child subprocess started from that parent with:

python -m my_tools.tasks.validation.main

fails with:

No module named my_tools.tasks.validation.main

The exact same child command succeeds outside debugpy (normal terminal/task run).


Environment

  • OS: Windows (PowerShell)
  • Python: virtualenv interpreter (.venv\Scripts\python.exe), debugpy 1.8.19
  • VS Code Python extension (debugpy launcher used by VS Code)
  • Project layout: src/my_tools/...
  • PYTHONPATH in launch config: <workspace>/src

Expected behavior

If parent process is launched via debugpy and parent starts child with:

<venv_python> -m my_tools.tasks.validation.main ...

then child should resolve and execute module exactly as in terminal mode.


Actual behavior

When parent is launched via debugpy (module launch in launch.json), child subprocess fails:

No module named my_tools.tasks.validation.main

When parent is launched normally (no debugpy), same child command succeeds.


Reproduction pattern

Parent debug launch (fails in child)

VS Code launch command shape:

<venv>\python.exe <...>\debugpy\launcher <port> -- -m my_tools.service.runner.main ...

Inside parent:

cmd = [
    sys.executable,
    "-m",
    "my_tools.tasks.validation.main",
    "--help",
]
subprocess.run(
    cmd,
    cwd="<workspace>",
    env=env_with_pythonpath,
    capture_output=True,
    text=True,
)

Result under debug launch:

stderr: No module named my_tools.tasks.validation.main
Parent non-debug launch (works)
python -m my_tools.service.runner.main ...

Result: child module resolves and completes successfully.

Manual debugpy CLI launch (also fails)

After installing debugpy into the same venv, launching parent via CLI debugpy reproduces the same child failure:

python -m debugpy --listen 5678 -m my_tools.service.runner.main --queue-root <...> --work-root <...> --once --log-level DEBUG

Result:

stderr: No module named my_tools.tasks.validation.main

Sanity checks already done

All of the following succeed in same venv:

python -c "import os,sys,importlib.util as u,my_tools; print(sys.executable); print(os.getenv('PYTHONPATH')); print(u.find_spec('my_tools.tasks.validation.main'))"

find_spec(...) returns valid ModuleSpec under <workspace>/src/my_tools/....

Also succeeds:

python -c "import os,sys,subprocess; env=os.environ.copy(); env['PYTHONPATH']=r'<workspace>\\src;<workspace>/src'; cmd=[sys.executable,'-m','my_tools.tasks.validation.main','--help']; r=subprocess.run(cmd,cwd=r'<workspace>',env=env,capture_output=True,text=True); print(r.returncode); print(r.stderr)"

Return code is 0, stderr empty.


Why this looks debugpy-related

  • Same interpreter path.
  • Same module path.
  • Same child command works outside debugpy.
  • Failure appears when parent is launched via debugpy (VS Code launcher and manual python -m debugpy).
  • The failing point is nested child module resolution via -m.

Current workaround

  • Run parent as normal task/terminal (non-debug) for production-like execution.
  • Alternative code workaround: launch child by script path instead of -m, e.g.:
python <workspace>/src/my_tools/tasks/validation/main.py ...

Question to maintainers

Is this a known issue/limitation with:

  • debugpy launcher + nested subprocess -m calls
  • src/ layout + PYTHONPATH
  • Windows-specific env/path propagation

and is there a recommended debugpy setting to make nested child -m module resolution deterministic?

Lenguaje dominante
Python
Estrellas
2.5k
Forks
202
Merge medio
5 d 1 h
PR fusionados (30 d)
1

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/debugpy

Todos los issues de microsoft/debugpy

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.