我有以下情况(通过以下命令验证):
- 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.path
和 Hello World!
到控制台)。 sudo -E python ~/test.py
失败并出现相同的错误。我不明白
- 如果
PYTHONPATH
,为什么模块不可用?变量打印在sudo echo
中输出 - 为什么
sudo -E
不保护环境(据我了解man sudo
和 https://docs.python.org/2/using/cmdline.htmlpython bla
和sudo -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
现在PYTHONPATH
在env
中(除上述情况外)可用在 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/