Если вы хотите запустить тесты для установленного кода, вам нужен промежуточный каталог (не пакет), содержащий весь ваш исходный код, который будет установлен;общее название для этого просто src
.Пример макета:
project_root
├── src
│ ├── spam
│ │ ├── __init__.py
│ │ └── eggs.py
│ └── ...
├── tests
│ ├── test_spam.py
│ └── ...
└── setup.py
Настройка сценария установки для учета src
dir:
# setup.py
from setuptools import setup, find_packages
setup(
name='spam',
...
packages=find_packages('src'),
package_dir={'': 'src'},
...
)
С этим макетом, хотя текущий каталог (project_root
) все еще добавляется вsys.path
, все пакеты скрыты от импорта.Таким образом, вы вынуждены установить свой пакет, чтобы иметь возможность вызывать тесты и всегда тестировать установленный код.Обычно вы устанавливаете пакет в режиме разработки с помощью pip install --editable .
на локальном компьютере во время написания кода и устанавливаете пакет с помощью pip install .
на CI-сервере, и тесты будут выполняться поверх фактической установки пакета.Еще одним преимуществом является то, что эта компоновка не позволяет импортировать исходный код вашего пакета в сценарии установки, вы не сталкиваетесь с проблемой «куриного яйца» при установке (для установки кода ваш код должен быть уже установлен).
Если у вас есть свободные модули, я предпочитаю использовать команду pathlib
:
py_modules=[p.name for p in pathlib.Path('src').glob('*.py')]
Если вам все еще нужна совместимость с Python 2, решение может выглядеть следующим образом:
py_modules=[os.path.splitext(os.path.basename(p))[0] for p in glob.glob("src/*.py")]