在问题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_bytecode
True设置为True将具有相同的效果。
当然,我想说这种情况下的好处(更快地免费加载应用程序)大大超过了您所说的不雅观-但是,如果您真的想禁用缓存,请按以下步骤操作。
资料来源:man python
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句