如何让python脚本自行更改?
要把它煮沸,我希望有一个像这样的python脚本(run.py
)
a = 0
b = 1
print a + b
# do something here such that the first line of this script reads a = 1
这样,下次运行脚本时,它看起来像
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])
答案 0 :(得分:4)
例如(每次运行时更改a
的值):
a = 0
b = 1
print a + b
with open(__file__, 'r') as f:
lines = f.read().split('\n')
val = int(lines[0].split(' = ')[-1])
new_line = 'a = {}'.format(val+1)
new_file = '\n'.join([new_line] + lines[1:])
with open(__file__, 'w') as f:
f.write('\n'.join([new_line] + lines[1:]))
答案 1 :(得分:0)
您要求的内容要求您在{sys}级别操作文件;基本上,您可以读取当前文件,修改它,覆盖它并重新加载当前模块。我简单地玩这个因为我很好奇,但我遇到了文件锁定和文件权限问题。那些可能可以解决,但我怀疑这不是你想要的。
首先:要意识到保持代码和数据之间的分离通常是一个好主意。这有例外,但是对于大多数用途,您希望使程序中可以在运行时更改的部分从文件中读取其配置,并将更改写入该文件。
第二:从表面上看,大多数python项目使用YAML进行配置
这是一个简单的脚本,它使用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
初始YAML配置文件如下所示:
a: 1
b: 2
答案 2 :(得分:-1)
在一行中创建一个包含一个字符的文件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。