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

汤姆·齐奇(Tom Zych)

问题2918898中,用户讨论了如何避免由于模块的更改而导致的缓存,而解决方案的重点是重新加载。我的问题有所不同。我想首先避免缓存。

我的应用程序在Un * x上运行,并位于中/usr/local它导入一个模块,该模块包含此应用程序使用的一些共享代码和另一个。它通常以普通用户身份运行,在这种情况下,Python不会缓存模块,因为它对该系统目录没有写权限。到目前为止一切都很好。

但是,有时我需要以超级用户身份运行该应用程序,然后它确实具有写许可权并进行缓存,从而在系统目录中留下难看的痕迹。不要。

所以...有什么办法告诉CPython 3.2(或更高版本,我愿意升级)不缓存模块?还是其他解决问题的方法?更改目录权限无效。root仍然可以写,root是无所不能的。

我浏览了PEP 3147,但没有找到防止缓存的方法。

除了之外,我没有其他任何导入代码的方法import我想我可以阅读一个简单的文本文件exec,但是它看起来不雅且容易出错。

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_bytecodeTrue设置为True将具有相同的效果。

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

资料来源:man python

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章