【问题标题】:ImportError only with sudo when running python app?运行 python 应用程序时仅使用 sudo 的 ImportError?
【发布时间】:2017-01-28 13:52:46
【问题描述】:

我正在尝试使用sudo 命令运行一些python 代码,但每次执行此操作时,都会出现导入错误。但是,如果我在终端中运行import numpy,它不会给我任何错误。此外,如果我使用多个 Imports 构建代码,然后在没有 sudo 命令的情况下运行它,它不会给我任何错误并且代码运行完美。我已经在 sudoers 文件夹中添加了 Defaults env_keep += "PYTHONPATH",所以这不是问题。我安装了 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

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

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

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

【问题讨论】:

  • 尝试用sudo -E替换sudo

标签: python docker anaconda sudo ubuntu-16.04


【解决方案1】:

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

安全注意事项 sudo 在执行外部命令时会尽量保证安全。

为防止命令欺骗,sudo 在搜索 用户的PATH(如果其中之一或两者都在PATH 中)。但是请注意,实际的 PATH 环境变量没有被修改并被传递 sudo 执行的程序不变。

因此,要解决此问题,您必须确保您提供给 sudo 的命令不能匹配系统可执行文件,即指定绝对路径:

sudo /home/user/anaconda3/bin/python

应该起作用的一般命令是:

sudo "$(which python)"

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

【讨论】:

  • 我刚试过这个。我将 python 应用程序更改为 /home/user/anaconda3/bin/ 目录,并在终端中运行 sudo /home/user/anaconda3/bin/python mlcode.py 代码。现在它说那里没有这样的文件或目录。
  • @AaronGonzalez 好吧,你必须使用正确的路径。我只是复制了您粘贴的内容,如果不正确,我无能为力。
  • 我想通了。但是,它现在说找不到“main”模块。
  • @AaronGonzalez 这可能是环境问题。尝试将-E-i 标志添加到sudo:sudo -i /home/<user>/.../bin/python-i 标志告诉 sudo 进行设置,就好像它正在启动一个 shell,所以如果你在像 .bash_profile/.bashrc 这样的文件中有一些环境设置,这些将被执行。
  • 我试过这两个,但我得到了同样的错误。还有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多