Ошибки Sphinx autodo c и OpenCV (cv2) (Python 3.7) - PullRequest
0 голосов
/ 31 марта 2020

Во-первых, скажите, что я совершенно новичок в сфинксе. Я работаю над проектом обработки изображений, который использует opencv. Хотя я смог настроить sphinx (и успешно протестировал его с помощью нескольких простых модулей), я изо всех сил стараюсь заставить его работать с моим основным модулем. Сначала я получал ошибки, потому что autodo c не распознавал некоторые классы opencv (cv2), которые, как мне кажется, только «работают» во время выполнения (например, вывод VideoCapture.read () был интерпретирован как None и не смог получить свою форму или cv2.imshow, который тоже сломал здание html). Чтобы избежать этого, я включил

autodoc_mock_imports = ['cv2', 'numpy']

в мой файл conf.py. Перечисленные выше проблемы исчезли, но теперь я получаю новую:

WARNING: autodoc: failed to import module 'ch01_06_movie_and_beads'; the following exception was       raised:
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\envs\Book_OpenCV3\lib\site-packages\sphinx\ext\autodoc\importer.py", line 32, in import_module
return importlib.import_module(modname)
File "C:\ProgramData\Anaconda3\envs\Book_OpenCV3\lib\importlib\__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
 File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
 File "<frozen importlib._bootstrap>", line 983, in _find_and_load
 File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
 File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
 File "<frozen importlib._bootstrap_external>", line 728, in exec_module
 File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
 File "C:\Users\Carlos\PycharmProjects\Book_OpenCV3\Chapter_01\ch01_06_movie_and_beads.py", line 244, in <module>
resized_frame = resize_with_aspect_ratio(frame, width=1000)
 File "C:\Users\Carlos\PycharmProjects\Book_OpenCV3\Chapter_01\ch01_06_movie_and_beads.py", line 222, in resize_with_aspect_ratio
(h, w) = img.shape[:2]
 File "C:\ProgramData\Anaconda3\envs\Book_OpenCV3\lib\site-packages\sphinx\ext\autodoc\mock.py", line 57, in __getitem__
return _make_subclass(key, self.__display_name__, self.__class__)()
 File "C:\ProgramData\Anaconda3\envs\Book_OpenCV3\lib\site-packages\sphinx\ext\autodoc\mock.py", line 74, in _make_subclass
attrs = {'__module__': module, '__display_name__': module + '.' + name}
TypeError: can only concatenate str (not "slice") to str

Код упомянутого метода:

def resize_with_aspect_ratio(img=None, width=None, height=None, inter=cv2.INTER_AREA):
  if img is None:
      return None
  (h, w) = img.shape[:2]
  if width is None and height is None:
      return img
  if width is None:
      r = height / float(h)
      dim = (int(w * r), height)
  else:
      r = width / float(w)
      dim = (width, int(h * r))
  return cv2.resize(img, dim, interpolation=inter)

Я понимаю, что autodo c не делает Мне нравится нарезка в im.Shape [: 2], но если мне придется вручную пересматривать весь код, это станет кошмаром. Поскольку, как я уже сказал, я новичок в sphinx autodo c, я что-то не так делаю? Что мне не хватает? Заранее спасибо.

1 Ответ

0 голосов
/ 01 апреля 2020

Я решил это, поместив основной код в __main__:

if __name__ == "__main__":
    [...] # some stuff
    capture = cv2.VideoCapture(str(input_file))
    has_frame, frame = capture.read()
    resized_frame = resize_with_aspect_ratio(frame, width=1000)
    [...] # more stuff

. autodoc_mock_imports даже не требуется в файле conf.py .

Надеюсь, это кому-нибудь поможет!

...