gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:56:09 25 4
gpt4 key购买 nike

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

  • 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com