这是我遇到的错误
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/