一、遇到的问题

在虚拟环境中安装了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。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐