Ubuntu – “sudo pip” differs from normal “pip”

environment-variablespippythonsudo

When I execute

which pip3

it points to

/usr/.../anaconda3/bin/pip3

However, when I run

sudo which pip3

the result is

/usr/bin/pip3

Where does this problem comes from and how do I achieve that sudo pip also points to /usr/.../anaconda3/bin/pip3?

Best Answer

  • sudo sanitizes the environment before running any command. In doing so, if the value of the directive secure_path is set, it will be used as the PATH for the sudo commands, not the current PATH.

    In my system:

    % sudo grep -E 'secure_path' /etc/sudoers
    Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    

    So i have:

    % echo $PATH
    /home/foobar/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
    
    % sudo bash -c 'echo $PATH' 
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    

    What you can do to keep your current path or add /usr/.../anaconda3/bin to sudo's PATH:

    • Pass PATH in the environment of the which command:

      sudo PATH="$PATH" which pip3
      

      Any desired PATH can be set too.

    • Keep the current environment while running sudo by:

      sudo -E which pip3
      
    • Disable the secure_path value by putting a # in front or remove the line to keep the current PATH:

      # Defaults        secure_path="....."   
      

      Instead, you can also modify the secure_path to just add /usr/.../anaconda3/bin to it, at the beginning.

    • Add PATH to the env_keep directive to keep the PATH in the sudo provided environment:

      Defaults        env_keep += "PATH"