2017-07-18 104 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 

所以,通过新的动态生成的代码,您可以替换原始源文件中包含的内容,而无需修改文件本身。