Когда пакет имеет то же имя, что и файл .py внутри пакета, import X импортирует модуль, а не сам пакет. Как избежать? - PullRequest
0 голосов
/ 30 сентября 2019

Итак, пакет, который я создаю, выглядит примерно так:

Blur/
├── blur
│   ├── __init__.py
│   ├── blur.py
│   ├── funcs
│   │   ├── __init__.py
│   │   ├── face_funcs.py
│   │   └── funcs.py
│   ├── tests
│   │   ├── __init__.py
│   │   └── test_blur.py
│   └── utils
│       ├── __init__.py
│       └── timer.py
└── setup.py

Doing import blur импортирует модуль blur.py, а не сам пакет. Если я изменю имя blur.py, а затем сделаю импорт, я получу весь пакет. Есть ли способ получить весь пакет без изменения имени blur.py?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

AFAIK это не возможно как встроенный механизм Python, поэтому изменение имени будет вашим лучшим выбором.

Однако существуют обходные пути, но, на мой взгляд, такие решения довольно уродливы.

Вот пример:

import importlib
import os
import sys

def custom_import(repo_path, directory, package=False):
    absolute_path = repo_path if package else os.path.join(repo_path, directory)
    if os.path.exists(absolute_path):
        sys.path.insert(0, absolute_path)
        if package:
            imported = importlib.import_module(f'{directory}')
        else:
            imported = importlib.import_module(f'{directory}.{directory}')
        sys.path.pop(0)
        return imported
    raise ImportError(' No such package/module found')

Пример использования:

package = custom_import('D:\PycharmProjects\python-tools', 'roomba', package=True)
module = custom_import('D:\PycharmProjects\python-tools', 'roomba')


module.main()
0 голосов
/ 30 сентября 2019

Если вы укажите путь к папке «Blur» в операторе импорта, это должно заставить python импортировать пакет, а не файл .py. Я считаю, что по умолчанию Python при импорте ищет файлы, оканчивающиеся на .py.

...