usr
usr

Reputation: 705

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

Upvotes: 27

Views: 28928

Answers (6)

Ilya Davydov
Ilya Davydov

Reputation: 531

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

Upvotes: 0

kvz
kvz

Reputation: 5885

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.

Upvotes: 24

Szczad
Szczad

Reputation: 826

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"

Upvotes: 2

Brian Cain
Brian Cain

Reputation: 14619

Alternatives to manipulating PYTHONPATH:

Upvotes: 2

usr
usr

Reputation: 705

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

Upvotes: 22

Jeffery Smith
Jeffery Smith

Reputation: 209

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

Upvotes: 0

Related Questions