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

时间:2015-09-03 10:52:51

标签: unix python-3.x sudo

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

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

但是,我有时需要以超级用户身份运行应用程序,然后 它确实有写权限,它确实缓存它,留下不雅观 系统目录中的脚印。不想要。

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

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

我不记得导入除import以外的代码的任何方法。我想我 可以阅读一个简单的文本文件和exec它,但这看起来不够优雅 并容易出错。

通过调用带有sudo的程序来完成run-as-root 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 "$@"

1 个答案:

答案 0 :(得分:2)

您可以使用-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将具有相同的效果。

当然,我要说在这种情况下的优势(免费的应用程序加载时间更快)远远超过你所说的不明智 - 但如果你真的想禁用缓存,那么就是这样。< / p>

来源:man python