22
votes

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
6
You might try over at Super User as well, thought I don't think this needs migrating. - brc
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
@brc I realize that now. I've fixed it though -- see my answer bellow. - usr

6 Answers

20
votes

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
19
votes

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.

2
votes

Alternatives to manipulating PYTHONPATH:

2
votes

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"

0
votes

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

0
votes

Follow configuration helps me to run multiple python services in dedicated VENVs on one Centos host

  1. Export env variables to separate file, for example /etc/sysconfig/my-app
  2. Set EnvironmentFile option in service config

see code below:

-bash-4.2$ sudo vi /etc/sysconfig/my-app

PATH=/usr/local/my-app/env/bin:$PATH
LD_LIBRARY_PATH=/usr/local/my-app/env/lib:$LD_LIBRARY_PATH



-bash-4.2$ sudo vi /etc/systemd/system/my-app.service

[Unit]
Description=my-app daemon
After=network.target


[Service]
EnvironmentFile=/etc/sysconfig/my_app
User=app_user
Group=app_user
Type=simple
ExecStart=/usr/local/my-app/env/bin/python /usr/local/my-app/main.py
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target