2013-08-20 104 views
5

是否有可能(不必使用python introspection)來打印腳本的源代碼?打印其源代碼的Python腳本

我想執行一個短的python腳本,也打印它的源代碼(所以我可以看到哪些命令被執行)。

劇本是這樣的:

command1() 
#command2() 
command3() 

print some_variable_that_contain_src 

真正的應用程序是,我要與run -i魔術運行從IPython的一個腳本,並作爲輸出源(即指令執行)。通過這種方式,我可以檢查每次執行時評論哪些命令。而且,如果在筆記本上執行,我會留下一些已使用過的命令。

解決方案

使用korylprince解決方案,我結束了這一個班輪在腳本的開頭放:

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

這將打印除了第一行的腳本源(那隻會是噪音)。爲了打印腳本的另一個「切片」,修改切片也很容易。

如果你想打印整個文件相反,一個班輪簡化爲:

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

也許你可以看看python中的inspect包:http://www.python.org/doc//current/library/inspect.html。特別是'getsource'方法 – Greg

+0

這種類型的程序被稱爲Quine程序。 http://en.wikipedia.org/wiki/Quine_(computing)我試圖用python寫一個自己,太難了。 :( – thefourtheye

+0

爲什麼要刪除第一行?你得到一個腳本,當它運行時,打印出的源代碼*不包含任何關於打印其源代碼的內容。*這很令人困惑,第一行不是噪聲。評論或斷言是噪聲 – user2357112

回答

8

只要你不用軟件包做任何瘋狂的事情,把它放在腳本的頂部

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

這將讀取在當前文件中並打印出來。

+0

是的,只有當放在腳本的開始時纔有效,如果放在末尾,並執行其他腳本,最後執行的文件將被打印。 – user2304916

4

對於最簡單的答案:

import my_module 

print open(my_module.__file__).read() 

我也使用可視組件嘗試。

import inspect 

import my_module 

source_list = inspect.getsourcelines(my_module) 

會給你的源代碼串在其中定義

for line in source_list[0]: 
    print line 

會打印出完整的源代碼以可讀的方式列表

+0

這不適用於腳本,因爲我只是執行它,而不是導入它 – user2304916