半遗留系统:非root用户无法使用egg安装的cryptography模块求助
这种半遗留系统里的包权限坑我踩过不少,既然root能正常运行,说明包本身没问题,普通用户的问题大概率出在权限访问限制或者底层依赖库的读取权限上。给你一步步排查解决:
1. 检查cryptography.egg文件及所在目录的权限
root安装的egg文件默认权限可能是root:root,普通用户根本读不了。先在root环境下找到cryptography egg的路径:
python -c "import cryptography; print(cryptography.__path__)"
切换到普通用户后,检查文件和目录权限:
ls -l /path/to/cryptography-<version>.egg ls -ld /path/to/the/directory/containing/egg
- 如果egg文件权限是
-rw-r--r--但所属为root,执行sudo chmod o+r /path/to/cryptography-*.egg给其他用户添加读权限 - 所在目录需要有执行权限(让普通用户能进入目录),如果权限里没有
o+x,执行sudo chmod o+x /path/to/egg/directory
2. 排查cryptography依赖的系统库权限
cryptography依赖OpenSSL等底层系统库,root能访问但普通用户可能被限制。让普通用户执行以下命令获取依赖库路径:
python -c "from cryptography.hazmat.bindings.openssl.binding import Binding; print(Binding.lib)"
拿到路径后检查库文件权限:
ls -l /path/to/libssl.so /path/to/libcrypto.so
确保这些库文件有o+r权限(其他用户可读),如果没有,用sudo chmod o+r修正。
3. 验证PYTHONPATH是否真的生效
虽然你说设置了和root一致的PYTHONPATH,但可能在普通用户的shell环境里没加载生效。让普通用户执行:
echo $PYTHONPATH python -c "import sys; print('\n'.join(sys.path))"
对比root的sys.path,如果egg路径不在里面,说明PYTHONPATH没正确设置。可以把PYTHONPATH写入普通用户的~/.bashrc或~/.profile:
echo 'export PYTHONPATH="/root/sys/path/here"' >> ~/.bashrc source ~/.bashrc
再重新测试导入。
4. 确认Python版本一致性
有时候root和普通用户的默认Python版本不一样,比如root用python3.8,普通用户用python3.6,即使PYTHONPATH设了也没用。分别在root和普通用户下执行:
python --version
如果版本不同,要么统一默认Python版本,要么给普通用户的对应Python版本安装cryptography egg。
5. 手动加载egg测试
如果上面都没问题,让普通用户手动指定egg路径测试:
python -c "import sys; sys.path.insert(0, '/path/to/cryptography-*.egg'); import cryptography; print('Cryptography loaded successfully!')"
如果能成功,说明是路径优先级的问题(比如普通用户的sys.path里有其他冲突的包),可以调整PYTHONPATH的顺序,把cryptography的egg路径放在最前面。
内容的提问来源于stack exchange,提问作者Ani

