我有一个带有我自己的库的目录,例如我的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
答案 0 :(得分:12)
我的案例中的解决方法是从sudoers中移除Defaults !env_reset
。
但是,我必须将Defaults env_keep += "PYTHONPATH"
保留在sudoers中
我实际上已经添加了Defaults env_reset
(它会重置环境变量),但由于env_keep
它仍然有效。
似乎env_keep
和!env_reset
互相冲突,但这只是猜测。
所以,整个过程:
export PYTHONPATH=/your/custom/path
添加到~/.bashrc
或/etc/bash.bashrc
PYTHONPATH
添加到sudoers文件中的Defaults env_keep += "ENV1 ENV2 ..."
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主机上
/etc/sysconfig/my-app
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