PYTHONPATH not working for sudo on GNU/Linux (works for root)
EDIT: Works for root, sudo is the problem. Read below.
I have a directory with my own libraries, e.g. my Python libraries are located at /home/name/lib/py
.
I've added this directory to Python's PATH for all users (including root) by adding the following line to /etc/bash.bashrc
:
export PYTHONPATH=$PYTHONPATH:/home/name/lib/py
It works for all users (including root). But it doesn't work for sudo. Is there any way I can make sudo use /etc/bash.bashrc
?
EDIT: More information:
I've added PYTHONPATH
to sudoers file like so: Defaults env_keep += "HOME PYTHONPATH"
. It sitll doesn't work.
env | grep PYTHON:
PYTHONDONTWRITEBYTECODE=1
PYTHONPATH=/home/name/lib/py
sudo env | grep PYTHON:
PYTHONDONTWRITEBYTECODE=1
sudo echo $PYTHONPATH:
/home/name/lib/py
Solution 1:
The fix in my case was to remove Defaults !env_reset
from sudoers.
But, I had to keep Defaults env_keep += "PYTHONPATH"
in sudoers.
I've actually added Defaults env_reset
(which resets environment variables), but it still works because of env_keep
.
It seems that env_keep
and !env_reset
conflict with eachother, but that's just a guess.
So, the whole process:
- add
export PYTHONPATH=/your/custom/path
to~/.bashrc
or/etc/bash.bashrc
- add
PYTHONPATH
toDefaults env_keep += "ENV1 ENV2 ..."
in sudoers file - remove
Defaults !env_reset
from sudoers file if present
Solution 2:
The same is true for the PATH
variable, it's also not carried into the super user environment, even though you're passing the preserve environment flag -E
.
I'm using this sudo command now without any other modifications:
sudo -HE env PATH=$PATH PYTHONPATH=$PYTHONPATH ./bin/myscript
Since it's an alternative approach that works (for me) I thought I'd share here.
Solution 3:
Alternatives to manipulating PYTHONPATH
:
- virtualenv
- distutils
Solution 4:
Another tip:
sudo echo $PYTHONPATH:
/home/name/lib/py
It won't work. Shell will interpret it like this:
1) expand $PYTHONPATH from env variable for example: /usr/lib/python
2) execute "sudo echo /usr/lib/python"