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

Kar*_*ter 8 python environment sudo environment-variables

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

  • 目录x中的现有python脚本文件
  • __init__.pyx中现有的python cat 文件
  • x添加到PYTHONPATH变量availble登录用户和sudo

我想调用~/test.py

#!/usr/bin/python
import sys;print sys.path;
import mount_utils
print "Hello World!"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果PYTHONPATHsudo 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: -
Run Code Online (Sandbox Code Playgroud)

我没有从相似的未解答的问题中得到任何想法为什么PYTHONPATH被忽略了?

编辑1:考虑如何为我的linux系统下的每个人设置环境变量?而事实上echo ...是一个相当不错的方法,以确保ENV变量是否设置,我把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是(除上述情况外)envsudo -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由于相同的错误而失败.

cho*_*own 8

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

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

添加此行:
Defaults env_keep += "PYTHONPATH".

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

  • 我该如何在 Windows 中执行此操作?我在运行单元测试时陷入困境。我收到错误“正在导入测试模块...未找到文件的 PYTHONPATH:...”。我已在[此处]提出了详细问题(/sf/ask/3681550911/) (2认同)