2017-07-18 105 views
0

我想創建python腳本,可以使用Python Language Services或使用任何其他方式修改該腳本本身的代碼。
例如它保持它的全成執行自我修改python腳本

import re 
COUNT = 0 

def updateCount(): 
    # code to update second line e.g. COUNT = 0 
    pass 

if __name__ == '__main__': 
    print('This script has run {} times'.format(COUNT)) 
    updateCount() 

的計數的軌道上的這個腳本代碼成功執行的腳本應該得到改變

import re 
COUNT = 1 

def updateCount(): 
    # code to update second line e.g. COUNT = 0 
    pass 

if __name__ == '__main__': 
    print('This script has run {} times'.format(COUNT)) 
    updateCount() 

簡單的方式來到我的腦海裏是寫模式打開__file__和做requried修改使用reguler expessions等,但沒有工作,我得到了異常io.UnsupportedOperation: not readable。即使這種方法可行,那也是非常危險的,因爲它會破壞我的整個腳本。所以我正在尋找使用Python語言服務的解決方案。

+1

您可以打開並編輯'__file__'。 – kichik

+0

請注意,您可能會遇到權限問題(如果腳本是由沒有寫入權限的用戶運行的話)。 – Leon

+0

不起作用'io.UnsupportedOperation:不可讀' –

回答

4

python腳本不過是一個文本文件。所以,你可以打開它作爲外部文件,並閱讀&。 (使用__file__變量,你可以得到你的腳本的確切名稱):

def updateCount(): 
    fin = open(__file__, 'r') 
    code = fin.read() 
    fin.close() 

    second_line = code.split('\n')[1] 
    second_line_parts = second_line.split(' ') 
    second_line_parts[2] = str(int(second_line_parts[2])+1) 

    second_line = ' '.join(second_line_parts) 
    lines = code.split('\n') 
    lines[1] = second_line 
    code = '\n'.join(lines) 

    fout = open(__file__, 'w') 
    fout.write(code) 
    fout.close() 
+0

在發佈我的quiestion之前,我嘗試了這個。這是行不通的,並給出 'io.UnsupportedOperation:不可讀' –

+0

由於'fout.read()'這是不必要的,因此將整個文件加載到內存中......另外,使用'with'打開會更明智並正確關閉文件....除此之外,很好的答案! –

+2

@AlokSinghMahor如果你嘗試過它並沒有奏效,你爲什麼不在你的問題中寫下這些內容? –

0

是的,你可以使用語言服務,以實現自我修改,如下面的例子:

>>> def foo(): print("original foo") 
>>> foo() 
original foo 
>>> rewrite_txt="def foo(): print('I am new foo')" 
>>> newcode=compile(rewrite_text,"",'exec') 
>>> eval(newcode) 
>>> foo() 
I am new foo 

所以,通過新的動態生成的代碼,您可以替換原始源文件中包含的內容,而無需修改文件本身。