Как импортировать модули Python
Я изучаю, как импортировать библиотеки из каталогов, и наткнулся на ошибку, которую я не могу понять. Я использую библиотеку IMDBpy python в папке с именем lib. Ниже я импортирую модуль, который больше не возвращает ошибок, но когда я перехожу к строке № 6, я получаю следующую ошибку:
Traceback (most recent call last):
File "testlib.py", line 4, in <module>
from lib.imdb import IMDb
File "/home/user/Scripts/test/lib/imdb/__init__.py", line 49, in <module>
import imdb._logging
ImportError: No module named 'imdb'
Python выдает ошибку, потому что тестовый файл python, который я пишу, на 2 каталога выше. Не уверен, как заставить это работать, не помещая все в ту же самую директорию.
#!/usr/bin/env python3
from lib.imdb import IMDb
# Create the object that will be used to access the IMDb's database.
ia = imdb.IMDb() # by default access the web.
2 ответа
Вы можете написать:
from lib.imdb import IMDb
ia = IMDb()
или же:
from lib import imdb
ia = imdb.IMDb()
Но импорт IMDb
а потом звонит imdb.IMDb()
не работает.
Еще один момент для упоминания: если ваш testlib.py находится выше lib
фодер, тогда нужно добавить __init__.py
файл в lib
для вашего импорта на работу. Файл может быть полностью пустым.
Обновление: в этих пакетах используется оператор импорта, относящийся не к папке пакета, а к произвольной папке в sys.path
, Иллюстрацией этого является точная строка, которая вызывает ошибку:
# imdb.__init__.py
imdb._logging
Это работает, только если пакеты находятся в папке, которая является частью sys.path
так что либо по тому же пути, что и скрипт, который делает from imdb import IMDb
оператор или в пути к дистрибутиву Python (упрощенное объяснение). Этот и весь эквивалентный импорт может быть заменен
# imdb.__init__.py
from . import _logging
В этом случае импорт выполняется относительно модуля, поэтому нет необходимости, чтобы пакет imdbpy находился в каталоге в sys.path
,
Следствием для нас сейчас является то, что мы не можем просто поместить imdb в подпапку, нам нужно либо поместить его в папку из sys.path
или добавьте папку, в которой он находится sys.path
, Итак, варианты:
- установить пакет
- переместить папку imdb вверх в текущую папку
записывать:
import sys sys.path.insert(0, 'absolute/path/to/lib')
до утверждения импорта.
В любом из вышеперечисленных случаев вы сможете сделать:
from imdb import IMDb
ia = IMDb()
Как упоминалось выше, импорт объекта отличается от импорта функции. Когда вы импортируете такой модуль, как imdb
Вы можете использовать его функции. Однако, когда вы импортируете функцию, вы можете использовать только эту функцию, а не объект / модуль, откуда она появилась.
Проверьте это для лучших примеров: модули Python 3