不同用户下的sys.path

编程语言 2026-07-08

我想以另一个用户来运行一个Python应用。问题在于,当以其他用户运行时,它找不到已安装的包,即使我已经激活了虚拟环境。

例如,当我是用户 foo 时,下面是 <VENV_PATH>/bin/python -m site 的输出:

sys.path = [
    '<CWD>',
    '/usr/lib64/python39.zip',
    '/usr/lib64/python3.9',
    '/usr/lib64/python3.9/lib-dynload',
]
USER_BASE: '/home/USERNAME/.local' (exists)
USER_SITE: '/home/USERNAME/.local/lib/python3.9/site-packages' (doesn't exist)
ENABLE_USER_SITE: False

但当我是root用户时,下面是 <VENV_PATH>/bin/python -m site 的输出:

sys.path = [
    '<CWD>',
    '/usr/lib64/python39.zip',
    '/usr/lib64/python3.9',
    '/usr/lib64/python3.9/lib-dynload',
    '<VENV_PATH>/.venv/lib64/python3.9/site-packages',
    '<VENV_PATH>/.venv/lib/python3.9/site-packages',
]
USER_BASE: '/home/USERNAME/.local' (exists)
USER_SITE: '/home/USERNAME/.local/lib/python3.9/site-packages' (doesn't exist)
ENABLE_USER_SITE: False

……这清楚地表明来自虚拟环境 <VENV_PATH> 的模块正在被视为可用。

作为其他用户:

$ ./python -m pip list
<VENV_PATH>/.venv/bin/python: No module named pip

……但作为root:

$ ./python -m pip list
Package            Version
------------------ -------
alembic            1.16.1
aniso8601          10.0.0
blinker            1.9.0
...

如何解决?


背景

  • Python版本:3.9.12
  • 由venv创建的虚拟环境:python3 -m venv <VENV_PATH>

解决方案

给所有用户的目录赋予读和执行权限,给文件赋予读权限:

chmod -R o+rX <VENV_PATH>/.venv

注:大写的 X 仅对已经具有执行权限的目录或文件应用执行权限,避免你不小心把文本文件设为可执行。

还要确保用户foo在到达 <VENV_PATH> 的父级目录上至少具有执行权限(x),可以通过执行

sudo -u foo ls <VENV_PATH>/.venv

如果显示 "Permission denied",你还需要像 chmod o+x /path/to/parent 那样修复父目录的权限。

一般来说,在Linux中:“执行”权限意味着:

  1. 对于目录:允许进入或搜索
  2. 对于文件:允许将该文件作为程序执行

大写的 X 可以称作“智能执行”,因为

  1. 如果是目录,它只是给予进入或搜索的权限(就像小写的 x 一样),
  2. 如果是文件,它在合理的情况下赋予执行权限。例如如果其他用户已经对该文件具有执行权限,它也会赋予执行权限。

而小写的 x 不管文件类型如何——无论是图片、文本还是其他类型的文件——都会赋予执行权限。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章