#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 не поможет ни в малейшей степени.