Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Change python source while running

Tags:

Is it possible to change python source file while running an application and have this changes reflected immediately in the application?

Let say I have a foo.py file with a class Foo. In other module I'm calling functions on the Foo on user action. Now, I would like to change source of the Foo without restarting the application and on next user input see the results of the new code.

Would that be possible?

like image 892
Miroslav Zadravec Avatar asked Sep 27 '11 17:09

Miroslav Zadravec


People also ask

Can you change Python code while running?

No, the result will not reflect the changes once saved. The result will not change when running regular python files. You will have to save your changes and re-run your program.

How do you change code in Python?

For some GainSeeker Python commands, you can first use a simple Action interface to insert a block of basic code, and then modify that code as desired. To do so, right-click the line of code where you wish to insert the basic code block, and then choose Add Action.

Can you run a Python program without saving it?

No, it is not possible.

How do I run a Python .py file in idle?

To execute a file in IDLE, simply press the F5 key on your keyboard. You can also select Run → Run Module from the menu bar. Either option will restart the Python interpreter and then run the code that you've written with a fresh interpreter.


2 Answers

Yes, but it ill advised — code which changes itself (although necessary in some cases) is notoriously hard to debug. You're looking for the reload method. The way that you would get it to work would be to modify the source file and then call reload on the module, then repeat.

You do have the option of re-assigning and modifying the code within the application itself — something which does not risk race conditions and it will also allow for a more consistent and testable environment. For an example, I would recomment Ignacio Vazquez-Abrams's answer.


Have you tried to see what you could manage by merely changing a state (an external config file, database entry, etc)

like image 77
cwallenpoole Avatar answered Sep 21 '22 18:09

cwallenpoole


The following module can probably change whatever you need, not that it's a good idea to use, other than to muck around : )

Note that it will not change your source, which would probably be a disaster, especially if you make a coding error. The 'safer' option would be to play with byteplay

http://wiki.python.org/moin/ByteplayDoc

Ok, now let's play! Say we want to change the function, to print its arguments in reverse order. To do this, we will add a ROT_TWO opcode after the two arguments were loaded to the stack. See how simple it is:

>>> from byteplay import * >>> from pprint import pprint >>> def f(a, b): ...     print (a, b) ... >>> f(3, 5) (3, 5) >>> c = Code.from_code(f.func_code) >>> c.code[3:3] = [(ROT_TWO, None)] >>> f.func_code = c.to_code() >>> f(3, 5) (5, 3) >>> f(3, 5) (5, 3) 

If you are using a defined set of options but want to preserve the same function call, you can also do something like the following

class Foo(object):      def fn(self):          pass      def op1(self):          print "HELLO"      #etc  >>> a = Foo() >>> a.fn() >>> a.fn = a.op1 >>> a.fn() HELLO 
like image 31
pyInTheSky Avatar answered Sep 19 '22 18:09

pyInTheSky