Как импортировать модуль из папки рядом с текущей папкой?

#python #import #module

#python #импорт #модуль

Вопрос:

Я проверил столько страниц SO, сколько смог, и перепробовал все, что нашел, но ни одна из них не увенчалась успехом. Я также проверил страницу PEP относительно импорта и попробовал каждый пример, ни один из которых не сработал.

У меня есть папка tests с модульными тестами в них, и мне нужно импортировать модуль, который я хочу протестировать. Модули находятся в папке с именем ‘src’, которая находится рядом с папкой src.

Папки / файлы выглядят примерно так:

 Project / 
        src /
            stringbuilder.py
            __init__.py
        tests / 
            stringbuilder_test.py
            __init__.py
        main.py
        __init__.py
  

Я перепробовал все, что мог: добавлял __init__.py в каждую папку, делая ее модулем, включая основную папку проекта.

 import src.module_to_test 
from ..src.module_to_test import function_to_test
from ..src import module_to_test
  

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

Если я допускаю какие-либо очевидные ошибки, пожалуйста, дайте мне знать.

 from tests import stringbuilder
  

Сообщение об ошибке:

 $ ./stringbuilder_test.py
Traceback (most recent call last):
  File "./stringbuilder_test.py", line 14, in <module>
    from tests import stringbuilder
ImportError: No module named tests
  

Та же ошибка возникает для (но tests = src):

 from src import stringbuilder
  

Комментарии:

1. у вас есть __init__.py файл в этой папке?

2. Да, он есть в папке проекта, папке src и папке тестов.

3. не могли бы вы вставить сообщение об ошибке? может быть, это полезно.

4. попробуйте: из класса импорта stringbuilder_test (какой класс вам нужно импортировать)

5. «src» или «тесты»? Можете ли вы предоставить нам более подробную информацию о вашей иерархии файлов и папок?

Ответ №1:

Если скрипты выполняются внутри пакета, то для правильной работы импорта необходимо использовать различные хаки. Вероятно, наиболее распространенным из них является манипулирование sys.path :

 import sys, os

sys.path.insert(0,
    os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from src import stringbuilder

del sys.path[0]
  

Этого невозможно достичь с помощью обычных инструкций импорта.

Обычно лучшим решением является просто избегать запуска скриптов внутри пакетов вообще. Вместо этого поместите все скрипты вне пакета в содержащий каталог. Учитывая, что каталог текущего запущенного скрипта автоматически добавляется в начало sys.path , это гарантирует, что пакет всегда можно импортировать напрямую, независимо от того, откуда выполняется скрипт.

Таким образом, структура каталогов может выглядеть примерно так:

 project /
    package /
        __init__.py
        src /
            __init__.py
            stringbuilder.py
        tests / 
            __init__.py
            stringbuilder_test.py
    main.py
    test.py
  

test.py Скрипт может затем импортировать свои тесты следующим образом:

 from package.tests import stringbuilder_test
  

И stringbuilder_test.py можно импортировать src модули следующим образом:

 from package.src import stringbuilder
  

Ответ №2:

 from folder import my_module
  

Если в __init__.py файле есть. folder

Комментарии:

1. Это не удалось, он сказал, что нет модуля с именем folder.

2. Э, я думаю, вы должны были заменить folder на имя вашей папки!

Ответ №3:

Добавьте эту папку в свою PATH .

Комментарии:

1. Добавление его в PYTHONPATH немного менее ужасно, но упускает суть вопроса. Добавление в PATH не поможет ни в малейшей степени.