停止 Python3 在系统目录中创建模块缓存
Stop Python3 creating module cache in system directory
在 Question 2918898 中,用户讨论了如何避免缓存,因为
模块在变化,解决方案侧重于重新加载。我的问题是
有点不同;我想首先避免缓存。
我的应用程序 运行 在 Un*x 上运行,并在 /usr/local
中运行。它导入一个
具有此应用程序和另一个应用程序使用的一些共享代码的模块。
普通用户一般是运行,Python不缓存
在那种情况下是模块,因为它没有写权限
系统目录。目前一切顺利。
不过,有时我需要以超级用户身份运行应用程序,然后
它确实有写权限并且它确实缓存它,留下难看的
系统目录中的足迹。不想。
所以...任何方式告诉CPython 3.2(或更高版本,我愿意升级)
不缓存模块?或者有其他办法解决问题?
更改目录权限不起作用; root 仍然可以写,
根是无所不能的。
我查看了 PEP 3147 但没有找到防止缓存的方法。
除了 import
,我不记得有任何导入代码的方法。我想我
可以读取一个简单的文本文件并 exec
它,但这似乎不够优雅
并且容易出错。
运行-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 "$@"
您可以使用 -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
在 Question 2918898 中,用户讨论了如何避免缓存,因为 模块在变化,解决方案侧重于重新加载。我的问题是 有点不同;我想首先避免缓存。
我的应用程序 运行 在 Un*x 上运行,并在 /usr/local
中运行。它导入一个
具有此应用程序和另一个应用程序使用的一些共享代码的模块。
普通用户一般是运行,Python不缓存
在那种情况下是模块,因为它没有写权限
系统目录。目前一切顺利。
不过,有时我需要以超级用户身份运行应用程序,然后 它确实有写权限并且它确实缓存它,留下难看的 系统目录中的足迹。不想。
所以...任何方式告诉CPython 3.2(或更高版本,我愿意升级) 不缓存模块?或者有其他办法解决问题? 更改目录权限不起作用; root 仍然可以写, 根是无所不能的。
我查看了 PEP 3147 但没有找到防止缓存的方法。
除了 import
,我不记得有任何导入代码的方法。我想我
可以读取一个简单的文本文件并 exec
它,但这似乎不够优雅
并且容易出错。
运行-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 "$@"
您可以使用 -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