не может импортировать numpy, когда скрипт находится в подкаталоге - PullRequest
2 голосов
/ 21 мая 2019

У меня такая структура папок, как у

root/        
    A0/
        A1/
    B0/
        B1/

Допустим, у меня есть файл с именем test.py.В нем я импортирую numpy примерно так:

import numpy as np

Это все, что содержится в файле.Это работает без проблем, когда оно находится в корневой подпапке A0, A1, B0, но вызывает ошибку в подпапке B1.Возникает ли ошибка следующим образом:

Traceback (most recent call last):
  File "pose/utils/test.py", line 1, in <module>
    import numpy as np
  File "/home/adrian/.local/lib/python3.6/site-packages/numpy/__init__.py", line 187, in <module>
    from .testing import Tester
  File "/home/adrian/.local/lib/python3.6/site-packages/numpy/testing/__init__.py", line 10, in <module>
    from unittest import TestCase
  File "/usr/lib/python3.6/unittest/__init__.py", line 59, in <module>
    from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
  File "/usr/lib/python3.6/unittest/case.py", line 6, in <module>
    import logging
  File "/home/adrian/Projects/lpr-pose-estimation/pose/utils/logging.py", line 3, in <module>
    from pose.utils.utils import mkdir_if_missing
  File "/home/adrian/Projects/lpr-pose-estimation/pose/utils/utils.py", line 4, in <module>
    from scipy.misc import imresize
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/misc/__init__.py", line 68, in <module>
    from scipy.interpolate._pade import pade as _pade
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/interpolate/__init__.py", line 175, in <module>
    from .interpolate import *
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/interpolate/interpolate.py", line 32, in <module>
    from .interpnd import _ndim_coords_from_arrays
  File "interpnd.pyx", line 1, in init scipy.interpolate.interpnd
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/spatial/__init__.py", line 98, in <module>
    from .kdtree import *
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/spatial/kdtree.py", line 8, in <module>
    import scipy.sparse
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/sparse/__init__.py", line 230, in <module>
    from .base import *
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/sparse/base.py", line 9, in <module>
    from scipy._lib._numpy_compat import broadcast_to
  File "/home/adrian/.local/lib/python3.6/site-packages/scipy/_lib/_numpy_compat.py", line 16, in <module>
    _assert_warns = np.testing.assert_warns
AttributeError: module 'numpy' has no attribute 'testing'

Импорт в виде модулей (например, cv2) также приводит к ошибкам, но только в отношении ошибки:

ImportError: numpy.core.multiarray failed to import
Traceback (most recent call last):
  File "pose/utils/test.py", line 1, in <module>
    import cv2 as cv
  File "/home/adrian/.local/lib/python3.6/site-packages/cv2/__init__.py", line 3, in <module>
    from .cv2 import *
ImportError: numpy.core.multiarray failed to import

Что может быть причиной такогоошибка?

1 Ответ

1 голос
/ 21 мая 2019

Если ваш стартовый скрипт находится в .../pose/utils, то каждый абсолютный импорт также ищет там модули. Этот каталог содержит модуль с именем logging (как в стандартной библиотеке).

Во время инициализации пакета numpy (выполняющего его __init__.py) и до того, как numpy.testing станет доступным, происходит обычная цепочка импорта (как видно из трассировки), которая приводит к неправильному модулю logging что в свою очередь приводит к импорту _numpy_compat, который пытается получить доступ к numpy.testing слишком рано.

Чтобы избежать этой проблемы циклического импорта, вы можете либо переименовать свой модуль logging, либо переместить стартовый скрипт в другой каталог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...