如何使python脚本改变自身?
如何使python脚本改变自身 简而言之,我想要一个类似这样的python脚本(如何使python脚本改变自身?,python,runtime,interpreter,Python,Runtime,Interpreter,如何使python脚本改变自身 简而言之,我想要一个类似这样的python脚本(run.py) 这样下次运行脚本时 a = 1 b = 1 print a + b # do something here such that the first line of this script reads a = 2 这有可能吗?脚本可能使用外部资源;但是,只要运行一个run.py-文件,一切都应该正常工作 编辑: 它可能不够清晰,但脚本应该更新自身,而不是任何其他文件。当然,一旦允许脚本旁边有一个简单的
run.py
)
这样下次运行脚本时
a = 1
b = 1
print a + b
# do something here such that the first line of this script reads a = 2
这有可能吗?脚本可能使用外部资源;但是,只要运行一个run.py
-文件,一切都应该正常工作
编辑:
它可能不够清晰,但脚本应该更新自身,而不是任何其他文件。当然,一旦允许脚本旁边有一个简单的配置文件,这项任务就很简单了
回答:
这实际上比想象的要容易得多@khelwood的建议效果很好,打开脚本并编写自己的内容是完全没有问题的@Gerrat的解决方案也很有效。我就是这样做的:
# -*- coding: utf-8 -*-
a = 0
b = 1
print a + b
content = []
with open(__file__,"r") as f:
for line in f:
content.append(line)
with open(__file__,"w") as f:
content[1] = "a = {n}\n".format(n=b)
content[2] = "b = {n}\n".format(n=a+b)
for i in range(len(content)):
f.write(content[i])
例如(每次运行时更改a
的值):
制作一个文件
a.txt
,其中一行包含一个字符:
0
然后在脚本中,打开该文件并检索值,然后立即更改:
with open('a.txt') as f:
a = int(f.read())
with open('a.txt', 'w') as output:
output.write(str(a+1))
b = 1
print a+b
在程序第一次运行时,
a
将是0
,它将更改文件以包含1
。在随后的运行中,a
每次将继续递增1。您所要求的将要求您在{sys}级别操作文件;基本上,您需要读入当前文件,修改它,重写它,然后重新加载当前模块。因为好奇,我简单地玩了一下这个,但我遇到了文件锁定和文件权限问题。这些可能是可以解决的,但我怀疑这并不是你真正想要的
第一:认识到在代码和数据之间保持分离通常是个好主意。对此也有例外,但对于大多数情况,您需要使程序中可以在运行时更改的部分从文件中读取其配置,并将更改写入同一文件
第二:从我的角度来看,大多数python项目都使用配置
下面是一个简单的脚本,它使用yaml库读取名为“config.yaml”的文件,并在程序每次运行时递增“a”的值:
#!/usr/bin/python
import yaml
config_vals = ""
with open("config.yaml", "r") as cr:
config_vals = yaml.load(cr)
a = config_vals['a']
b = config_vals['b']
print a + b
config_vals['a'] = a + 1
with open("config.yaml", "w") as cw:
yaml.dump(config_vals, cw, default_flow_style=True)
运行时输出如下所示:
$ ./run.py
3
$ ./run.py
4
$ ./run.py
5
a: 1
b: 2
初始YAML配置文件如下所示:
$ ./run.py
3
$ ./run.py
4
$ ./run.py
5
a: 1
b: 2
是的,这是可能的。事实上,有几种方法可以实现这一目标。是的,这是可能的,但为什么呢?您可以使用
open('run.py','w')…
打开脚本并对其进行修改,如果您需要的话。这就是您想要知道的全部内容吗?脚本名称位于\uuuuu文件中(请参阅),您可以像打开任何其他文件一样打开它。但是,如果您只想在两次运行之间保存数据,还有更好的方法。@khelwood:如果您以写入方式打开原始文件,那么OP将如何让这些行写入?脚本需要以读取方式打开,然后逐行复制到一个新文件(以写入方式打开),并根据需要更改这些行。然后重新命名副本。事实上,你在第一段描述的东西正是我想要的。