导入错误只与sudo运行python应用程序时?

我试图用sudo命令运行一些python代码,但每次我这样做,它都会给我一个导入错误。 但是,如果我运行,说,在terminalimport numpy它不给我错误。 另外,如果我用几个Imports构build一个代码,然后在没有sudo命令的情况下运行它,它不会给我带来任何错误,而且代码完美无瑕。 我已经添加了Defaults env_keep += "PYTHONPATH"到sudoers文件夹,所以这不是问题。 我安装了Anaconda3,所以也许这是有用的信息?

我正在运行GNOME Ubuntu 16.04.1 LTS。 和内核版本4.4.0-59-通用。

对不起,我很新,但是我在学习。

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

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

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

我使用sudo运行它,因为我需要docker的权限才能工作。

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

你所遇到的问题是,在查看可执行文件时, sudo不遵循通常的PATH顺序:它首先search系统目录。 这是写在man sudo

安全注意事项执行外部命令时, sudo尝试安全。

为了防止命令欺骗, sudo检查"." "" (都表示当前目录)最后search用户PATH的命令时 (如果其中一个或两个都在PATH )。 但是请注意,实际的PATH环境variables没有被修改,并且不变地传递给sudo执行的程序。

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

 sudo /home/user/anaconda3/bin/python 

应该工作的一般命令是:

 sudo "$(which python)" 

这是因为which python sudo 之前执行,并且其输出作为parameter passing给sudo 。 然而,默认情况下, sudo不会执行任何“类似shell”的设置,并且可能会限制环境,因此您可以考虑使用-E-i标志来使sudo不受环境影响地通过环境并进行正确的shell设置。