python虚拟环境中import的搜索顺序及相关问题(sys.path)

一、遇到的问题

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值