2013-08-20 13 views
5

Czy możliwe jest (niekoniecznie za pomocą introspekcji Pythona) wydrukowanie kodu źródłowego skryptu?Skrypt w języku Python wypisujący jego źródło

Chcę wykonać krótki skrypt Pythona, który również wydrukuje jego źródło (tak, aby zobaczyć, które polecenia są wykonywane).

Skrypt jest coś takiego:

command1() 
#command2() 
command3() 

print some_variable_that_contain_src 

Prawdziwa aplikacja jest, że chcę, aby uruchomić skrypt z ipython z run -i magii i posiada na wyjściu źródła (czyli polecenia wykonywane). W ten sposób mogę sprawdzić, które polecenia są komentowane przy każdym wykonaniu. Co więcej, jeśli zostanie wykonany w Notatniku, pozostawiam ślad, który z poleceń został użyty.

Rozwiązanie

Korzystanie korylprince rozwiązanie I skończyć z tym jednym-liner należy umieścić na początku skryptu:

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

To będzie drukować źródła skryptu wyjątkiem pierwszej linii (to byłby tylko hałas). Łatwo też zmodyfikować cięcie, aby wydrukować inny "kawałek" skryptu.

Jeśli chcesz zamiast wydrukować cały plik, jedno-liner upraszcza się do:

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

może zajrzeć do pakietu inspect w python: http://www.python.org/doc//current/library/inspect.html. W szczególności metoda 'getource' – Greg

+0

Ten typ programów nazywa się Quine programs. http://en.wikipedia.org/wiki/Quine_(computing) Próbuję napisać je samemu w pythonie, jego zbyt cholernie trudnym. :( – thefourtheye

+0

Dlaczego usunąć pierwszy wiersz? Otrzymasz skrypt, który po uruchomieniu wypisuje kod źródłowy *, który nie zawiera niczego na temat drukowania jego kodu źródłowego * Jest to mylące: pierwsza linia to nie hałas, więcej niż komentarze lub zapewnienia są szumami – user2357112

Odpowiedz

8

Dopóki nie jesteś robienie czegokolwiek zwariowanego z paczkami, umieść to na górze skryptu:

Który odczyta w bieżącym pliku i wydrukować go.

+0

Tak, działa to tylko wtedy, gdy umieści się je na początku skryptu.Jeśli wstawię na końcu i wykonam inne skrypty, wydrukowany zostanie ostatni wykonany plik . – user2304916

4

Do najprostszych odpowiedzi:

import my_module 

print open(my_module.__file__).read() 

Próbowałem również przy użyciu pakietu wglądu.

import inspect 

import my_module 

source_list = inspect.getsourcelines(my_module) 

daje listę ciągów z kodu źródłowego określonych w nim

for line in source_list[0]: 
    print line 

wypisze całego kodu źródłowego w sposób czytelny

+0

To nie działa dla skryptu, ponieważ po prostu go wykonuję, a nie go importuję – user2304916