python: est-il possible de joindre une console dans un processus en cours d'exécution
Je veux juste voir l'état de la procédure, est-il possible de joindre une console dans le processus, de sorte que je peux invoquer des fonctions à l'intérieur du processus et de voir certains des variables globales.
C'est mieux le processus est en cours d'exécution, sans être affectée(bien sûr, la performance peut tomber un peu)
- donc, fondamentalement, un débogueur?
- quelque chose comme l'interpréteur de ligne de commande python.exe
- apb version: stackoverflow.com/questions/25308847/...
Vous devez vous connecter pour publier un commentaire.
Si vous avez accès au code source du programme-code, vous pouvez ajouter cette fonctionnalité relativement facilement.
Voir Recette 576515:
Debugging a running python process by interrupting and providing an interactive prompt (Python)
Citer:
Une autre mise en œuvre de la peu près le même concept est fourni par rconsole. À partir de la documentation:
rfoo._rfoo.EofError: 0
Cela va interrompre votre processus (sauf si vous démarrez dans un thread), mais vous pouvez utiliser le
code
module pour démarrer une console Python:Cela va bloquer jusqu'à ce que l'utilisateur quitte la console interactive par l'exécution de
exit()
.La
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:
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: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 un POSIX-compatible OS, et ainsi de ne pas fournir les mêmes signaux que Linux. Cependant, Python v2.2 et au-dessus de l'exposer à une spécifiques à Windows signal
SIGBREAK
(déclenché en appuyant sur laCTRL
+Pause/Break
). Ce n' pas interférer avec la normaleCTRL
+C
(SIGINT
) de l'opération, et est donc une alternative pratique.Donc un portable, mais un peu moche, la version ci-dessus est:
Avantages de cette approche:
Voici le code que j'utilise dans mon environnement de production qui va charger le côté serveur de WinPDB (si disponible) et de revenir à l'ouverture d'une console Python.
Utilisation pyrasite-shell. Je ne peux pas croire que cela fonctionne si bien, mais il le fait. "Lui donner un pid, obtenir un shell".
Cela lance l'interface python avec accès à la globals() et les habitants() les variables de l'exécution de python processus, et d'autres choses merveilleuses.
Uniquement testé personnellement sur Ubuntu mais semble satisfaire OSX trop.
Adapté de cette réponse.
Remarque: La ligne d'éteindre le
ptrace_scope
propriété n'est nécessaire que pour les noyaux/systèmes qui ont été construits avecCONFIG_SECURITY_YAMA
sur. Prenez soin de vous embêter avec ptrace_scope dans des environnements sensibles, car il pourrait introduire certaines failles de sécurité. Voir ici pour plus de détails.Pourquoi ne pas tout simplement à l'aide de la apb module? Il vous permet d'arrêter un script, d'inspecter les éléments de valeurs, et d'exécuter le code ligne par ligne. Et puisqu'il est construit sur l'interpréteur Python, il fournit également les fonctionnalités fournies par le classique interprète. Pour l'utiliser, il suffit de mettre ces 2 lignes dans votre code, si vous souhaitez arrêter et inspecter:
Une autre possibilité, sans avoir à ajouter des trucs pour les scripts python, qui est décrit ici:
https://wiki.python.org/moin/DebuggingWithGdb
Malheureusement, cette solution nécessite également de prévoyance, au moins dans la mesure où il est nécessaire d'utiliser une version de python avec les symboles de débogage en elle.
À l'aide de PyCharm, je recevais un échec de connexion à traiter dans Ubuntu. Le correctif de ce est de désactiver YAMA. Pour plus d'info voir askubuntu