删除项目中的 pyc 文件和 __pycache__ 文件夹
问题背景
项目中每个模块下都有为数不少的 Python 文件,当做了一些局部的修改,需重启服务验证想法时,不要使用旧版的系统缓存的 pyc 编译文件,而是修改后的 Python 文件。
解决办法
Linux 下的做法
通过管道,串联三个进程的处理输出
- 查找当前目录下的所有文件(夹)
- 使用 grep 用增强的正则表达式过滤
- 把过滤后的文件(夹)名传递给
rm -rf <file_or_folder>
find . | grep -E "(__pycache__|\.pyc|\.pyo)$" | xargs rm -rf
跨平台的做法
删除目录下所有 pyc 和 pyo 文件
python3 -Bc "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
删除目录下的所有 pycache 文件夹
python3 -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('__pycache__'): p.rmdir()"
删除整个目录树
python3 -Bc "import pathlib; import shutil; [shutil.rmtree(p) for p in pathlib.Path('.').rglob('__pycache__')]"
一劳永逸的方法
比上面更加彻底的方法是,直接修改默认的 pyc 文件的存放地址,从源头上去解决问题。
例如 Linux 系统下,在 ./profile
或者 ./bashrc
(取决于你的 shell),添加如下的环境变量,用来修改 Python 默认生成 pyc 文件的路径前缀。
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
总结
一开始,我们先是描述了 Linux 下的做法,接着介绍了使用 python 单行命令模式,来快速实现文件操作跨平台。
但是上面两种方法都是治标不治本,最后我们追溯到问题产生的源头处,直接永久重定向——使 Python 生成的 pyc 文件和我们的项目文件结构隔离开。
如此一来,项目中就不会有烦人的 pyc 文件,之后要部署可以通过该目录获取编译后的 pyc 文件。
Tips:
- 部署时不推荐直接用 pyc,很容易被反编译,后续再单独写一篇文章详细描述 Python 代码的保密。
Refers: