2017-07-18 20 views
0

私はPython Language Servicesを使用して、または他の方法でそのスクリプト自体のコードを変更できるpythonスクリプトを作成したいと思います。
このスクリプトコードの実行が成功に成功し、実行自己修正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__を開くことでしたreguler expationsなどを使用してrequried変更を行います。しかし、それは動作しませんでした。例外io.UnsupportedOperation: not readableがあります。このアプローチがうまくいくとしても、私のスクリプト全体を損なう可能性があるので、非常に危険です。私はPython Language Servicesを使って解決策を探しています。

+1

あなたは '__file__'を開いて編集することができます。 – kichik

+0

アクセス権がないユーザーがスクリプトを実行した場合のアクセス許可で問題が発生する可能性があることに注意してください。 – Leon

+0

'io.UnsupportedOperation:not readable' –

答えて

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

私は泣き言を投稿する前にこれを試しました。これは動作しません。 'io.UnsupportedOperation:not readable' –

+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 

、動的に生成された新しいコードによって、ファイル自体を変更せずに元のソースファイルに含まれているものを置き換えることができます。