Импорт из одноуровневого каталога - Python 3,7 - PullRequest
1 голос
/ 09 февраля 2020

Я прочитал несколько статей о модулях и пакетах в Python (включая их собственное руководство), но не смог заставить его правильно работать над моим проектом. Я использую Python 3.7.5

Это моя структура каталогов:

framework/
    __init__.py
    build/
    classifiers/
    extraction/
        extractionFile.py
    quality/
    utils/
        utilsFile.py

На extractFile.py у меня есть эта строка:

from ..utils.utilsFile import functionName

Но когда я запускаю extractFile.py из каталога извлечения, я получаю следующую ошибку:

Traceback (most recent call last):
  File "extractionFile.py", line 25, in <module>
    from ..utils.utilsFile import functionName
ImportError: attempted relative import with no known parent package

Если я запускаю extractFile.py из каталога платформы, используя:

from utils.utilsFile import functionName

Это работает правильно .

Так как же я могу превратить только каталог utils в пакет, чтобы импортировать любой файл, который находится внутри него, из каталогов братьев и сестер?

Примечание: I only Мне нужно использовать пакет в этом проекте.

Примечание: Я пытаюсь получить постоянное решение, поэтому sys.path.insert (), кажется, не вариант.


Редактировать: Ответ помечен как правильный, но в итоге я нашел другое решение. Из каталога фреймворка просто запустите (я использую Linux):

DIR=$(pwd) && export PYTHONPATH="${PYTHONPATH}:$DIR"

Это помещает каталог фреймворка в переменные sys.path для Python. Путь к Python для поиска пакетов и модулей.

Полагаю, вы просто используете тот, который лучше подходит для вашего случая.

1 Ответ

0 голосов
/ 09 февраля 2020

Относительный импорт работает только в пределах root каждого пути к библиотеке, и вы не можете использовать относительный импорт для достижения родительского элемента root пути к библиотеке. В случае импорта модулей из вашего собственного проекта путь библиотеки root - это место, где запускается интерпретатор, поэтому для импорта utils/utilsFile.py вам нужно запустить extractionFile.py из framework вместо extraction.

Если вы хотите иметь возможность запускать extractionFile.py из extraction, тем не менее, простым решением будет добавить .. в путь к библиотеке, добавив его в список sys.path, поэтому что родительский каталог extraction будет одним из путей к библиотекам, и поэтому вы сможете напрямую импортировать из utils.utilsFile:

import sys
sys.path.append('..')
from utils.utilsFile import functionName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...