2012-08-10 9 views
7

In Python öffnet das folgende Code-Snippet eine interaktive Shell bei der Ausführung.Python: code.interact (local = locals()) wobei stdin/stdout nicht verfügbar ist

Dies hat sich als äußerst nützlich für die Fehlersuche in ziemlich wenig Code, der schlecht dokumentiert ist, erwiesen. Man kann die Shell verwenden, um in der Programmumgebung zu navigieren und selbst ohne einen Debugger herauszufinden, was passiert. So weit, ist es gut.

Jetzt die Herausforderung. Die Software, die ich benutze (die übrigens in Django geschrieben ist), benutzt eine Art von Scheduling-Mechanismus, der dann zu einem anderen Python-Prozess spricht, auf den ich keine Kontrolle über andere als die Bearbeitung seines Codes habe. Ich habe keine anderen Eingaben als die Variablen, die ich zur Verarbeitung an sie sende.

Allerdings weiß ich nicht, wie der Code funktioniert, da die Dokumentation sehr schlecht ist, also wollte ich die code.interact Methode verwenden, um die Dinge herauszufinden.

Dieser Prozess wird jedoch irgendwo im Hintergrund von einer speziellen Scheduling-Software gestartet, sodass der Fluss nicht von der Django-Anwendung zu den Abschnitten verläuft, die ich untersuchen möchte. Stattdessen werden ein Signal und ein Objekt gesendet, die später zu einem beliebigen Zeitpunkt (irgendwo zwischen 10-200ms) in einem völlig anderen Prozess ausgeführt werden. Wenn das Signal und das Objekt empfangen werden, ist stdin/stdout vollständig aus dem Bild.

So dachte ich, dass statt stdin/stdout mit code.interact kommunizieren könnte ich ein Datei-Handle oder Unix-Socket verwenden, indem Sie die readfunc Parameter. Ich habe dies von open() versucht, eine Datei und Socket, aber ohne Erfolg.

Jetzt versuche ich, dass das nur aus dem Django-Prozess selbst funktioniert, so dass selbst das Scheduling-Problem nicht in Frage kommt und während die interaktive Shell tatsächlich startet, wird sie sofort beendet und akzeptiert keine Datei mit Befehlen als Inhalt, noch ein Unix-Socket, an den Python-Befehle weitergeleitet werden.

Um eine lange Geschichte kurz zu machen; Ist es möglich, mit einer interaktiven Shell zu kommunizieren, die durch code.interact auf andere Weise als stdin/stdout aufgerufen wird? Wenn das so ist, wie?

Vielen Dank im Voraus.

Antwort

4

Ich folge nicht das Bit über den Scheduler und Django und was auch immer.

Aber den Kern Ihrer Frage zu beantworten:

#!/usr/bin/python 

import code 

f = open('input.txt', 'r') 

def readfunc(prompt): 
    return f.readline() 

code.interact(readfunc=readfunc) 

Dann, dass in einem Terminal ausführen:

$ ./test.py 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 

Hinweis Sie eine Eingabeaufforderung nicht bekommen.

Dann in einem anderen Terminal laufen:

echo "globals()" >> input.txt 

Und zurück in den ersten Anschluss haben Sie die Ausgabe.