Reputation: 159401
I have three modules as:
one.py
:
def abc():
print "Heeeeeeeeeeeiiiiiioooooooooo"
two.py
:
import one
def defg():
one.abc()
three.py
:
import os
from time import sleep
import two
two.defg()
sleep(20)
directory = os.listdir('.')
for filename in directory:
if filename[-3:] == 'pyc':
print '- ' + filename
os.remove(filename)
I have three doubts.
When I run three.py
for the first time one.pyc
and two.pyc
will be created. I can see it since I gave 20 sec delay. After executing the statement os.remove(filename)
, they get removed. Until here its fine.
Again without closing the IDLE as well as the script, I ran three.py
. This time no .pyc
file was created. Why is this so?
If I close IDLE as well as the script, .pyc
will be created as before.
Why the compiled code is not getting created again and again?
Also, if I make a change in one.py
it will not be shown if I run without closing the shells. I need a solution for this also.
Third doubt is if the compiled code is getting deleted first time itself, then how the second run gives the same result without .pyc
?
Upvotes: 1
Views: 2480
Reputation: 512
The .pyc
is not getting created again because there is a reference to your imported module in code. When it is re-run, this reference is used.
This is why the .pyc
is not generated again, and also why the extra changes you make are not getting run.
You can either remove all references and call a garbage collect, or use the built in reload()
function on the modules. e.g.:
reload(three)
Upvotes: 8
Reputation: 4160
Edit ~/.bashrc and add this shell function to it
$ cd ; pyclean
pyclean () {
find . -type f -name "*.py[co]" -delete
find . -type d -name "__pycache__" -delete
}
Upvotes: 1
Reputation: 24307
I think that IDLE is caching the bytecode within its own Python process, so it doesn't need to regenerate the it each time the file is run.
Upvotes: 1