运行 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/python
which 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 设置。
我正在尝试使用 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/python
which 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'sPATH
(if one or both are in thePATH
). Note, however, that the actualPATH
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 设置。