Вопрос или проблема
- Структура каталога dir1:
dir1/
|-- helloworld/
|-- __init__.py
|-- hello.py
|-- setup.py
|-- venv/ # Виртуальная среда dir1
- Структура каталога 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(),
)
- Активируйте venv в dir2
C:\Users\TC\temp\editable\dir2>venv\Scripts\activate
(venv) C:\Users\TC\temp\editable\dir2>
- Установите пакет helloworld в venv dir2 в редактируемом режиме.
(venv) C:\Users\TC\temp\editable\dir2>pip install -e C:\Users\TC\temp\editable\dir1
- Импортируйте пакет helloworld из app2.py
# app2.py
from helloworld.hello import say_hello
print(say_hello())
- Запустите 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
, несмотря на то, что пакет был успешно установлен в режиме редактирования. Давайте разберем возможные причины и решения по порядку.
Возможные причины проблемы:
-
Не правильная структура проекта или ошибка в
setup.py
:
Ваша структура каталогов выглядит правильно, но убедитесь, что__init__.py
действительно находится в каталогеhelloworld
. Этот файл говорит Python, что данный каталог является пакетом. -
Проблемы с путями:
Поскольку вы используете совместные виртуальные окружения в разных директориях, убедитесь, что активировали верное окружение, прежде чем запускать скрипт. -
Проблемы с установкой пакета в режим редактирования:
Поскольку вы установили пакет в режиме редактирования с помощью командыpip install -e
, убедитесь, что вы выполняли эту команду из активного виртуального окруженияdir2
. -
Конфликты с виртуальными окружениями:
Иногда, если вы работаете с несколькими виртуальными окружениями, могут возникнуть ситуации, в которых Python использует библиотеку из одного окружения, не находя пакет в другом.
Решение проблемы:
-
Проверьте структуру и наличие
__init__.py
:
Убедитесь, что файл__init__.py
есть в каталогеhelloworld
. Этот файл может быть пустым, его наличие позволяет Python распознаватьhelloworld
как пакет. -
Измените
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
, из области поиска пакетов. -
Активируйте правильное окружение:
Убедитесь, что виртуальное окружениеdir2
активировано перед установкой пакета. Для активации используйте:C:\Users\TC\temp\editable\dir2\venv\Scripts\activate
-
Проверьте установку пакета:
После установки выполните командуpip list
в окруженииdir2
, чтобы убедиться, чтоhelloworld
действительно установлен. Если он не установлен, попробуйте переустановить его:pip uninstall helloworld pip install -e C:\Users\TC\temp\editable\dir1
-
Пробуйте выполнить
app2.py
:
Теперь, после проверки всех вышеуказанных пунктов, попробуйте ещё раз запустить скриптapp2.py
:python app2.py
Если после выполнения всех шагов проблема остаётся, попробуйте перезапустить вашу IDE или командную строку, или даже попробовать запускать скрипт вне IDE, чтобы исключить влияние настроек среды разработки.
Если описанные шаги не помогли решить проблему, возможно, необходимо больше информации о том, как именно вы их выполняете или дополнительные детали о конфигурации вашей системы.