Импортировать модуль из другого каталога в Python 3 - PullRequest
0 голосов
/ 24 апреля 2020

Я знаю, что этот вопрос задавался тысячи раз, но я до сих пор не могу получить правильный ответ и всегда сталкиваюсь с одной и той же проблемой.

У меня есть следующий файл:

application/app/__init__.py

Здесь у меня есть некоторая переменная, пусть она будет x.

Затем у меня есть еще один файл:

application/tests/test_1.py

В test_1.py Я делаю это:

from app import x

И, находясь в папке application, я запускаю:

python3 tests/test_1.py

Но возникает следующая ошибка:

ModuleNotFoundError: No module named 'app'

Одно из работающих решений: внутри test_1.py, добавьте:

import sys
sys.path.append('../')
from app import db

Тогда, если я сделаю:

cd tests
python3 test_1.py

Это отлично работает, но я не хочу это sys.path.append, а также я хотел бы do

python3 tests/test_1.py

Другое решение заключается в явном изменении переменной окружения PYTHONPATH, но я бы не хотел этого делать. Нет ли чистого решения этой проблемы?

1 Ответ

0 голосов
/ 24 апреля 2020

Не пытайтесь вручную взломать sys.path. Это «быстрое исправление» плохой практики, которое вы, вероятно, узнали из ответов stackoverflow.

Python ищет импорт либо в папке site-packages, либо в PYTHONPATH. Самый простой способ поместить вашу локальную папку в пакеты сайта - это использовать

pip install --editable path/to/myfolder

. Вам нужен только файл setup.py в вашей программе "myfolder" со следующим содержимым

from setuptools import setup
setup(name='myfolder")

Название «myfolder» важно только в том случае, если вы хотите удалить его. Но в конечном итоге это создаст символическую ссылку на мою папку в окружениях site-package, и вы сможете продолжить редактирование, как и раньше. Но ваша программа работает "как если бы она была установлена".

Это гораздо более гибко, чем изменение PYTHONPATH.

Что касается другого комментария: когда `application 'связано с пакетами сайта и тем самым распознается через sys.path,

from app import x

- это абсолютный импорт, поскольку «приложение» - это папка внутри папки верхнего уровня «приложение».

...