简体   繁体   English

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

[英]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: 那么,整个过程:

  1. add export PYTHONPATH=/your/custom/path to ~/.bashrc or /etc/bash.bashrc export PYTHONPATH=/your/custom/path~/.bashrc/etc/bash.bashrc
  2. add PYTHONPATH to Defaults env_keep += "ENV1 ENV2 ..." in sudoers file 在sudoers文件中将PYTHONPATH添加到Defaults env_keep += "ENV1 ENV2 ..."
  3. remove Defaults !env_reset from sudoers file if present 从sudoers文件中删除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服务

  1. Export env variables to separate file, for example /etc/sysconfig/my-app 将env变量导出到单独的文件,例如/etc/sysconfig/my-app
  2. Set EnvironmentFile option in service config 在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM