Пользовательские пакеты python предоставляют ModuleNotFoundError при импорте

#python #python-3.x #package #python-packaging

Вопрос:

Ниже приведена структура моего пакета python

 pkg
|-- src
    |-- data
        |-- __init__.py
        |-- loader1.py
    |-- dataset
        |-- __init__.py
        |-- loader2.py
    |-- utils
        |-- __init__.py
        |-- chk.py
|-- setup.py
|-- __init__.py
|-- LICENSE
|-- README.md
 

После установки pip я хотел использовать from pkg.data.loader1 import func , и поэтому я использовал from pkg.data.loader1 import func (в терминале Linux). В результате я получил ModuleNotFoundError: No module named ответ.

Как я могу это исправить.

Редактировать: setup.py

 from setuptools import setup

with open("README.md", 'r') as fh:
    long_description = fh.read()

setup(
    name="pkg",
    version="0.0.1",
    description="will add",
    long_description=long_description,
    long_description_content_type="text/markdown",
    author="my name",
    packages=['pkg'],
    install_requires=[]
    )
 

Комментарии:

1. можете ли вы включить содержание вашего setup.py поста в свой пост?

2. и просто чтобы быть уверенным, вы действительно запустили pip install -e . , прежде чем пытаться импортировать, верно?

3. используется pip3 install pkg.whl @Арне

4. эти вещи могут быть сложны в отладке, поэтому я пока не буду писать ответ. можете ли вы сначала попробовать 1) добавить пустой __init__.py файл непосредственно в pkg и 2) импортировать find_packages , а также в setup обновлении вашего вызова packages=find_packages("pkg")

Ответ №1:

У вас есть package_dir={"": "pkg"} packages=find_packages("pkg") и include_package_data=True в вас setup() метод. Если нет, то я бы рекомендовал вам добавить его следующим образом —

 setup(
    ....
    package_dir={"": "pkg"},
    packages=find_packages("pkg"),
    include_package_data=True,
    ....
)
 
  • package_dir={"": "pkg"} — сообщает, что пакеты dsutil находятся под pkg
  • find_packages("pkg") — включите все пакеты под pkg
  • include_package_data=True — включите все в систему управления версиями

Надеюсь, с помощью этого вы сможете достичь того, чего хотите.

Ответ №2:

Глядя на структуру ваших инструкций по импорту, вам, вероятно, нужна дополнительная папка, в которой будут храниться все ваши подпакеты:

 pkg
├── src  # important: its only content is pkg
│   └── pkg  # new folder here
│       ├── __init__.py  # important: this file needs to exist
│       ├── data
│       │   ├── __init__.py
│       │   └── loader1.py
│       ├── dataset
│       │   ├── __init__.py
│       │   └── loader2.py
│       └── utils
│           ├── __init__.py
│           └── chk.py
├── setup.py
├── __init__.py
├── LICENSE
└── README.md
 

Далее, вам setup.py нужно знать, что src это источник кода, но не корневой каталог пакета, который находится pkg прямо под ним, плюс все его подпакеты:

 setup(
    ....
    package_dir={"": "src"},
    packages=find_packages("pkg"),
    ....
)
 

Затем вы можете установить этот пакет в свой активный в настоящее время интерпретатор python python -m pip install -e . таким образом, чтобы вам не нужно было повторно устанавливать его после каждого изменения кода (вам все равно нужно будет переустановить его после обновления setup.py ).