Я только начинаю с 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
Думаю вместо
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Когда вы видите
ImportError
, это означает, что Python не находит ваш модуль. Итак, где он ищет модули?Вероятно, ваш рабочий каталог PyCharm подходит для вашего проекта. Но когда вы запускаете его из командной строки, Python ищет модули в текущем каталоге и в переменной env
PYTHONPATH
. Эта переменная env преобразуется в список, который вы можете проверить с помощьюУбедитесь, что ваш проект находится в этом пути, и если нет, добавьте его каталог в переменную
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