从中删除用户站点目录系统路径舍邦没有“s”

2024-04-25 04:27:51 发布

您现在位置:Python中文网/ 问答频道 /正文

python解释器的-s参数阻止sys.path拥有用户目录:

-s Don't add user site directory to sys.path.

设置PYTHONNOUSERSITE环境变量是实现相同结果的另一种方法。请注意,在PYTHONPATH中设置一个用户站点目录,然后用-s调用脚本将覆盖“用户站点”删除。在

如果我不能控制如何调用python脚本,有没有一种简单的方法可以删除python脚本或模块中的用户目录?我可以重复一遍系统路径并删除以os.environ["HOME"]开头的所有条目。是这样吗?我是否会错过或者删除不该删除的目录(例如,如果有人在他们的主目录中安装了python,甚至可能安装在~/.local/…)中呢。。。什么地方?HOMEenv var是正确的选择吗?我看不到任何sys.path.usersite可以用来为路径清理工作设定种子(但是请参见update1)。在

有没有一种方法比在所有python脚本的顶部添加迭代blob更容易擦洗用户站点目录?在

像这样的shebang线实现了这一点:

#!/usr/local/bin/python -s

但是如果不想硬编码到python解释器的路径,可以使用以下习惯用法:

^{pr2}$

但是,在上面添加参数(比如-s)是行不通的,因为大多数unix系统上解释shebang行的方式(请参见update2):

env: python -s: No such file or directory

这个问题有两个微妙的变化:

(1)当您的脚本不是用-s调用时,如何模拟-s所做的事情(包括允许用户站点目录位于PYTHONPATH中)时?也许是最好的方法(?)对于这种变化:

#!/bin/sh
exec python -s << eof
... python code...
eof

编辑如果要传递参数,上述操作将失败。这可能会更好:

#!/bin/sh
exec python -s - "$@" << "eof"
... python code...
eof

注意引用的“eof”以避免shell尝试在here文档主体中执行扩展和子语句。在

附带说明:如果我需要python -S功能(没有等效的环境变量knobl)或其他python选项参数,这也会有帮助。在

(2)如何模拟-s而不考虑PYTHONPATH(即删除用户站点目录,即使它们在PYTHONPATH中)?在

我想我希望的是指向用户site dir的sys变量。但我找不到。在

更新1:感谢Blender的注释-变量位于站点模块中:site.USER_SITE。所以你可以重复系统路径正在查找根目录中的条目(用户站点中可能有.egg文件,要模拟-s,您还需要删除这些文件)。在

更新2:使用env -S是另一种解决方案。它允许您将参数传递给env(1)在shebang行中生成的命令。FreeBSD已经有-S多年了(从6.0开始)。使用coreutils的Linux系统(大多数)从coreutils 8.301开始就有了。Linux发行版需要一段时间才能获得coreutils版本,因此依赖它进行可移植脚本编写可能还不够谨慎(现在是2019年)。在

#!/usr/bin/env -S python -s

另请参见this旧的类似线程。在


Tags: path方法用户路径目录env脚本参数