[英]PYTHONPATH not working for sudo on GNU/Linux (works for root)
EDIT: Works for root, sudo is the problem. 编辑:为root工作,sudo是问题。 Read below.
参见下文。
I have a directory with my own libraries, eg my Python libraries are located at /home/name/lib/py
. 我有一个拥有自己库的目录,例如我的Python库位于
/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
: 通过在
/etc/bash.bashrc
添加以下行,我已将此目录添加到Python的所有用户(包括root用户) 的PATH中:
export PYTHONPATH=$PYTHONPATH:/home/name/lib/py
It works for all users (including root). 它适用于所有用户(包括root用户)。 But it doesn't work for sudo.
但它对sudo不起作用。 Is there any way I can make sudo use
/etc/bash.bashrc
? 有什么方法可以让sudo使用
/etc/bash.bashrc
吗?
EDIT: More information: 编辑:更多信息:
I've added PYTHONPATH
to sudoers file like so: Defaults env_keep += "HOME PYTHONPATH"
. 我已将
PYTHONPATH
添加到sudoers文件中,如下所示: 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
The fix in my case was to remove Defaults !env_reset
from sudoers. 在我的情况下,修复是从sudoers中删除
Defaults !env_reset
。
But, I had to keep Defaults env_keep += "PYTHONPATH"
in sudoers. 但是,我必须在sudoers中保留
Defaults env_keep += "PYTHONPATH"
。
I've actually added Defaults env_reset
(which resets environment variables), but it still works because of env_keep
. 我实际上添加了
Defaults env_reset
(它重置了环境变量),但是由于env_keep
它仍然有效。
It seems that env_keep
and !env_reset
conflict with eachother, but that's just a guess. 似乎
env_keep
和!env_reset
相互冲突,但这只是猜测。
So, the whole process: 那么,整个过程:
export PYTHONPATH=/your/custom/path
to ~/.bashrc
or /etc/bash.bashrc
export PYTHONPATH=/your/custom/path
到~/.bashrc
或/etc/bash.bashrc
PYTHONPATH
to Defaults env_keep += "ENV1 ENV2 ..."
in sudoers file PYTHONPATH
添加到Defaults env_keep += "ENV1 ENV2 ..."
Defaults !env_reset
from sudoers file if present Defaults !env_reset
(如果存在) 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
. 对于
PATH
变量也是如此,即使您传递了保留环境标志-E
,它也不会进入超级用户环境。
I'm using this sudo command now without any other modifications: 我现在使用这个sudo命令而没有任何其他修改:
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. 因为这是另一种有效的方法(对我来说),我想我会在这里分享。
Another tip: 另一个提示:
sudo echo $PYTHONPATH:
/home/name/lib/py
It won't work. 它不会起作用。 Shell will interpret it like this:
Shell会像这样解释它:
1) expand $PYTHONPATH from env variable for example: /usr/lib/python 1)从env变量扩展$ PYTHONPATH,例如:/ usr / lib / python
2) execute "sudo echo /usr/lib/python" 2)执行“sudo echo / usr / lib / python”
Alternatives to manipulating PYTHONPATH
: 操纵
PYTHONPATH
替代方案:
Follow configuration helps me to run multiple python services in dedicated VENVs on one Centos host Follow配置帮助我在一个Centos主机上的专用VENV中运行多个python服务
/etc/sysconfig/my-app
/etc/sysconfig/my-app
EnvironmentFile
option in service config EnvironmentFile
选项 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
This should probably be posted somewhere else. 这可能应该发布在其他地方。 But sudo will not process the environment file by default.
但是默认情况下sudo不会处理环境文件。 If you want to invoke that the -i flag should help you out.
如果你想调用-i标志应该帮助你。 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
http://linux.die.net/man/8/sudo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.