python - 当包含目录是 PYTHONPATH 的一部分并且文件存在时,为什么找不到 PYTHONPATH 中的模块?

标签 python environment-variables sudo environment

我有以下情况(通过以下命令验证):

  • x 目录下已有 python 脚本文件
  • 现有的 python 猫__init__.py归档在x
  • x 添加到 PYTHONPATH登录用户和 sudo 均可用的变量

我想调用 ~/test.py

#!/usr/bin/python
import sys;print sys.path;
import mount_utils
print "Hello World!"

sudo python ~/test.py这导致

Traceback (most recent call last):
  File "/home/richter/test.py", line 3, in <module>
    import mount_utils
ImportError: No module named mount_utils

PYTHONPATH 中的目录不在 sys.path 中除了当前目录。 python ~/test.py按预期工作(打印 sys.pathHello World! 到控制台)。 sudo -E python ~/test.py失败并出现相同的错误。我不明白

  • 如果PYTHONPATH,为什么模块不可用?变量打印在 sudo echo 中输出
  • 为什么 sudo -E不保护环境(据我了解 man sudohttps://docs.python.org/2/using/cmdline.html python blasudo -E python bla 之间应该没有任何区别)

为什么会出现此错误?

详细情况验证:

$ env | grep PYTHONPATH
PYTHONPATH=:/home/richter/scripts/python:/home/richter/scripts/python/installsystem:/home/richter/scripts/python/lib
$ sudo env | grep PYTHONPATH
$ LANG=C stat /home/richter/scripts/python/lib/mount_utils.py
  File: '/home/richter/scripts/python/lib/mount_utils.py'
  Size: 8374        Blocks: 24         IO Block: 4096   regular file
Device: 80ch/2060d  Inode: 20972052    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ richter)   Gid: ( 1000/ richter)
Access: 2014-08-19 17:06:37.542787417 +0200
Modify: 2014-07-31 10:54:14.709468668 +0200
Change: 2014-07-31 10:54:14.729478917 +0200
 Birth: -
$ LANG=C stat /home/richter/scripts/python/lib/__init__.py
  File: '/home/richter/scripts/python/lib/__init__.py'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 80ch/2060d  Inode: 20972114    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/ richter)   Gid: ( 1000/ richter)
Access: 2014-08-09 19:49:44.345055332 +0200
Modify: 2014-05-07 06:57:31.434851243 +0200
Change: 2014-06-25 03:17:29.569551147 +0200
 Birth: -

我没有从非常相似的未回答问题中得到任何想法 Why is PYTHONPATH being ignored?

编辑 1:在考虑 How to set environment variable for everyone under my linux system? 之后以及echo ...的事实是确保是否设置环境变量的一种相当糟糕的方法,我把 export PYTHONPATH="$PYTHONPATH:/home/richter/scripts/python:/home/richter/scripts/python/installsystem:/home/richter/scripts/python/lib"

  • /etc/profile
  • /etc/profile.d/python_py.sh
  • /root/.bashrc
  • /home/richter/.bashrc

现在PYTHONPATHenv 中(除上述情况外)可用在 sudo -i提示,但不在 sudo env | grep PYTHONPATH 中. sudo python test.py由于相同的错误仍然失败,即我的问题仍然存在。

还有 export PYTHONPATH="/home/richter/scripts/python:/home/richter/scripts/python/installsystem:/home/richter/scripts/python/lib" && sudo -E python test.py由于相同的错误而失败。

最佳答案

您需要将您的 PYTHONPATH 环境变量添加到 sudoers env_keep

运行:
sudo visudo(以安全方式打开 /etc/sudoers 文件)。

添加这一行:
默认 env_keep += "PYTHONPATH"

现在 :wq,这将在运行 sudo 时保留 PYTHONPATH 变量

关于python - 当包含目录是 PYTHONPATH 的一部分并且文件存在时,为什么找不到 PYTHONPATH 中的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25387374/

相关文章:

go - 组织环境变量 Golang

Java 类路径,未找到类

linux - docker 运行说 "No such image"

python - 如何打印 float 而不在 python 中进行任何截断?

来自外部创建的文件的 python pyinotify 事件

bash - Jenkins 内部 docker-compose 的环境变量

php - php exec() 中的 sudo

python - 如何以 root 身份执行 os.* 方法?

python - 带有 Pandas DataFrame 的点图/Ggplot;列名作为 x 值,相应的列值作为 y 值

python - 来自 pandas DataFrame 的热图 - 二维数组