Linux多Python版本执行docker-compose up报YAMLObject语法错误
问题根因
你现在的配置从根上就错了:
PYTHONPATH是所有Python版本启动时都会优先读取的全局环境变量,不是给单个Python版本专属用的。你把Python3.6的site-packages路径硬塞到全局PYTHONPATH最高优先级,会导致不管启动Python2还是Python3,都会优先加载Python3.6的依赖包。你报错的核心原因就是:系统自带的1.29.2版本docker-compose本身是基于Python2.7打包的,启动时本来该加载Python2版本的PyYAML,结果被全局PYTHONPATH截胡,加载了Python3.6版本的PyYAML——Python2根本不认识metaclass=这类3.x专属语法,直接报语法错误。- 你疑惑的sys.path里自动出现Python2.7路径,是Python解释器的内置逻辑:每个版本的Python启动时,都会自动把自身版本对应的标准库路径、site-packages路径追加到sys.path里,这个行为和你怎么配PYTHONPATH没关系。哪怕你把PYTHONPATH清空,启动Python2.7时它照样会加载自己的2.7路径,启动Python3.6时也会自动加载3.6的路径,根本不需要你手动往PYTHONPATH里加。
- 你之前把Python2.7路径放到PYTHONPATH顶部能让docker-compose跑起来,但Python3程序又报错,本质就是同一个问题:全局PYTHONPATH塞单版本路径,必然会导致另一个版本的程序加载错依赖。
正确配置方案(全Python3.6环境,无版本冲突)
核心原则:不要在全局PYTHONPATH里放任何单Python版本专属的site-packages路径,Python自己会按启动的版本匹配对应依赖路径,手动加只会搞混版本。
按以下步骤操作:
- 先清理错误的环境变量配置
打开你家目录下的.profile文件,把你之前加的两行Python3.6 site-packages路径从PYTHONPATH配置里删掉,PYTHONPATH默认留空即可,保存退出。 - 卸载系统里基于Python2.7打包的旧版docker-compose
根据你的系统包管理器执行对应命令:- CentOS/RHEL系:
sudo yum remove -y docker-compose - Debian/Ubuntu系:
sudo apt remove -y docker-compose
- CentOS/RHEL系:
- 用Python3.6对应的pip安装适配Python3的docker-compose
先确认你调用的pip是绑定Python3.6的:pip3 --version
确认输出里显示关联的是Python3.6版本后,执行安装:sudo pip3 install docker-compose==1.29.2 - 配置系统默认python命令指向Python3.6
不要直接硬改/usr/bin/python软链,容易把系统里依赖Python2的底层工具搞崩,用alternatives管理多版本优先级最稳妥:
执行完后跑sudo alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo alternatives --install /usr/bin/python python /usr/bin/python3.6 2python --version,确认输出为Python3.6.x即配置正确。 - 生效环境变量
执行source ~/.profile让刚才改的配置立即生效。
结果验证
依次执行以下操作确认配置正常:
- 跑
docker-compose --version,能正常输出版本号,执行docker-compose up不会再出现之前的语法报错 - 跑
python -c "import sys; print('\n'.join(sys.path))",输出的路径里全是Python3.6相关的标准库、site-packages路径,不会出现Python2.7的路径干扰 - 其他依赖Python3.6的业务程序可以正常加载对应依赖,不会出现版本冲突问题
内容的提问来源于stack exchange,提问作者Nilesh
相关产品推荐
相关产品推荐

