Python setuptools: каталог пакетов не существует

#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', ) Можете ли вы попробовать это? @Carsten

4. Добавление 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