如何让python脚本自行更改?

时间:2016-09-22 15:43:33

标签: python runtime interpreter

如何让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])

3 个答案:

答案 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。

相关问题