导入错误只与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设置。