ImportError: No module named XXX

       这个问题可能是python学习和使用过程中最常见的文件了,python提供了功能复杂,各式各样的包,在使用这些包的时候当然需要下载。

       那么当出现ImportError时,可一按照一下几种方式一一排查。         

  1. 目标包或者模块是否已经下载

    假设目标模块是numpy。终端模式下,执行如下命令,会清晰的告诉你本地安装numpy的信息(名称,版本,安装位置,作者,主页等等)
               $ pip show numpy
    注意:pip show 只能查看某个已经安装的包,如果未安装,则没有任何信息。
    若发生目标模块未安装,安装之!
  2. 目标模块已安装,但仍然ImportError

    这种情况属于python path环境的缺失造成的。import模块时,会逐个搜寻sys.path变量中的每个目录,直至搜索到为止,如果搜索不到,则视为ImportError。

    比如经过pip show numpy得到numpy的安装路径为:/usr/local/lib/python2.7/dist-packages,那么添加path环境:
    import sys
    
    sys.path.append("/usr/local/lib/python2.7/dist-packages")
    注意:不要想当然的把根目录“/”添加到path环境中,import是不会查寻子目录的,否则也就不会有下面这种格式了。
    from django.core.wsgi import get_wsgi_application
    from后面那一串其实指定了目标模块的目录层级结构,换算一下:“/usr/local/lib/python2.7/dist-packages/django/core/wsgi”,至于wsgi是目录还是python文件不好说,看具体情况。
    为什么要这么做呢?有这种疑问的,难道不知道起名难吗?吐个槽,开个玩笑,起名难是一部分原因,另外一个原因是为了功能私有化,比如公司有两个人都叫小明,突然喊一声“小明”,谁知道你喊的哪个,谁搭理你啊。但如果这么喊呢“策划部的xxx项目的小明”,这就有唯一性了,甚至可以加更多的修饰。
     
  3. 目标模块已安装,path环境添加完成,但依然ImportError

    有时候我们认为sys.path添加完成就万事大吉了,千万别抱有这种侥幸心理,作者就为这种心理浪费了大半天的时间。那个时候作者整个人是懵的,认为遇到了玄学bug,真想炫耀一下,但又怕惹笑话。

    背景是这样的,使用django搭建了一个demo级的web,后台python单跑,没问题,django启动server,通过web调用后台接口也没问题。 本着完美的节奏,不能每时每刻都要我跑着django啊,所以想通过nginx和uwsgi部署到服务器上去,一步步调通了,但是web调用接口时,后台总是报错“ImportError: No module named google.protobuf.internal”。特意在import之前打印了sys.path,没有问题,那么问题来了,为什么找不到呢。

    python大牛可能一眼就能看出问题所在,无奈我还是新嫩。直到我注意到了python2.7,突然想到了一个严重的问题。python2.7有个非常恶心的设定,目标模块所在目录必须有__init__.py文件,哪怕是空文件,否则对应模块无法import。一番查看,protobuf 和 internal目录下都有这个文件,但是google目录下没有。创建一下,再次尝试,运行成功!!!

    废话有些多,总结一下,python2.7需要__init__.py方可允许import对应模块,因此,若发现,包或者模块已经安装,path环境也添加完成,但依然ImportError,那么检查一下目标模块下是否存在__init__.py吧。


     

那么问题来了,如果真的是因为__init__.py文件缺失的话,为什么通过python xxx.py 不会报错,通过django也没有问题,偏偏通过uwsgi那里报错呢 ?是python和django有额外动作,还是其他什么?不得而知,若有知晓的大虾,烦请告知!??先行送上!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,当出现"ImportError: No module named xxx"的错误时,通常是因为Python无法找到所需的模块。这可能是由于以下几个原因导致的: 1. 模块未安装:确保你已经正确地安装了所需的模块。你可以使用pip命令来安装模块,例如`pip install 模块名`。 2. 模块名称错误:检查你在代码中引用模块的名称是否正确。确保模块名称的大小写与实际模块的名称匹配。 3. 模块路径问题:如果你的模块不在Python解释器的默认搜索路径中,你需要将模块所在的路径添加到sys.path中。你可以使用以下代码将路径添加到sys.path中: ```python import sys sys.path.append("模块路径") ``` 请注意,"ImportError: No module named recording_pb2"的错误提示中提到了"recording_pb2"模块。根据这个错误提示,我们可以推断出你在代码中引用了名为"recording_pb2"的模块,但是Python无法找到该模块。 为了解决这个问题,你可以尝试以下几个步骤: 1. 确保你已经正确地安装了名为"recording_pb2"的模块。你可以使用pip命令来安装模块,例如`pip install recording_pb2`。 2. 检查你在代码中引用模块的名称是否正确。确保模块名称的大小写与实际模块的名称匹配。 3. 如果"recording_pb2"模块不在Python解释器的默认搜索路径中,你需要将模块所在的路径添加到sys.path中。你可以使用以下代码将路径添加到sys.path中: ```python import sys sys.path.append("recording_pb2模块的路径") ``` 请根据你的具体情况进行相应的调整和尝试。如果问题仍然存在,请提供更多的信息,以便我们能够更好地帮助你解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值