运行 python 应用程序时仅使用 sudo 导入错误?

ImportError only with sudo when running python app?

我正在尝试使用 sudo 命令 运行 一些 python 代码,但每次我这样做时,它都会给我一个导入错误。但是,如果我在终端中 运行,比如说 import numpy,它不会给我任何错误。此外,如果我使用多个导入构建代码,然后 运行 它没有 sudo 命令,它不会给我任何错误并且代码 运行s 完美无缺。我已经将 Defaults env_keep += "PYTHONPATH" 添加到 sudoers 文件夹中,所以这不是问题所在。我安装了 Anaconda3,所以这可能是有用的信息?

我是 运行宁 GNOME Ubuntu 16.04.1 LTS。和内核版本 4.4.0-59-generic.

对不起,我对此很陌生,但我正在学习。

我 运行 which python 然后我 运行 sudo which python 他们给了我不同的目录。

sudo which python给了我usr/bin/pythonwhich python给了我home/user/anaconda3/bin/python

我试过 运行ning sudo ./anaconda3/envs/ml/bin/python doc.py 但现在它说找不到文件。

我 运行 将它与 sudo 结合使用,因为我需要 docker 的许可才能工作。

编辑:尝试使用 sudo -E 而不是 sudo 会产生相同的错误。

您遇到的问题是 sudo 在查看可执行文件时 遵循通常的 PATH 顺序:它搜索系统目录 第一。这是写在man sudo:

SECURITY NOTES sudo tries to be safe when executing external commands.

To prevent command spoofing, sudo checks "." and "" (both denoting current directory) last when searching for a command in the user's PATH (if one or both are in the PATH). Note, however, that the actual PATH environment variable is not modified and is passed unchanged to the program that sudo executes.

所以,要解决这个问题,你必须确保你给 sudo 的命令不能匹配系统可执行文件,即指定绝对路径:

sudo /home/user/anaconda3/bin/python

一个应该起作用的通用命令是:

sudo "$(which python)"

这是因为 which python sudo 之前执行,其输出作为参数传递给 sudo。但是 sudo 默认情况下不执行任何 "shell-like" 设置,并且可能会限制环境,因此您可以考虑使用 -E-i 标志使 sudo 通过环境不受影响并进行正确的 shell 设置。