Как импортировать модуль из папки рядом с текущей папкой? - PullRequest
9 голосов
/ 04 ноября 2011

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

У меня есть папка test с юнит-тестами, и мне нужно импортировать модуль, который я хочу протестировать. Модули находятся в папке с именем '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

Ответы [ 3 ]

4 голосов
/ 05 ноября 2011

Если сценарии выполняются изнутри пакета, то для правильной работы импорта необходимо использовать различные хаки. Вероятно, наиболее распространенным из них является манипулирование 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
0 голосов
/ 04 ноября 2011
from folder import my_module

Если в folder.

есть файл __init__.py.
0 голосов
/ 04 ноября 2011

Добавить эту папку в PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...