一、遇到的问题
在虚拟环境中安装了tensorboard 2.6.0
,并且import tensorboard
,但导入的是C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python37\\site-packages
(后文简称该路径为【1】)中的tensorboard 1.4.0
。
二、分析
一般认为在虚拟环境中import module
时,系统首先查找的应该是E:\\Anaconda3\\envs\\pytorch17\\lib\\site-packages
(后文简称该路径为【2】)路径下的模块。但其实不是这样,import的搜索顺序和sys.path直接关联,sys.path是一个列表,import逐一搜索sys.path中的路径。
sys.path是动态生成的,有两种方式可以查看它的内容:
1.直接输出
import sys
print(sys.path)
2.命令行
python -m site
可以看到路径【1】在路径【2】的前面,所以优先import了路径【1】的tensorboard 1.4.0
。
路径【1】并不是该虚拟环境的子路径,为什么会将【1】加入当前虚拟环境的sys.path?
通过命令python -m site -help
可以看到site.py的路径,进入到site.py,发现下列函数会根据系统路径和python版本自动获取一个路径–USER_SITE,如果USER_SITE真实存在,就加到sys.path中;而上文提到的路径【1】其实就是USER_SITE。
def _getuserbase():
env_base = os.environ.get("PYTHONUSERBASE", None)
if env_base:
return env_base
def joinuser(*args):
return os.path.expanduser(os.path.join(*args))
if os.name == "nt":
base = os.environ.get("APPDATA") or "~"
return joinuser(base, "Python")
if sys.platform == "darwin" and sys._framework:
return joinuser("~", "Library", sys._framework,
"%d.%d" % sys.version_info[:2])
return joinuser("~", ".local")
三、解决方案
既然import的顺序与sys.path直接相关,那么只要修改sys.path就可以。修改sys.path有两种方法:
sys.path.append
- 添加“xxx.pth文件”
详细过程参考:修改sys.path
当然,如果路径【1】中的module没什么用的话,直接卸载该路径中的相应module就可以,这样最终会在路径【2】中找到想要的那个module。