проблемы импорта подпакетов в python: как мне записать файлы __init__.py - PullRequest
3 голосов
/ 08 апреля 2020

Я новичок в создании пакетов, так что терпите меня. У меня проблема с импортом подпакетов моего последнего python проекта.

Моя структура каталогов следующая:

├── package
│   ├── __init__.py
│   ├── subpackage_a
│   │   ├── __init__.py
│   │   └── functions_a.py
│   └── subpackage_b
│       ├── __init__.py
│       └── functions_b.py
└── setup.py

Файлы выглядят следующим образом

setup.py:

from setuptools import setup
setup(name='test_package',
      version='0.3',
      description='',
      author='me',
      packages=['package']
      )

пакет / __ init __. Py : пусто.

subpackage_a / __ init __. Py : from .functions_a import *

subpackage_b / __ init__. py : from .functions_b import *

functions_a.py

содержит

def hello_world_a():

    print('hello its a')

и functions_b.py содержит

def hello_world_b():

    print('hello its b')

Теперь я открываю virtualenv go для каталога setup.py и I pip install .. Я ожидал получить доступ к функциям, содержащимся в подпакетах a и b. Но когда я пытаюсь импортировать функции, я получаю ошибку «модуль не найден».

from package.subpackage_a import hello_world_a 

ModuleNotFoundError: No module named 'package.subpackage_a'

и то же самое относится к subpackage_b. Но если я импортирую пакет, это признается. У меня есть ощущение, что этот подход работал, поскольку у меня есть несколько старых пакетов, написанных таким образом, которые больше не работают.

Возможно, мне нужно изменить мои init .py файлы? Что я делаю неправильно ?

1 Ответ

3 голосов
/ 08 апреля 2020

setuptools.setup не знает, что subpackage_a и subpackage_b существуют. Вы указали только верхний уровень package. Таким образом, он не будет включать эти подпакеты в установку. Вместо этого вы должны также указать их:

setup(
    ...,
    packages=['package', 'subpackage_a', 'subpackage_b']
)

Этот процесс может быть автоматизирован с помощью find_packages():

from setuptools import find_packages

setup(
    ...,
    packages=find_packages()
)
...