今天遇到一个奇怪的问题,客户安装了python3.6,系统自带了python2.7,当我调用系统自带的python2.7环境时,导入的一个模块却是python3.6的模块.,我们查找一下path
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python2.7/site-packages/multiqc-1.6dev-py2.7.egg', '/usr/lib/python2.7/site-
packages/spectra-0.0.11-py2.7.egg', '/usr/lib/python2.7/site-packages/simplejson-3.13.2-
py2.7-linux-x86_64.egg', '/usr/lib/python2.7/site-packages/requests-2.18.4-py2.7.egg',
'/usr/lib/python2.7/site-packages/PyYAML-3.12-py2.7-linux-x86_64.egg',
'/usr/lib/python2.7/site-packages/Markdown-2.6.11-py2.7.egg', '/etc/profile.d',
'/ds3200_1/proc/pasta-bin/lib/python3.6/site-packages', '/ds3200_1/proc/pasta',
'/ds3200_1/proc/pasta-bin/lib/python3.6/site-packages/DendroPy-4.4.0-py3.6.egg',
'/ds3200_1/proc/miniconda3/lib/python3.6/site-packages', '/ds3200_1/proc/pasta-bin/lib/python',...]
后来发现是因为用户配置了PYTHONPATH的原因,由此也引发了python路径搜索的问题,它是怎么搜索的
第一步搜索: 程序的根目录
第二步搜索: PYTHONPATH设置的环境变量
第三步搜索: 标准库
第四步搜索: 所有的.pth(一般写在site-packages下面 也可以调用site.getsitepackages查看)
第五步搜索: site-packages
本质上,sys.path是在安装python时写死的路径,随着一些配置加进来,才逐步扩大的。
由于客户某些软件一定要用配置python3.6的搜索路径,最终的解决方案是PYTHONPATH不做配置,在python3.6建一个搜索路径文件*.pth。