【问题标题】:Stop Python3 creating module cache in system directory停止 Python3 在系统目录中创建模块缓存
【发布时间】:2015-11-29 04:05:31
【问题描述】:

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

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

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

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

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

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

run-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 "$@"

【问题讨论】:

标签: unix python-3.x sudo


【解决方案1】:

您可以使用-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

【讨论】:

  • 啊,我希望你早一点发布sys.dont_write_bytecode。会让我免于为如何使sudo 接受环境变量而苦苦挣扎。现在可以了。将发布我在问题中所做的详细信息以供将来参考。谢谢!
猜你喜欢
  • 2020-05-12
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多