When I ran into this problem I simply added a post-checkout hook that deletes *.pyc files within the git root.
Same here. Is there a downside to this approach that I'm missing?
I can confirm, that one alredy bit me.
Removing existing pyc files when deploying sounds sensible, but I'm not sure if -B is really a good idea in this case, as each new worker process will have to parse the code again instead of just using the bytecode.
Re:Git-based fabric deploys are awesome
by dguaraglia on Friday May 11, 2012 @02:18PM
(#3960540)
I've experienced this before. Not that .pyc/.pyo files ever get into my repo, but sometimes Python will decide it doesn't need to recompile the files and I get old behavior from a piece of software I know I've just re-deployed.
My solution? Simple, I've got a a Fabric command that deletes all .pyc files in the repo after pulling.
def clean_pyc(): run('find . -name "*.pyc" -exec rm {} \;')
And that's that :)
Look at "git-clean." If I were using git-based deploys with Python code, I'd definitely run that after checkout.
export PYTHONDONTWRITEBYTECODE=1
may be more convenient than passing -B.As said in another reply, you don't want that on your production server, pyc files are a useful optimization. You should delete all pyc files when you change three code, though.
so add them to your gitignore.....
The problem being described is not .pyc files being pushed in the git repository. The problem is on the target server, the python runtime creates .pyc files for modules as they are imported/used, and if a deployment removes some .py files, you would be left with the .pyc file unless you take (simple) action to remove it during the deployment.
Maybe this behavior is meant to support binary-only distribution of Python applications, but there really should be an option to override this behavior.
Edit: Did a bit more research and found this:
(1) http://docs.python.org/release/1.5.1p1/tut/node43.html
Makes sense.(2) http://docs.python.org/using/cmdline.html#cmdoption-B
So you can mitigate that behavior by removing existing pyc files and using "-B".