停止 Python3 在系统目录中创建模块缓存

Stop Python3 creating module cache in system directory

Question 2918898 中,用户讨论了如何避免缓存,因为 模块在变化,解决方案侧重于重新加载。我的问题是 有点不同;我想首先避免缓存。

我的应用程序 运行 在 Un*x 上运行,并在 /usr/local 中运行。它导入一个 具有此应用程序和另一个应用程序使用的一些共享代码的模块。 普通用户一般是运行,Python不缓存 在那种情况下是模块,因为它没有写权限 系统目录。目前一切顺利。

不过,有时我需要以超级用户身份运行应用程序,然后 它确实有写权限并且它确实缓存它,留下难看的 系统目录中的足迹。不想。

所以...任何方式告诉CPython 3.2(或更高版本,我愿意升级) 不缓存模块?或者有其他办法解决问题? 更改目录权限不起作用; root 仍然可以写, 根是无所不能的。

我查看了 PEP 3147 但没有找到防止缓存的方法。

除了 import,我不记得有任何导入代码的方法。我想我 可以读取一个简单的文本文件并 exec 它,但这似乎不够优雅 并且容易出错。

运行-as-root 是通过调用带有 sudo 的程序来完成的 shell 脚本,我可以让 shell 脚本在 运行,但我希望有更优雅的东西,不会改变 目录的最后修改时间戳。


已实施解决方案,基于 Wander Nauta 的回答:

由于我 运行 将可执行文件作为普通文件名,而不是 python executablename,所以我使用了环境变量。首先, sudoers 需要更改文件以允许设置环境 变量:

tom     ALL=(ALL) SETENV: NOPASSWD: /usr/local/bkup/bin/mkbkup

那么,调用需要包含变量:

/usr/bin/sudo PYTHONDONTWRITEBYTECODE=true /usr/local/bkup/bin/mkbkup "$@"

您可以使用 -B 命令行标志启动 python 以防止它写入缓存的字节码。

$ ls
bar.py  foo.py
$ cat foo.py 
import bar
$ python -B foo.py; ls
bar.py  foo.py
$ python foo.py; ls
bar.py  foo.py  __pycache__

PYTHONDONTWRITEBYTECODE 环境变量设置为非空字符串或将 sys.dont_write_bytecode 设置为 True 将具有相同的效果。

当然,我想说的是这种情况下的好处(应用程序的加载时间更快,免费)远远超过了你所说的不雅观 - 但如果你真的想禁用缓存,请按以下步骤操作.

来源:man python