在GNU/Linux上,sudo下PYTHONPATH无效(对root有效)

26 投票
6 回答
28061 浏览
提问于 2025-04-17 05:25

编辑:对于root用户是可以的,但使用sudo时就有问题。请看下面的内容。

我有一个存放自己库的文件夹,比如我的Python库放在 /home/name/lib/py 这个位置。
我通过在 /etc/bash.bashrc 文件中添加以下一行,把这个文件夹添加到了Python的路径,这样所有用户(包括root)都能使用:

export PYTHONPATH=$PYTHONPATH:/home/name/lib/py

这对所有用户(包括root)都有效。但使用sudo时就不行。有办法让sudo也能使用 /etc/bash.bashrc 吗?

编辑:更多信息:

我在sudoers文件中添加了 PYTHONPATH,像这样:Defaults env_keep += "HOME PYTHONPATH"。但还是不行。

env | grep PYTHON:
    PYTHONDONTWRITEBYTECODE=1
    PYTHONPATH=/home/name/lib/py

sudo env | grep PYTHON:
    PYTHONDONTWRITEBYTECODE=1

sudo echo $PYTHONPATH:
    /home/name/lib/py

6 个回答

2

关于如何处理 PYTHONPATH 的替代方法:

  • virtualenv:这是一个工具,可以让你创建一个独立的Python环境,避免和系统的Python库发生冲突。
  • distutils:这是Python自带的一个模块,用于帮助你打包和分发Python项目,让安装变得更简单。
25

对于PATH这个变量也是一样的,它在超级用户环境中不会被带过去,即使你使用了保留环境的标志-E

我现在使用这个sudo命令,没有做其他修改:

sudo -HE env PATH=$PATH PYTHONPATH=$PYTHONPATH ./bin/myscript

因为这是一个对我来说有效的替代方法,所以我想在这里分享一下。

22

在我的情况下,解决办法是把 Defaults !env_reset 从 sudoers 文件中删掉。

不过,我需要保留 Defaults env_keep += "PYTHONPATH" 在 sudoers 文件里。
我实际上添加了 Defaults env_reset(这个设置会重置环境变量),但因为有 env_keep 的存在,它还是能正常工作。

看起来 env_keep!env_reset 是互相冲突的,不过这只是我的猜测。


所以,整个过程是:

  1. ~/.bashrc/etc/bash.bashrc 文件中添加 export PYTHONPATH=/your/custom/path
  2. 在 sudoers 文件中把 PYTHONPATH 加入到 Defaults env_keep += "ENV1 ENV2 ..."
  3. 如果 sudoers 文件中有的话,删掉 Defaults !env_reset

撰写回答