2012-08-10 19 views
7

In Python, il seguente snippet di codice aprirà una shell interattiva al momento dell'esecuzione.Python: code.interact (local = locals()) dove stdin/stdout non sono disponibili

import code; code.interact(local = locals())

Questo si è rivelato estremamente utile per il debugging in un po 'di codice che è scarsamente documentata. Si può usare la shell per navigare all'interno dell'ambiente del programma e capire cosa sta succedendo, anche senza un debugger. Fin qui tutto bene.

Ora la sfida.

Il software che sto usando (che è scritto in Django, tra l'altro) utilizza una sorta di meccanismo di programmazione che poi parla un altro processo Python, alla quale non ho alcun controllo su altro che modificare il suo codice. Non ho input ad esso diverso dalle variabili che invio ad esso per l'elaborazione.

Tuttavia, non so come funziona il codice poiché la documentazione è molto scarsa, quindi ho voluto utilizzare il metodo code.interact per capire le cose.

Ma questo processo è avviato da qualche parte sullo sfondo da qualche software di programmazione speciale, quindi il flusso non passa dall'applicazione Django alle parti che desidero esaminare. Invece, vengono inviati un segnale e un oggetto che vengono poi eseguiti successivamente, in un tempo arbitrario (ovunque tra 10-200ms) in un processo completamente diverso. Quando il segnale e l'oggetto sono ricevuti, stdin/stdout è completamente fuori dall'immagine.

Quindi ho pensato che invece di usare stdin/stdout per comunicare con code.interact potrei usare un handle di file o un socket Unix specificando il parametro readfunc. Ho provato questo da open() un file e socket, ma senza alcun risultato.

Ora sto cercando di ottenere che funzioni semplicemente dal processo Django stesso così anche il problema di pianificazione è fuori questione, e mentre la shell interattiva effettivamente parte, si spegne immediatamente, né accetta un file con comandi come contenuto, né un socket Unix a cui vengono inviati i comandi Python.

Per farla breve; è possibile comunicare con una shell interattiva invocata da code.interact con altri mezzi rispetto a stdin/stdout? Se é cosi, come?

Grazie in anticipo.

risposta

4

Non seguo completamente la parte riguardante lo scheduler e il django e qualsiasi altra cosa.

Ma per rispondere il nucleo della tua domanda:

#!/usr/bin/python 

import code 

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

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

code.interact(readfunc=readfunc) 

Poi gestita che in un terminale:

$ ./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) 

Avviso non si ottiene un prompt.

Poi in un altro terminale eseguire:

echo "globals()" >> input.txt 

E di nuovo nel primo terminale si vedrà l'uscita.

Problemi correlati