python. импорт модулей в проекте

Доброго времени суток,
столкнулся с проблемой импорта модулей в проекте:

структура проекта:

в evironment.py:


from cmw_behave.core.report_manager import ReportManager
from cmw_behave.core.web_driver_actions import WebDriverActions
from cmw_behave.core.web_elements_actions import WebElementAction


def before_all(context):

    context.web_driver_actions = WebDriverActions()
    context.web_element_actions = WebElementAction(context.web_driver_actions)    

def after_all(context):

    context.web_driver_actions.close()

def after_scenario(context, scenario):

    ReportManager().send_report(scenario.name, scenario.status, scenario.steps)

при запуске:

C:\Program Files (x86)\Python\Scripts>behave.exe C:\Users\someuser\Desktop\common_scripts\cmw_behave\test_environment\framework.feature

выдает ошибку:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python\Scripts\behave-script.py", line 9, in <module>
    load_entry_point('behave==1.2.3', 'console_scripts', 'behave')()
  File "C:\Program Files (x86)\Python\lib\site-packages\behave\__main__.py", line 111, in main
    failed = runner.run()
  File "C:\Program Files (x86)\Python\lib\site-packages\behave\runner.py", line 474, in run
    return self.run_with_paths()
  File "C:\Program Files (x86)\Python\lib\site-packages\behave\runner.py", line 477, in run_with_paths
    self.load_hooks()
  File "C:\Program Files (x86)\Python\lib\site-packages\behave\runner.py", line 437, in load_hooks
    exec_file(hooks_path, self.hooks)
  File "C:\Program Files (x86)\Python\lib\site-packages\behave\runner.py", line 281, in exec_file
    exec(code, globals, locals)
  File "..\..\..\Users\someuser\Desktop\common_scripts\cmw_behave\test_environment\environment.py", line 11, in <module>
    from cmw_behave.core.report_manager import ReportManager
ImportError: No module named 'cmw_behave'

если добавить перед импортом:

sys.path.append("C:\\Users\\someuser\\Desktop\\common_scripts")
from cmw_behave.core.report_manager import ReportManager
...

то запускается нормально, но выглядит это костыльно.

подскажите пожалуйста правильное решение.

Спасибо

Ну верно, потому что вашей директории нет в pythonpath и ее нужно туда добавить.

Лучше всего будет в файл пакета init.py положить добавления пути.

Как можно добавить?

Если структура не будет меняться, то через относительный пусть

import sys 
sys.path.append("..")  

но можно и вычислить программно

import sys, os 
sys.path.append(os.path.join(os.path.dirname(__file__), "..")) 

в общем, os.path вам в помощь, смотрите help.

пробовал добавлять __init__.py с представленным вами кодом в папки:

common_scripts
cmw_behave
test_environment

не один из вариантов не заработал… что то я делаю не так =)

файл инициализации пакета правильно называете? Если ничего не путаю (с питоном практически не работал) файл должен называться _init_.py

да, файлик

__init__.py

парсер съедает подчеркивания :slight_smile: (FF 24)

Надо просто код в строке указывать так, тогда все будет нормально

 bla bla text `__init__.py` bla bla text

Так вы тогда расскажите и покажите, что куда поставили.

Я код для примера показал, вам надо правильно сформировать относительный путь, т.е. от файла envionrments.py до выхода на папку common_scripts. Убедитесь, что относительный путь верный, ну и не забывайте вставлять код, который вы меняете и ошибку которая появляется.

import sys 
sys.path.append(r"..\..\..")

делал так:

в папку test_environment, рядом с файлом envionrment.py
создал файл

__init__.py

в него добавил код:

import sys
sys.path.append("C:\\Users\\username\\Desktop\\common_scripts")

но ошибка так и осталась:

C:\Program Files (x86)\Python\Scripts>behave.exe C:\Users\username\Desktop\common_scripts\cmw_behave\test_environment\framework.feature

File “…\Users\username\Desktop\common_scripts\cmw_behave\test_environment\environment.py”, line 12, in
from cmw_behave.core.report_manager import ReportManager
ImportError: No module named ‘cmw_behave’

Так не сработает, потому что если пойти в код behave, то можно увидеть такой код

runner.py 437 строка

    def load_hooks(self, filename='environment.py'):
        hooks_path = os.path.join(self.base_dir, filename)
        if os.path.exists(hooks_path):
            exec_file(hooks_path, self.hooks)

Тут видно, что загружается или импортируется не пакет и исполняется только файл. Соответственно в данном случае код в __init__.py не сработает. Его нужно указывать непосредственно в environment.py

Можно еще по другому, перед запуском добавить в системную переменную пусть C:\Users\username\Desktop\common_scripts\

C:\Program Files (x86)\Python\Scripts>behave.exe C:\Users\username\Desktop\common_scripts\cmw_behave\test_environment\framework.feature

Или же настроить запуск (создать batch файл например) тестов из папки C:\Users\username\Desktop\common_scripts\, тогда эта папка автоматически будет добавлена в pythonpath

ясненько, спасибо большое