从shebang中没有“-s”的sys.path中删除用户站点目录

时间:2018-04-24 19:18:20

标签: python

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较旧的类似帖子。

0 个答案:

没有答案