问题背景

项目中每个模块下都有为数不少的 Python 文件,当做了一些局部的修改,需重启服务验证想法时,不要使用旧版的系统缓存的 pyc 编译文件,而是修改后的 Python 文件。


解决办法

Linux 下的做法

通过管道,串联三个进程的处理输出

  1. 查找当前目录下的所有文件(夹)
  2. 使用 grep 用增强的正则表达式过滤
  3. 把过滤后的文件(夹)名传递给 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:

添加新评论