2013-08-20 20 views
5

E 'possibile (non necessariamente usando l'introspezione di Python) stampare il codice sorgente di uno script?Script Python che stampa la sua fonte

Voglio eseguire un breve script python che stampi anche la sua origine (in modo da poter vedere quali comandi sono eseguiti).

Lo script è qualcosa di simile:

command1() 
#command2() 
command3() 

print some_variable_that_contain_src 

La vera domanda è che voglio per eseguire uno script da IPython con la magia run -i e hanno come output la fonte (vale a dire i comandi eseguiti). In questo modo posso controllare quali comandi sono commentati ad ogni esecuzione. Inoltre, se eseguito in un Notebook, lascia una traccia di quali comandi sono stati usati.

Soluzione

Utilizzando korylprince soluzione io alla fine con questo one-liner da mettere all'inizio dello script:

with open(__file__) as f: print '\n'.join(f.read().split('\n')[1:]) 

Questo stamperà la sorgente dello script, tranne la prima linea (quello sarebbe solo rumore). È anche facile modificare l'affettamento per stampare una "fetta" diversa dello script.

Se si desidera stampare l'intero file, invece, l'one-liner semplifica a:

with open(__file__) as f: print f.read() 
+0

forse esaminare il pacchetto inspect in python: http://www.python.org/doc//current/library/inspect.html. In particolare il metodo 'getsource' – Greg

+0

Questo tipo di programmi sono chiamati programmi Quine. http://en.wikipedia.org/wiki/Quine_(computing) Sto provando a scriverne uno io stesso in Python, è troppo dannatamente difficile. :( – thefourtheye

+0

Perché rimuovere la prima riga? Si ottiene uno script che, quando viene eseguito, stampa il codice sorgente * che non contiene nulla sulla stampa del suo codice sorgente *. È confuso. La prima riga non è rumore più del commenti o asserzioni sono rumore – user2357112

risposta

8

Finché non si è facendo qualcosa di pazzo con i pacchetti, mettilo all'inizio del tuo script

with open(__file__) as f: 
    print f.read() 

Quale leggerà nel file corrente e stamparlo.

+0

Sì, funziona solo se messo all'inizio dello script.Se messo alla fine e eseguo altri script verrà stampato l'ultimo file eseguito . – user2304916

4

Per la risposta più semplice:

import my_module 

print open(my_module.__file__).read() 

Ho anche provato ad utilizzare il pacchetto di ispezionare.

import inspect 

import my_module 

source_list = inspect.getsourcelines(my_module) 

Vi darà una lista di stringhe con il codice sorgente definite in esso

for line in source_list[0]: 
    print line 

stamperà l'intero codice sorgente in modo leggibile

+0

Questo non funziona per uno script dato che l'ho appena eseguito, non lo importa – user2304916

Problemi correlati