自我修改python脚本
我想创建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语言服务的解决方案。
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()
在发布我的quiestion之前,我尝试了这个。这是行不通的,并给出 'io.UnsupportedOperation:不可读' –
由于'fout.read()'这是不必要的,因此将整个文件加载到内存中......另外,使用'with'打开会更明智并正确关闭文件....除此之外,很好的答案! –
@AlokSinghMahor如果你尝试过它并没有奏效,你为什么不在你的问题中写下这些内容? –
是的,你可以使用语言服务,以实现自我修改,如下面的例子:
>>> 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
所以,通过新的动态生成的代码,您可以替换原始源文件中包含的内容,而无需修改文件本身。
您可以打开并编辑'__file__'。 – kichik
请注意,您可能会遇到权限问题(如果脚本是由没有写入权限的用户运行的话)。 – Leon
不起作用'io.UnsupportedOperation:不可读' –