julvo / reloading Goto Github PK
View Code? Open in Web Editor NEWChange Python code while it's running without losing state
License: MIT License
Change Python code while it's running without losing state
License: MIT License
I just read about reloading
on Medium, installed the latest version with pip, but failed to get even the simple starting example to run using VS-Code as my IDE:
>>> from reloading import reloading
>>> for i in reloading(range(10)):
... # this code will be reloaded before each iteration
... print(i)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\peter\AppData\Roaming\Python\Python311\site-packages\reloading\reloading.py", line 45, in reloading
return _reloading_loop(fn_or_seq, every=every)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\peter\AppData\Roaming\Python\Python311\site-packages\reloading\reloading.py", line 168, in _reloading_loop
compiled_body, itervars, loop_id = get_loop_code(loop_frame_info, loop_id=loop_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\peter\AppData\Roaming\Python\Python311\site-packages\reloading\reloading.py", line 138, in get_loop_code
tree = parse_file_until_successful(fpath)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\peter\AppData\Roaming\Python\Python311\site-packages\reloading\reloading.py", line 88, in parse_file_until_successful
source = load_file(path)
^^^^^^^^^^^^^^^
File "C:\Users\peter\AppData\Roaming\Python\Python311\site-packages\reloading\reloading.py", line 82, in load_file
with open(path, "r") as f:
^^^^^^^^^^^^^^^
OSError: [Errno 22] Invalid argument: '<stdin>'
Once step over reloading part, one step will exec to end.
Hi julvo,
Cool project! There's a bug where local variables defined in reloading/reloading.py
overwrite local variables in the user's code.
For example, this snippet prints the name of the file it is defined in, instead of the string test
, because of this variable definition in reloading.py.
from reloading import reloading
fpath = "test"
for _ in reloading(range(2)):
print(fpath)
I have a patch which I believe fixes the issue. Do you want me to submit a pull request so you can take a look?
After we reload the updated source file, we need to find the loop bodies for all reloading loops. Right now, we find the loops by looking for reloading
and the line number. This breaks if the line number changes, e.g. by inserting or deleting lines before the reloading loop
Thanks for building such awesome library but I wanted to see if I can use it within trame in a more streamline fashion.
Right now it is working if I create an indirection like in that working example but ideally I would like to be able to stack decorators like in the snippet below.
@ctrl.set("update_message")
@reloading
def update_message():
# ...
But when I do, I get the following exception
File "reloading.py", line 247, in wrapped
state["func"] = get_reloaded_function(caller_globals, caller_locals, fpath, fn) or state["func"]
File "reloading.py", line 222, in get_reloaded_function
code = get_function_def_code(fpath, fn)
File "reloading.py", line 214, in get_function_def_code
found = isolate_function_def(fn.__name__, tree)
File "reloading.py", line 201, in isolate_function_def
and "reloading" in [
File "reloading.py", line 202, in <listcomp>
get_decorator_name(dec)
File "reloading.py", line 184, in get_decorator_name
return dec_node.func.id
AttributeError: 'Attribute' object has no attribute 'id'
It is possible that the issue is on my side (@ctrl, @state) but any help will be greatly appreciated.
I'm trying to use the @reloading
decorator, and am receiving the following error:
.local/lib/python3.8/site-packages/reloading/reloading.py", line 182, in wrapped
inner = caller_locals[fn.__name__].__dict__['__inner__']
KeyError: '__inner__'
I can get the loop version working but not the decorator version. My code is fairly simple and all contained in a single file.
Am I doing something wrong? I am using Python 3.8.2
Suggestion: add option to reload every n iterations, possibly as a keyword argument to the reloading() function or decorator.
This could drastically improve performance for loops that run very quickly.
currently, the performance is rather bad, tested with this code
import time
times = []
before = time.perf_counter_ns()
for _ in range(1000):
now = time.perf_counter_ns()
times.append(now - before)
before = now
print(f"average ns per loop: {sum(times)/len(times)}")
without reloading: average ns per loop: 165.6
with reloading: average ns per loop: 646430.0
Additional ideas:
Usage reads:
import reloading from reloading
Should read:
from reloading import reloading
"File "/usr/local/lib/python3.7/site-packages/reloading/reloading.py", line 16, in find_loop
if child.iter.func.id == 'reloading':"
when using in python version==3.7,there goes wrong?
File "E:\newEnvironment\lib\site-packages\reloading\reloading.py", line 82, line83, in load_file
with open(path, "r") as f:
src = f.read()
maybe could add encoding = "utf8"? Thanks
if (
isinstance(node, ast.For)
and isinstance(node.iter, ast.Call
and hasattr(node.iter.func,'id') <--- add this line
and node.iter.func.id == "reloading"
#11 added new kwargs that need to be documented
Example:
@reloading
class myClass:
def myFunction(self, a):
print(a)
def forLoopInFunction(self):
for i in reloading(range(3)):
if i == 1: return 'value'
stat the file, or compare to previous hash, to only reload the code when changes occured.
Can you please upload your package to Conda-forge, it would be really useful it it were.
Thanks
This block
s, end = locate_loop_body(tree, loop)
lines = src.split('\n')
if end < 0:
end = len(lines)
body_lines = lines[s-1:end-1]
Examines the file and returns the range(s-1:end-) for looping.
If the end of a file is the same as the end of a loop, this results in s-1 = end-1
.
This then causes body_lines = []
which causes an IndexError further down.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.