Почему нельзя найти импортируемый редактируемый пакет Python?

Вопрос или проблема

  1. Структура каталога dir1:
dir1/
|-- helloworld/
    |-- __init__.py
    |-- hello.py
|-- setup.py
|-- venv/ # Виртуальная среда dir1
  1. Структура каталога dir2:
dir2/
|-- app2.py
|-- venv/ # Виртуальная среда dir2
# hello.py
def say_hello():
    return "Hello, World!"
# setup.py
from setuptools import setup, find_packages

setup(
    name="helloworld",
    version='0.1',
    packages=find_packages(),
)
  1. Активируйте venv в dir2
C:\Users\TC\temp\editable\dir2>venv\Scripts\activate
(venv) C:\Users\TC\temp\editable\dir2>
  1. Установите пакет helloworld в venv dir2 в редактируемом режиме.
(venv) C:\Users\TC\temp\editable\dir2>pip install -e C:\Users\TC\temp\editable\dir1
  1. Импортируйте пакет helloworld из app2.py
# app2.py
from helloworld.hello import say_hello

print(say_hello())
  1. Запустите app2.py
python app2.py

Теперь проблема. Пакет helloworld не найден в app2.py. Однако, команда pip list показывает, что пакет helloworld установлен. В VS Code под helloworld.hello есть желтая зигзагообразная линия, указывающая на то, что пакет не найден.

Это очень простая настройка для тестирования редактируемой установки python-пакета. Интересно, воспроизводится ли ошибка. Или это ошибка! ОС – Windows.

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

Любая помощь будет очень оценена.

Примечание:

Вам нужно pip install setuptools в venv dir1.

Я считаю, что проблема возникает из-за find_packages() в вашем setup.py, который включает директорию venv, вызывая конфликты импорта. Чтобы исправить это, измените ваш setup.py и исключите venv.

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что Python не может найти импортируемый пакет helloworld в вашем файле app2.py, несмотря на то, что пакет был успешно установлен в режиме редактирования. Давайте разберем возможные причины и решения по порядку.

Возможные причины проблемы:

  1. Не правильная структура проекта или ошибка в setup.py:
    Ваша структура каталогов выглядит правильно, но убедитесь, что __init__.py действительно находится в каталоге helloworld. Этот файл говорит Python, что данный каталог является пакетом.

  2. Проблемы с путями:
    Поскольку вы используете совместные виртуальные окружения в разных директориях, убедитесь, что активировали верное окружение, прежде чем запускать скрипт.

  3. Проблемы с установкой пакета в режим редактирования:
    Поскольку вы установили пакет в режиме редактирования с помощью команды pip install -e, убедитесь, что вы выполняли эту команду из активного виртуального окружения dir2.

  4. Конфликты с виртуальными окружениями:
    Иногда, если вы работаете с несколькими виртуальными окружениями, могут возникнуть ситуации, в которых Python использует библиотеку из одного окружения, не находя пакет в другом.

Решение проблемы:

  1. Проверьте структуру и наличие __init__.py:
    Убедитесь, что файл __init__.py есть в каталоге helloworld. Этот файл может быть пустым, его наличие позволяет Python распознавать helloworld как пакет.

  2. Измените setup.py:
    В вашем setup.py у вас используется find_packages(), который может захватывать ненужные директории, такие как venv. Измените setup.py на следующий вариант:

    from setuptools import setup, find_packages
    
    setup(
       name="helloworld",
       version='0.1',
       packages=find_packages(exclude=["venv*"]),
    )

    Это пиет исключит все директории, начинающиеся на venv, из области поиска пакетов.

  3. Активируйте правильное окружение:
    Убедитесь, что виртуальное окружение dir2 активировано перед установкой пакета. Для активации используйте:

    C:\Users\TC\temp\editable\dir2\venv\Scripts\activate
  4. Проверьте установку пакета:
    После установки выполните команду pip list в окружении dir2, чтобы убедиться, что helloworld действительно установлен. Если он не установлен, попробуйте переустановить его:

    pip uninstall helloworld
    pip install -e C:\Users\TC\temp\editable\dir1
  5. Пробуйте выполнить app2.py:
    Теперь, после проверки всех вышеуказанных пунктов, попробуйте ещё раз запустить скрипт app2.py:

    python app2.py

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

Если описанные шаги не помогли решить проблему, возможно, необходимо больше информации о том, как именно вы их выполняете или дополнительные детали о конфигурации вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...