Cela va interrompre votre processus (sauf si vous démarrez dans un thread), mais vous pouvez utiliser l' code
module pour démarrer une console Python:
import code
code.interact()
Cela va bloquer jusqu'à ce que l'utilisateur quitte la console interactive par l'exécution de l' exit()
.
L' code
module est disponible dans au moins Python v2.6, et probablement d'autres.
J'ai tendance à utiliser cette approche en combinaison avec les signaux pour mon Linux de travail (pour Windows, voir ci-dessous). Je claque en haut de mes scripts Python:
import code
import signal
signal.signal(signal.SIGUSR2, lambda sig, frame: code.interact())
Et puis déclencher à partir d'un shell avec kill -SIGUSR2 <PID>
où <PID>
est l'ID de processus. Le processus s'arrête tout ce qu'il fait et présente une console:
Python 2.6.2 (r262:71600, Oct 9 2009, 17:53:52)
[GCC 3.4.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Généralement à partir de là, je vais charger le composant côté serveur d'un débogueur distant comme l'excellent WinPDB.
Windows n'est pas POSIX-compatible OS, et ainsi de ne pas fournir les mêmes signaux que Linux. Cependant, Python v2.2 et au-dessus d'exposer un Windows-signal spécifique SIGBREAK
(déclenché en appuyant sur CTRL
+Pause/Break
). Cela ne veut pas interférer avec la normale CTRL
+C
(SIGINT
) de l'opération, et est donc une alternative pratique.
Donc un portable, mais un peu moche, la version ci-dessus est:
import code
import signal
signal.signal(
vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR2"),
lambda sig, frame: code.interact()
)
Les avantages de cette approche:
- Pas de modules externes (tous les standards de Python, des trucs)
- À peine consomme toutes les ressources jusqu'à ce déclenchée (2x importation)