Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使python脚本改变自身?_Python_Runtime_Interpreter - Fatal编程技术网

如何使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-文件,一切都应该正常工作 编辑: 它可能不够清晰,但脚本应该更新自身,而不是任何其他文件。当然,一旦允许脚本旁边有一个简单的

如何使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
-文件,一切都应该正常工作

编辑: 它可能不够清晰,但脚本应该更新自身,而不是任何其他文件。当然,一旦允许脚本旁边有一个简单的配置文件,这项任务就很简单了

回答:

这实际上比想象的要容易得多@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将如何让这些行写入?脚本需要以读取方式打开,然后逐行复制到一个新文件(以写入方式打开),并根据需要更改这些行。然后重新命名副本。事实上,你在第一段描述的东西正是我想要的。