如何在Python脚本持续运行时替换自身代码中的指定行?
问题
能否通过Python脚本自身代码,在脚本持续运行的同时替换其中某一行代码?(以下为简化示例,已知并非最优实现方式,仅用于特定场景测试)
现有单次运行可生效的代码:
import re a = 0 f = open("main.py","r") lines = f.read() lines = re.sub(r"a = .+\n",r"a = " + str(a+1) + "\n",lines,count=1) f.close() f = open("main.py","w") f.writelines(lines) f.close()
每次运行该代码,变量a的值会加1。但添加循环后:
import re import time a = 0 while True: f = open("main.py","r") lines = f.read() lines = re.sub(r"a = .+\n",r"a = " + str(a+1) + "\n",lines,count=1) f.close() f = open("main.py","w") f.writelines(lines) f.close() time.sleep(2)
预期每2秒将a的值加1,但实际上只有在脚本结束(因循环为无限循环,需手动终止)时才会生效。请问如何实现脚本持续运行时持续修改代码?
解决方案
问题核心是内存中的变量a没有同步文件的修改:脚本启动时a = 0只执行一次,后续循环始终用内存里的初始值计算a+1,导致每次写入文件的都是a = 1,直到脚本终止前的最后一次覆盖才会显示变化。
要实现持续修改,每次循环必须先从文件中读取最新的a值,再计算更新:
修改后的代码:
import re import time while True: # 读取文件最新内容,提取当前a的值 with open("main.py", "r") as f: lines = f.read() # 匹配并解析当前a的数值 match = re.search(r"a = (\d+)", lines) if match: current_a = int(match.group(1)) new_a = current_a + 1 # 替换文件中的a值 updated_lines = re.sub(r"a = .+\n", f"a = {new_a}\n", lines, count=1) # 写入更新后的内容 with open("main.py", "w") as f: f.write(updated_lines) time.sleep(2)
另外,使用with语句操作文件更安全,它会自动处理文件关闭,避免手动关闭可能出现的遗漏。
注意:这种自我修改代码的方式仅适合测试场景,实际开发中容易引发文件读写冲突、代码逻辑混乱等问题,不推荐使用。
内容的提问来源于stack exchange,提问作者idonthaveagoodname
相关产品推荐
相关产品推荐

