Не работают импорты python

Как работают импорты в Python

Порой бывает трудно правильно реализовать import с первого раза, особенно если мы хотим добиться правильной работы на плохо совместимых между собой версиях Python 2 и Python 3. Попытаемся разобраться, что из себя представляют импорты в Python и как написать решение, которое подойдёт под обе версии языка.

Содержание

Ключевые моменты

  • Выражения import производят поиск по списку путей в sys.path .
  • sys.path всегда включает в себя путь скрипта, запущенного из командной строки, и не зависит от текущей рабочей директории.
  • Импортирование пакета по сути равноценно импортированию __init__.py этого пакета.

Основные определения

  • Модуль: любой файл *.py . Имя модуля — имя этого файла.
  • Встроенный модуль: «модуль», который был написан на Си, скомпилирован и встроен в интерпретатор Python, и потому не имеет файла *.py .
  • Пакет: любая папка, которая содержит файл __init__.py . Имя пакета — имя папки.
    • С версии Python 3.3 любая папка (даже без __init__.py ) считается пакетом.
  • Объект: в Python почти всё является объектом — функции, классы, переменные и т. д.

Пример структуры директорий

Обратите внимание, что в корневой папке test/ нет файла __init__.py .

Что делает import

При импорте модуля Python выполняет весь код в нём. При импорте пакета Python выполняет код в файле пакета __init__.py , если такой имеется. Все объекты, определённые в модуле или __init__.py , становятся доступны импортирующему.

Читайте также:  Не работают задние лапы у щенка

Основы import и sys.path

Вот как оператор import производит поиск нужного модуля или пакета согласно документации Python:

При импорте модуля spam интерпретатор сначала ищёт встроенный модуль с таким именем. Если такого модуля нет, то идёт поиск файла spam.py в списке директорий, определённых в переменной sys.path . sys.path инициализируется из следующих мест:

  • директории, содержащей исходный скрипт (или текущей директории, если файл не указан);
  • директории по умолчанию, которая зависит от дистрибутива Python;
  • PYTHONPATH (список имён директорий; имеет синтаксис, аналогичный переменной окружения PATH ).

Программы могут изменять переменную sys.path после её инициализации. Директория, содержащая запускаемый скрипт, помещается в начало поиска перед путём к стандартной библиотеке. Это значит, что скрипты в этой директории будут импортированы вместо модулей с такими же именами в стандартной библиотеке.

Технически документация не совсем полна. Интерпретатор будет искать не только файл (модуль) spam.py , но и папку (пакет) spam .

Обратите внимание, что Python сначала производит поиск среди встроенных модулей — тех, которые встроены непосредственно в интерпретатор. Список встроенных модулей зависит от дистрибутива Python, а найти этот список можно в sys.builtin_module_names (Python 2 и Python 3). Обычно в дистрибутивах есть модули sys (всегда включён в дистрибутив), math , itertools , time и прочие.

В отличие от встроенных модулей, которые при поиске проверяются первыми, остальные (не встроенные) модули стандартной библиотеки проверяются после директории запущенного скрипта. Это приводит к сбивающему с толку поведению: возможно «заменить» некоторые, но не все модули стандартной библиотеки. Допустим, модуль math является встроенным модулем, а random — нет. Таким образом, import math в start.py импортирует модуль из стандартной библиотеки, а не наш файл math.py из той же директории. В то же время, import random в start.py импортирует наш файл random.py .

26 октября в 18:00, Онлайн, Беcплатно

Кроме того, импорты в Python регистрозависимы: import Spam и import spam — разные вещи.

Функцию pkgutil.iter_modules() (Python 2 и Python 3) можно использовать, чтобы получить список всех модулей, которые можно импортировать из заданного пути:

Чуть подробнее о sys.path

Чтобы увидеть содержимое sys.path , запустите этот код:

Документация Python описывает sys.path так:

Список строк, указывающих пути для поиска модулей. Инициализируется из переменной окружения PYTHONPATH и директории по умолчанию, которая зависит от дистрибутива Python.

При запуске программы после инициализации первым элементом этого списка, path[0] , будет директория, содержащая скрипт, который был использован для вызова интерпретатора Python. Если директория скрипта недоступна (например, если интерпретатор был вызван в интерактивном режиме или скрипт считывается из стандартного ввода), то path[0] является пустой строкой. Из-за этого Python сначала ищет модули в текущей директории. Обратите внимание, что директория скрипта вставляется перед путями, взятыми из PYTHONPATH .

Документация к интерфейсу командной строки Python добавляет информацию о запуске скриптов из командной строки. В частности, при запуске python

Источник

Не могу импортировать мои собственные модули в Python

Мне трудно понять, как работает импорт модулей в Python (я никогда раньше не делал этого ни на каком другом языке).

Допустим, у меня есть:

Теперь я пытаюсь получить что-то вроде этого:

Тем не менее, я определенно делаю что-то не так, поскольку Python не видит, что myapp является модулем:

7 ответов

В вашем конкретном случае похоже, что вы пытаетесь импортировать SomeObject из сценариев myapp.py и TestCase.py. Из myapp.py сделать

Так как он находится в той же папке. Для TestCase.py сделайте

Однако , это будет работать, только если вы импортируете TestCase из пакета. Если вы хотите напрямую запустить python TestCase.py , вам придется возиться с вашим путем. Это можно сделать в Python:

Хотя, как правило, это не рекомендуется.

В общем, если вы хотите, чтобы другие люди использовали ваш пакет Python, вы должны использовать distutils создать скрипт установки. Таким образом, любой может легко установить ваш пакет с помощью команды, подобной python setup.py install , и он будет доступен везде на их компьютере. Если вы серьезно относитесь к пакету, вы можете даже добавить его в индекс пакетов Python, PyPI.

pip install в Windows 10 по умолчанию устанавливается в ‘Program Files / PythonXX / Lib / site-packages’, который является каталогом, требующим административных привилегий. Поэтому я исправил проблему, запустив pip install от имени администратора (вы должны открыть командную строку от имени администратора, даже если вы вошли в систему с учетной записью администратора). Также безопаснее вызывать pip из python.
например,
python -m pip install

вместо
pip install

Экспортный путь — это хороший способ. Другой способ — добавить .path к вашему местоположению пакетов сайта. На моем mac мой python хранит пакеты сайтов в / Library / Python, показанном ниже

Я создал файл с именем awesome.pth в /Library/Python/2.7/site-packages/awesome.pth и в файле поместил следующий путь, который ссылается на мои удивительные модули

В вашем первом каталоге myapp вы можете добавить файл setup.py и добавить два кода Python в setup.py

В вашем первом каталоге myapp в командной строке используйте pip install -e. установить пакет

Потому что имя вашего проекта совпадает с myapp.py, что делает его поиск в документе проекта первым

Функция import ищет файлы в вашей среде PYTHONPATH. переменная и ваш локальный каталог. Таким образом, вы можете либо поместить все свои файлы в один каталог, либо экспортировать путь, набрав в терминале:

Источник

Почему не работает import в Python?

Вопрос банальный, но я застопорился на этом моменте.

Есть основной файл, а есть модуль, который содержит одну функцию. Они лежат в одной папке. В основном файле есть вызов функции из модуля.
Работает, если from test_function import abc, но не работает, если import test_function (хочу, чтобы весь последующий код из модуля в дальнейшем импортировался автоматически в основной файл). Я что-то делаю неправильно?

  • Вопрос задан более трёх лет назад
  • 5065 просмотров

при импорте модуля:

импорт всего содежимого:

>>> Насколько я знаю, это импортирует все функции? А если нужно импортировать весь код?
Для модулей только функции и классы нужны. Или вы хотите вызвать и исполнение кода, что не в функциях?
Если так, то при импорте происходит исполнение кода модуля, т.е. что не в функциях сразу же исполняется. Обычно, это как раз, не требуется и соответственно этого пытаются избежать таким способом:

__name__ будет равен __main__ при прямом запуске этого модуля, и имени файла без расширения (.py) при импорте. Для кругозора прочитайте про пространство имен в Python-е. Спойлер: модули(файлы *.py) в Python такие же объекты как и экземпляры классов, и работаем с ними соответственно

Источник

Питон не видит модули, не получается импортировать

Я установил все нужные модули для проекта, они уже находятся в папке site-packages с питоном

Я использую python 3.9.5, 32 разрядности, после установки модулей, я перезагружал IDE, компьютер, и интерпретатор (я использую VSCode)

При запуске командная строка в IDE выдаёт это

Как можно увидеть по консоли, где я устанавливал модули через pip, pywin был установлен несколько раз (pypiwin32, pywin32), я пробовал «более современное решение», на похожем сайте — https://progi.pro/nevozmozhno-importirovat-modul-python-win32crypt-11627061 (не реклама)

Более современное решение: pip install pypiwin32 Это содержит файлы.whl, которые помогут установить в Windows. ответил(а) 4 месяца назад David Metcalfe

Другие модули устанавливаются и импортируются корректно, например — import ip2geotools и import tempfile

1 ответ 1

нашёл решение проблемы, вроде (ну по крайней мере этот импорт больше не подсвечивается жёлтым в VSC и не просит починить) итак к сути: пишем pip install cryptohash и заменяем from Crypto.Hash import SHA512 на from cryptohash import sha512 (в моём случае) программу не тестировал, ещё не пофиксил другие проблемы, поэтому работоспособность программы с этим методом незнаю.

Если у вас аналогичная проблема, но не в точности похожая и вы уверенны, что установили модуль без ошибок (ошибки обычно подсвечиваются красным): Перейдите в папку где у вас находится python.exe -> Lib -> site-packages и поиском файлов Windows пишите название проблемного модуля, если их несколько или заглавная буква отличается, найдите нужный путём проверки файлов, в моём случае я проверил файл SHA512.py (который импортировал), он оказался в обоих, но работало только с тем, который был написан маленькими буквами

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python modules или задайте свой вопрос.

Связанные

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.18.40487

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Источник

Проблема с импортом в python

Структура файлов такова:

Суть проблемы: классы, которые лежат в a.py и b.py должны наследоваться от базового класса, одним из атрибутов которого является класс, который лежит в c.py . Я думаю, что это хорошая идея — хранить базовые классы в __init__.py просто чтобы в папках не валялось лишних файлов.

На вот такую попытку импорта класса с компилятор начинает ругаться:

Документация как-то не очень помогла и я не особо понимаю суть проблемы.

PS. Не рассмотрел ещё возможность запихивания файла c.py в отдельный каталог на том же уровне, но что-то подсказывает мне, что результат будет тот же.

4 ответа 4

Ошибка говорит, что родительская директория main (не сама main папка) не являются Питон пакетом (Python package), т.е. там нет (ожидаемо) __init__.py .

Формально, исправить это можно используя from ..c import ClassC на уровне a.py (две точки, чтобы до родителя дойти). Но более понятно и надёжно будет использовать абсолютный импорт:

В целом, программируя на Питоне следует использовать меньше церемоний, в частности не следует помещать каждый публичный класс в отдельный модуль только потому что это публичный класс. main, classes также являются плохими именами так как они слишком общие (я надеюсь что это просто имена, используемые для вопроса и main имеет более уникальное имя). classes пакет не обязателен, не следует создавать вложенные пакеты без необходимости, можно использовать плоскую структуру:

Источник

Оцените статью