Python: как импортировать пользовательский модуль

Я только начинаю с Python и имею больше опыта работы с C#\Java. Так что у меня болит голова, как мне импортировать мои модули Python в другой пользовательский модуль? Я уже пробовал пару вещей:

ТАК: Python не может найти мой модуль

ТАК: не могу импортировать свои собственные модули

SO: Ошибка импорта: модуль не назван при импорте моего собственного модуля < /а>

и еще несколько, но обычно мне предлагают использовать относительный импорт (используя соответствующее количество . перед оператором импорта). Мне это кажется хрупким, потому что, насколько мне известно, импорт является относительным и разрешается в зависимости от того, где был выполнен file.py.

Итак, вот структура моего проекта в PyCharm:

Project
├───lib
│    ├───__init__.py
│    ├───pages
│    │   ├───__init__.py
│    │   ├───pageA.py
│    │   └───pageB.py
│    └───actions
│        ├───__init__.py
│        ├───actionA.py
│        └───actionB.py
├───tests
│    ├───__init__.py
│    ├───base_test.py
│    └───search_test.py
└───main.py

В моем search_test.py я импортирую модуль from lib.actions.actionA import ActionA, в actionA.py я импортирую модуль типа from lib.pages.pageA import PageA. А вот мой main.py:

import unittest
from tests.search_test import SearchTest

def create_test_suite():
    test_suite = unittest.TestSuite()
    test_suite.addTest(SearchTest())
    return test_suite


if __name__ == 'main':
    suite = create_test_suite()
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

Когда я запускаю это в PyCharm, он работает отлично. Но теперь мне нужно запустить его из консоли:

D:\Projects\Python Projects> python -m unittest project_name.main

и я стою перед ImportError: no module named 'lib'. С этим:

D:\Projects\Python Projects\project_name> python main.py

Ничего не произошло.

Что я могу сделать? Должен ли я придерживаться относительного шаблона или есть импорт каких-то Java-подобных пакетов?

в вашем файле search_test.py import os import sys sys.path.append(os.path.join(os.path.dirname(file),’../’)) из lib.actions. actionA импортирует ActionA, а затем вы можете запускать его из любого каталога.   —  person Amrait Dalerian    schedule 18.12.2020

См. также:  Шаблон фабрики приложений WSGI и время импорта созданных объектов уровня модуля

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Amrait Dalerian

    Думаю вместо python -m unittest project_name.main надо перейти в папку имя_проекта и там запустить python -m unittest main

    Спасибо за ваше обновление, но нет, оно тоже не работает. Я смогу предоставить более подробную информацию об этом позже, но, если мне не изменяет память, там написано cannot find main module или main is not a module, если я правильно помню. person Amrait Dalerian; 12.10.2017

    Вы уверены, что перешли в папку вашего проекта cd project_name? Довольно странно, если main не найден. person Amrait Dalerian; 13.10.2017

    На самом деле, вы правы. Он жаловался на то, что SearchTest не имеет атрибута runTest, но не на ошибку, которую я сказал. Моя вина. Я изменил main.py, как было предложено здесь, и это сработало как ожидал. Теперь мне нужно исправить пути к внешним данным, и все будет в порядке. person Amrait Dalerian; 13.10.2017

  2. Amrait Dalerian

    Когда вы видите ImportError, это означает, что Python не находит ваш модуль. Итак, где он ищет модули?

    Вероятно, ваш рабочий каталог PyCharm подходит для вашего проекта. Но когда вы запускаете его из командной строки, Python ищет модули в текущем каталоге и в переменной env PYTHONPATH. Эта переменная env преобразуется в список, который вы можете проверить с помощью

    import os
    print os.sys.path
    

    Убедитесь, что ваш проект находится в этом пути, и если нет, добавьте его каталог в переменную PYTHONPATH env. Вы можете проверить этот ответ в инструкции, как это сделать.

    Кроме того, вы можете обновить переменную env через командную строку, как здесь

    Спасибо за предложение, но что произойдет, если я отправлю этот проект на другую машину? Кажется, мне нужно будет повторить процесс установки переменной PYTHONPATH еще раз, не так ли? person Amrait Dalerian; 12.10.2017

    В конце концов вам нужно будет указать Python, где находится библиотека. Или используйте пакеты и отправляйте пакеты вместо отдельных скриптов/библиотек. person Amrait Dalerian; 12.10.2017

    Это интересно. Вы имеете в виду отправку всего проекта в виде единого пакета? person Amrait Dalerian; 12.10.2017

    да. Добавьте еще одну иерархию с папкой и выполните относительный импорт в свой проект person Amrait Dalerian; 13.10.2017

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: