PYTHONPATH not working for sudo on GNU/Linux (works for root)

后端 未结 6 2119
梦毁少年i
梦毁少年i 2020-12-01 18:04

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

相关标签:
6条回答
  • 2020-12-01 18:38

    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 讨论(0)
  • 2020-12-01 18:41

    Alternatives to manipulating PYTHONPATH:

    • virtualenv
    • distutils
    0 讨论(0)
  • 2020-12-01 18:47

    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.

    0 讨论(0)
  • 2020-12-01 18:47

    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 讨论(0)
  • 2020-12-01 18:51

    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
    
    0 讨论(0)
  • 2020-12-01 18:52

    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
    0 讨论(0)
提交回复
热议问题