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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7969540/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 06:56:46  来源:igfitidea点击:

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

pythonlinuxmacosbashpythonpath

提问by usr

EDIT: Works for root, sudo is the problem. Read below.

编辑:适用于 root,sudo 是问题所在。参见下文。

I have a directory with my own libraries, e.g. my Python libraries are located at /home/name/lib/py.
I've added this directory to Python's PATHfor all users (including root) by adding the following line to /etc/bash.bashrc:

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

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

It works for all users (including root). But it doesn't work for sudo. Is there any way I can make sudo use /etc/bash.bashrc?

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

EDIT: More information:

编辑:更多信息:

I've added PYTHONPATHto sudoers file like so: Defaults env_keep += "HOME PYTHONPATH". It sitll doesn't work.

我已经添加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

采纳答案by usr

The fix in my case was to remove Defaults !env_resetfrom sudoers.

在我的情况下,解决方法是Defaults !env_reset从 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.

但是,我不得不保持Defaults env_keep += "PYTHONPATH"在 sudoers 中。
我实际上已经添加了Defaults env_reset(它重置了环境变量),但它仍然有效,因为env_keep.

It seems that env_keepand !env_resetconflict with eachother, but that's just a guess.

这似乎env_keep!env_reset彼此冲突,但这只是一个猜测。



So, the whole process:

所以,整个过程:

  1. add export PYTHONPATH=/your/custom/pathto ~/.bashrcor /etc/bash.bashrc
  2. add PYTHONPATHto Defaults env_keep += "ENV1 ENV2 ..."in sudoers file
  3. remove Defaults !env_resetfrom sudoers file if present
  1. 添加export PYTHONPATH=/your/custom/path~/.bashrc/etc/bash.bashrc
  2. 添加PYTHONPATHDefaults env_keep += "ENV1 ENV2 ..."sudoers 文件中
  3. Defaults !env_reset如果存在,从 sudoers 文件中删除

回答by Jeffery Smith

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.

这可能应该张贴在其他地方。但是 sudo 默认不会处理环境文件。如果您想调用 -i 标志应该可以帮助您。它将模拟用户初始登录。

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

回答by Brian Cain

Alternatives to manipulating PYTHONPATH:

操作的替代方法PYTHONPATH

回答by Szczad

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”

回答by kvz

The same is true for the PATHvariable, 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.

由于这是一种(对我而言)有效的替代方法,我想我会在这里分享。

回答by Ilya Davydov

Follow configuration helps me to run multiple python services in dedicated VENVs on one Centos host

按照配置帮助我在一台 Centos 主机上的专用 VENV 中运行多个 python 服务

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