Il arrive souvent que vous souhaitiez travailler avec un objet vivant en l'attachant à un processus Python déjà en cours d'exécution.
――Il est bon de créer un graphique qui prend beaucoup de temps à prétraiter, mais j'ai oublié d'écrire le processus pour enregistrer les données.
Cela peut être facile si l'EDI fonctionne dans un environnement local, mais cela devient plus problématique si vous utilisez un SSH sur une machine GPU ou similaire.
Cette fois, je vais vous montrer comment résoudre ces problèmes avec une combinaison d'outils légers et portables.
- Petit est beau. Petit est beau ――La philosophie UNIX――
Par exemple, ciblez un programme qui continue d'afficher le nombre de secondes écoulées chaque seconde. Le fait est que vous n'avez pas besoin d'importer des bibliothèques supplémentaires ou d'insérer des extraits de code à l'avance.
roop.py
import time
n = 0
while True:
print(n)
time.sleep(1)
n += 1
Isolez-le intentionnellement, créez un processus qui n'a pas de terminal de contrôle et expérimentez.
$ nohup python roop.py & ; exit
Tout d'abord, prenez l'entrée / sortie standard de la cible et remplacez-la par le terminal préparé.
# -s Descripteur de fichier cible 0,1,Volez même si 2 n'est pas connecté à TTY.
$ reptyr -s $PID
Ensuite, injectez le code de démarrage du débogueur suivant dans la cible.
$ pyrasite $PID set_pudb.py
Réécrivez la variable «n» à partir du shell interne du débogueur qui a été démarré en dernier et essayez de progresser.
set_pudb.py
import pudb
pudb.set_trace()
En le prenant par reptyr, je suis venu toucher la bûche qui avait disparu dans le passé.
Vous pouvez également voir qu'il reflète l'exécution de chaque boucle et le changement en n = -100
en ajoutant un point d'arrêt.
Remarque: Vous verrez «aucun code source disponible» sur le chemin, mais vous pouvez appuyer sur «n» jusqu'à ce que vous reveniez de la fonction C.
Enfin, je publierai un script qui rendra le contenu jusqu'ici agréable.
injector.sh
#!/bin/bash
tmpfile=`mktemp`
PID=`pgrep -a python|fzf|awk '{print $1}'`
[ -z "$PID" ] && exit 1
cat << EOF > $tmpfile
import pudb
pudb.set_trace()
EOF
pyrasite $PID $tmpfile &
reptyr -s $PID
Recommended Posts