#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 находятся под pkgfind_packages("pkg")
— включите все пакеты под pkginclude_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
).