I recently acquired a new development laptop and moved a number of local Git repositories from my old machine to my new machine. In doing so I also changed the folder structure, and when trying to run some code I was presented with this Python error:
import file mismatch:
imported module 'tests.desktop.consumer_pages.test_details_page' has this __file__ attribute:
/Users/bsilverberg/gitRepos/marketplace-tests/tests/desktop/consumer_pages/test_details_page.py
which is not the same as the test file we want to collect:
/Users/bsilverberg/Documents/gitRepos/marketplace-tests/tests/desktop/consumer_pages/test_details_page.py
HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules
This was a symptom of the fact that Python creates .pyc
files on my machine when it compiles code. This can result in other nastiness too, as well as cluttering up your machine, so I wanted to both delete all of these files and also prevent Python from doing it in the future. This post contains info on how to do both.
Deleting all .pyc files from a folder
You can use the find
command (on OS X and Linux) to locate all of the .pyc
files, and then use its delete
option to delete them.
The command to find all .pyc
files in all folders, starting with the current one is:
find . -name '*.pyc'
If you want to delete all the files found, just add the -delete
option:
find . -name '*.pyc' -delete
Obviously, this can be used for any file type that you wish to eradicate, not just .pyc
files.
Preventing Python from writing .pyc files
I don’t like having all of those extra files cluttering my machine, and, in addition to the error I mentioned above, I have from time to time seen other errors related to out of date .pyc
files.
Another issue that .pyc
files can cause is that they can be orphaned, for example if you remove a .py
file from your project, but the .pyc
file remains (which can happen as one often adds *.pyc
to .gitignore
). Python can then still pick up the module from the .pyc
file via an import
which can lead to difficult to diagnose bugs.
For these reasons I want to prevent Python from ever writing those files again. To do this all you have to do is set the environment variable PYTHONDONTWRITEBYTECODE
to 1
. You can ensure that that variable is set for any bash session that you start by adding the following to your .bash_profile
or .bashrc
:
export PYTHONDONTWRITEBYTECODE=1