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
  • 1
    You might try over at Super User as well, thought I don't think this needs migrating. – brc Nov 1 '11 at 18:08
  • 2
    Especially with your edit that the problem is with sudo and not anything Python specific, this would probably get more useful answers on SU as mentioned, or on unix.stackexchange.com. – agf Nov 1 '11 at 18:19
  • @brc I realize that now. I've fixed it though -- see my answer bellow. – usr Nov 2 '11 at 1:14
up vote 12 down vote accepted

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:

  1. add export PYTHONPATH=/your/custom/path to ~/.bashrc or /etc/bash.bashrc
  2. add PYTHONPATH to Defaults env_keep += "ENV1 ENV2 ..." in sudoers file
  3. remove Defaults !env_reset from sudoers file if present
  • 2
    This solution also works on OS X. Just add a line Defaults env_keep += "PYTHONPATH" in /etc/sudoers on OS X. – user805627 Nov 22 '12 at 9:02

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.

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"

Alternatives to manipulating PYTHONPATH:

This should probably be posted somewhere else. But sudo will not process the environment file by default. If you want to invoke that the -i flag should help you out. It will simulate that users initial login.

You may have to play around with where you're putting your variables too. http://linux.die.net/man/8/sudo

  • sudo -i also didn't work for me. I think something somehow conflicted with !env_reset option in sudoers file (which I think is actually identical to sudo -i). See my answer for full explanation. – usr Nov 2 '11 at 1:12

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.