Python不会导入模块

标签 python python-2.7

这是我遇到的错误

Traceback (most recent call last):
  File "detectron/utils/subprocess.py", line 28, in <module> import numpy as np
  File "/usr/local/lib/python2.7/dist-packages/numpy/__init__.py", line 142, in <module> from . import add_newdocs
  File "/usr/local/lib/python2.7/dist-packages/numpy/add_newdocs.py", line 13, in <module> from numpy.lib import add_newdoc
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/__init__.py", line 8, in <module> from .type_check import *
  File "/usr/local/lib/python2.7/dist-packages/numpy/lib/type_check.py", line 11, in <module> import numpy.core.numeric as _nx
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/__init__.py", line 74, in <module> from numpy.testing import _numpy_tester
  File "/usr/local/lib/python2.7/dist-packages/numpy/testing/__init__.py", line 10, in <module> from unittest import TestCase
  File "/usr/lib/python2.7/unittest/__init__.py", line 58, in <module> from .result import TestResult
  File "/usr/lib/python2.7/unittest/result.py", line 9, in <module> from . import util
  File "/usr/lib/python2.7/unittest/util.py", line 2, in <module> from collections import namedtuple, OrderedDict 

  ImportError: cannot import name namedtuple

这里的问题是,模块已安装

$ ls /usr/lib/python2.7
    ...
    -rwxr--r-- 1 root root  27798 Dec  5  2017 collections.py
    -rwxr--r-- 1 root root  26059 Jul 17 17:40 collections.pyc
    ...

如果我直接从 python 导入,它工作得很好:

$ python
    Python 2.7.12 (default, Dec  4 2017, 14:50:18) 
    [GCC 5.4.0 20160609] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from collections import namedtuple, OrderedDict
    >>> 

这是 $PYTHONPATH 的内容

$ echo $PYTHONPATH
    /usr/lib/python2.7/

这是 $PATH 的内容

$ echo $PATH
    /home/deep/bin:/home/deep/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/bin/python

这是Python看到的

>>> import sys
>>> from pprint import pprint as p
>>> p(sys.path)
['',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/home/deep/.local/lib/python2.7/site-packages',
 '/home/deep/cocoapi/PythonAPI/Detectron',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/local/lib/python2.7/dist-packages/pycocotools-2.0-py2.7-linux-x86_64.egg',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages']
>>> 

我以为这是某种冲突,但我不知道如何......

$ sudo find / -name "collections.py"
    /home/deep/cocoapi/PythonAPI/Detectron/detectron/utils/collections.py
    /usr/local/lib/python2.7/dist-packages/hypothesis/searchstrategy/collections.py
    /usr/local/lib/python2.7/dist-packages/future/moves/collections.py
    /usr/local/lib/python2.7/dist-packages/matplotlib/collections.py
    /usr/lib/python2.7/collections.py

$ sudo find / -name "collections"
    /usr/lib/python3.5/collections

我没有主意了;我不知道为什么我无法导入这个模块。 预先感谢您。

*编辑:看起来像

/home/deep/cocoapi/PythonAPI/Detectron/detectron/utils/collections.py

正在引发冲突。有什么方法可以确定调用的优先级,以便我可以首先使用 python 库吗?

最佳答案

$ sudo find / -name "collections.py"
   /home/deep/cocoapi/PythonAPI/Detectron/detectron/utils/collections.py

我认为,罪魁祸首可能就在这里。

您的 detectorr 包中有一个名为“collections”的模块。

我想,不知何故,这个集合模块是在导入标准集合模块之前导入的。

导入后,所有模块都按其名称存储在内存中。因此,当不同的包再次导入“集合”时,它只会(由于名称冲突)得到错误的模块。因为它不包含namedtuple,所以您会收到错误。

补救措施:

  • 重命名集合模块
  • 或确保它始终与包一起导入(完全限定)

因此:

  • 不要为您的模块使用标准模块的名称 - 这很危险。

关于Python不会导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51571652/

相关文章:

django - 如何使用南将数据从一个字段迁移到另一个表中的字段

python - 在 Python 中读取当前迭代器值而不递增

python - 使用 numpy 将矩阵元素替换为其他矩阵元素

python - 我们如何删除重复单个字符的单词?

python - 使用 2d 键从 count 获取主元

python - 如何使用 map() 在对象列表上调用类方法

使用 subprocess 模块后 Python raw_input 不起作用

python :数字序列

python - 为什么要在 Python 中隐式检查是否为空?

python - HDF存储异常: cannot find the correct atom type : a basic case