#python #python-3.x #setuptools #python-packaging
#python #python-3.x #setuptools #python-упаковка
Вопрос:
У меня есть проект с этим setup.py
файлом:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="",
version="0.0.1",
author="",
author_email="",
description="",
long_description=long_description,
long_description_content_type="text/markdown",
packages=setuptools.find_packages(where="./src", exclude=("./tests",)),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.8',
)
Это структура каталогов моего проекта (первые два уровня):
$ tree -L 2
.
├── README.md
├── setup.py
├── src
│ └── my_pkg
└── tests
├── conftest.py
├── data
├── __init__.py
├── integration
├── __pycache__
└── unit
Когда я запускаю любую команду setuptools, я получаю следующую ошибку:
$ python setup.py build
running build
running build_py
error: package directory 'my_pkg' does not exist
То же самое происходит для других команд, таких как python setup.py develop
и python setup.py bdist-wheel
.
Я подозреваю, что это связано с src
каталогом, как указано в find_packages(where="./src")
вызове в setup.py
. Тем не менее, я следил за документацией, и похоже my_pkg
, что модуль обнаружен в какой-то момент.
Почему не build_py
удается его найти?
Комментарии:
1. Изменить на
packages=setuptools.find_packages(where="src", exclude=("tests",))
2. @SreeramTP Это не имеет никакого значения.
3.
setuptools.setup( name="", version="0.0.1", author="", author_email="", description="", long_description=long_description, long_description_content_type="text/markdown", package_dir={"": str("src")}, classifiers=[ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ], python_requires='>=3.8', )
Можете ли вы попробовать это? @Carsten4. Добавление
package_dir
, похоже, действительно помогает.
Ответ №1:
find_packages()
автоматически генерирует имена пакетов. То есть в вашем случае все, что он делает, это генерирует ['my_pkg']
. На самом деле он не указывает setup()
, где искать my_pkg
, просто он должен ожидать, что пакет my_pkg
будет где-то вызван. Вы должны отдельно указать setup()
, где он должен искать пакеты. Это сбивает с толку и противоречит интуиции? ДА. В любом случае, вы можете указать setup()
, где искать my_pkg
, используя package_dir
аргумент. например.
package_dir={"":"src"}
Комментарии:
1. привет, есть ли способ сделать это с
setup.cfg
помощью?2. setuptools.readthedocs.io/en/latest/userguide/…
3. На самом деле, я не нахожу документацию очень понятной для проектов с плоскими структурами. Для меня это сработало (вместо перечисления всех подмодулей), выполняя только
setup.cfg
:[options]package_dir = mypkg = name_of_your_package