python解释器的-s
参数阻止sys.path
拥有用户目录:
-s Don't add user site directory to sys.path.
设置PYTHONNOUSERSITE
环境变量是实现相同结果的另一种方法。请注意,在PYTHONPATH
中设置用户站点目录,然后使用-s
调用脚本“覆盖”“用户站点”删除。
如果我不控制如何调用python脚本,是否有一种简单的方法来删除python脚本或模块中的用户目录?我可以迭代sys.path并删除任何以os.environ["HOME"]
开头的条目。这是正确的方法吗?我会错过任何或者可能删除我不应该删除的目录(例如,如果有人在他们的主目录中安装了python,甚至可能在〜/ .local / ......某处?)? HOME
env var是否正确寻找?我没有看到任何sys.path.usersite
可用于播种路径清理工作(但请参阅 Update 1 )。
有没有办法擦除用户站点目录比在所有python脚本的顶部添加迭代blob更容易?
像这样的shebang线实现了这个目标:#!/usr/local/bin/python -s
但是如果一个人不想硬编码python解释器的路径,可以使用这个习惯用法:
#!/usr/bin/env python
在上面添加参数(如-s
)不起作用,因为在大多数unix系统上解释shebang行的方式(参见 Update 2 ):
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尝试在这里的文档正文中进行扩展和替换。
作为旁注:如果我想要python -S
功能(没有等效的环境变量旋钮)或其他python选项参数,这也有帮助。
(2)如何模仿-s
{<1>}的(即删除用户网站目录,即使它们处于PYTHONPATH状态)?
我想我所希望的是一个指向用户站点目录的sys变量。但我找不到一个。
更新1 :感谢Blender的评论 - 该变量位于网站模块中:PYTHONPATH
。因此,您可以遍历sys.path,查找以该目录为根的条目(可以在USER_SITE中包含.egg文件并模拟-s,您也需要删除它们。)
更新2 :使用site.USER_SITE
是另一种解决方案。它允许您将参数传递给由shebang行中env -S
生成的命令。 FreeBSD已经-S多年(从6.0开始)。使用coreutils的Linux系统(大多数)使用coreutils 8.30 1。 Linux发行版需要一段时间才能获得coreutils的版本,因此依赖于它的可移植脚本可能还不够谨慎(现在= 2019年)。
env(1)
P.S。另请参阅this较旧的类似帖子。