2013-12-11 39 views
1

我正在编写一个程序,它将运行大量的打印输出。我真正想要做的是获得某些打印输出,并在关闭后直接写入我的程序。Python:修改它自己的程序

看成是如果有一个“保存()”功能,使“打印()”,将工作像这样的相似:

string = "#this my generated comment" 
save(string,line) 

当然行会在您想要的串线保存到程序中。现在请记住,我不只限于添加注释,我希望代码在下一次调用新行时执行。

如果要做到这一点的唯一方法是保存文件,编辑它,然后重新加载,那很好。一个基本的步行将不胜感激,

编辑:另外,我不反对保存添加的行到另一个文件,然后从程序中导入的想法。

感谢,

+2

我真的不建议你这样做的。 a)它需要你以某种方式解析你的模块。 b)它需要Python内部专家的知识c)在源代码中存储数据的做法很差 - 使用数据库,JSON/Pickled文件,CSV,任何东西。 –

+0

添加到编辑:将它保存到另一个文件,然后从程序内导入它,以添加它? –

+0

@NickSimas您正在混合数据和代码。 – Hyperboreus

回答

1

评论者指出,这是不好的形式/差实践动态修改Python程序可以说是非常错误的。这是我多次亲身使用过的python的主要功能之一(作为一名CS毕业生,从事PL理论研究)。然而,他们正确地认为使用像“x = x + 1”这样的字符串进行元编程是不好的形式。如果您想要即时更改程序的运行,则应使用type function。另外看看在元编程下面的教程在python:

http://python-3-patterns-idioms-test.readthedocs.org/en/latest/Metaprogramming.html

如果你真的需要在整个程序的运行保存的一个类的实例,那么你可以使用pickle library为詹姆斯米尔斯在答复中指出。这是简单的:

#!/usr/bin/python 

class HelloWorld: 

    def __init__(self, string): 
    self.string = string 

    def run(self): 
    print self.string 

import pickle 
pickle.dump(HelloWorld, open("prog.pkl", 'w')) 
HW = pickle.load(open("prog.pkl", 'r')) 
x = HW("Hello World") 
x.run() 

编辑:为了拥有“代码将执行下一个新的行称为一次”你不希望使用inspect.getsource(),而应该(以下上面的代码) :

import types 
def newfncn(self): 
    print self.string + " 2.0!" 
x.run = types.MethodType(newfncn, x) 
x.run() 

如果你真的必须使用字符串编辑您的代码,你可以这样做:

import types 
def newfncn(self): 
    exec("print self.string + \" 2.0!\"") 
x.run = types.MethodType(newfncn, x) 
x.run() 

,我强烈建议agai NST。

+0

IHMO的操作并不是在谈论** meta编程**。问题更多集中在保存**用户数据**。我同意你的观点,因为我已经完成了许多**元程序设计**,如我的电路应用程序框架所示 - Python具有非常强大的元编程功能,如果使用得当,它非常有用。 –

+0

我喜欢你要去的地方,但我不太明白。提供上下文:我试图从inspect.getsource()退出一个函数。是的,我想要一个存储版本的函数,但理想情况下,我希望程序能够继续运行,因为我描述了“下次调用新行时将执行的代码”。还有其他方法可以做到这一点,但我无法知道如何在不修改实际程序文件的情况下使用inspect.getsource()来执行此操作。 –

+0

又见(梯一半),我前面的问题:http://stackoverflow.com/questions/20510020/python-literally-printing-a-function –

3

而不是试图修改正在运行的模块的源代码/程序考虑以下任何一项:

  • 您的数据写入到一个JSON /泡椒序列化文件。
  • 将您的数据写入CSV文件。
  • 使用SQLite(自带大多数Python发行
  • 使用任何其他种类的真正数据库。

一些有用的链接:

+0

在这种情况下,这个方案的本质取决于执行此操作。这可能是困难的,也许是非正统的,但它是必要的。 –

+0

也许有一些方法来追加源代码?只要能够加入就能解决问题。 –

+0

如果你想保存“用户数据”,这仍然不是一个好主意。使用“某种数据存储”要好得多。 –