在GNU/Linux上,sudo下PYTHONPATH无效(对root有效)
编辑:对于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
是互相冲突的,不过这只是我的猜测。
所以,整个过程是:
- 在
~/.bashrc
或/etc/bash.bashrc
文件中添加export PYTHONPATH=/your/custom/path
- 在 sudoers 文件中把
PYTHONPATH
加入到Defaults env_keep += "ENV1 ENV2 ..."
里 - 如果 sudoers 文件中有的话,删掉
Defaults !env_reset