PYTHONPATH在GNU / Linux上不适用于sudo(适用于root)

时间:2011-11-01 16:23:55

标签: python linux macos bash pythonpath

编辑:适用于root,sudo是问题所在。请阅读以下内容。

我有一个带有我自己的库的目录,例如我的Python库位于/home/name/lib/py 我已将此目录添加到所有用户(包括root用户)的 Python的PATH ,方法是将以下行添加到/etc/bash.bashrc

export PYTHONPATH=$PYTHONPATH:/home/name/lib/py

适用于所有用户(包括root用户)。但它对sudo不起作用。有什么办法可以让sudo使用/etc/bash.bashrc吗?

编辑:更多信息:

我已将PYTHONPATH添加到sudoers文件中,如下所示:Defaults env_keep += "HOME PYTHONPATH"。它不会起作用。

env | grep PYTHON:
    PYTHONDONTWRITEBYTECODE=1
    PYTHONPATH=/home/name/lib/py

sudo env | grep PYTHON:
    PYTHONDONTWRITEBYTECODE=1

sudo echo $PYTHONPATH:
    /home/name/lib/py

6 个答案:

答案 0 :(得分:12)

我的案例中的解决方法是从sudoers中移除Defaults !env_reset

但是,我必须将Defaults env_keep += "PYTHONPATH"保留在sudoers中 我实际上已经添加了Defaults env_reset(它会重置环境变量),但由于env_keep它仍然有效。

似乎env_keep!env_reset互相冲突,但这只是猜测。


所以,整个过程:

  1. export PYTHONPATH=/your/custom/path添加到~/.bashrc/etc/bash.bashrc
  2. PYTHONPATH添加到sudoers文件中的Defaults env_keep += "ENV1 ENV2 ..."
  3. 从sudoers文件中移除Defaults !env_reset(如果有)

答案 1 :(得分:11)

对于PATH变量也是如此,即使您传递了保留环境标志-E,它也不会进入超级用户环境。

我现在正在使用这个sudo命令而没有任何其他修改:

sudo -HE env PATH=$PATH PYTHONPATH=$PYTHONPATH ./bin/myscript

因为这是另一种有效的方法(对我来说),我想我会在这里分享。

答案 2 :(得分:2)

另一个提示:

sudo echo $PYTHONPATH:
    /home/name/lib/py

它无效。 Shell会像这样解释它:

1)从env变量扩展$ PYTHONPATH,例如:/ usr / lib / python

2)执行“sudo echo / usr / lib / python”

答案 3 :(得分:1)

操纵PYTHONPATH的替代方法:

答案 4 :(得分:0)

这可能应该发布在其他地方。但是默认情况下sudo不会处理环境文件。如果你想调用-i标志应该帮助你。它将模拟用户初次登录。

你可能还要玩弄变量的位置。 http://linux.die.net/man/8/sudo

答案 5 :(得分:0)

以下配置可帮助我在专用VENV中运行多个python服务 在一台Centos主机上

  1. 将环境变量导出到单独的文件,例如/etc/sysconfig/my-app
  2. 在服务配置中设置EnvironmentFile选项

请参见下面的代码:

-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