在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 "$@"
答案 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