不同用户下的sys.path
我想以另一个用户来运行一个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中:“执行”权限意味着:
- 对于目录:允许进入或搜索
- 对于文件:允许将该文件作为程序执行
大写的 X 可以称作“智能执行”,因为
- 如果是目录,它只是给予进入或搜索的权限(就像小写的
x一样), - 如果是文件,它在合理的情况下赋予执行权限。例如如果其他用户已经对该文件具有执行权限,它也会赋予执行权限。
而小写的 x 不管文件类型如何——无论是图片、文本还是其他类型的文件——都会赋予执行权限。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。