Ошибка пути пользовательского регистратора Python в зависимости от пути к файлу, в котором он используется

#python #python-3.x #selenium #path #pytest

Вопрос:

У меня есть собственный регистратор. Он создает файл в папке журналов. Это часть кода

 curr_time = time.strftime("%Y-%m-%d")
log_file_name = '../Logs/log'   curr_time   '.log'
 

У меня есть папка «Тесты», в которой я создаю тестовые случаи и использую ведение журнала в этих тестовых случаях. Все работает нормально для тестов, которые находятся в папке «Тесты»

Проблема возникает, когда я создаю тесты во вложенных папках в разделе Тесты

FileNotFoundError: [Ошибка 2] Такого файла или каталога нет:

Это моя иерархия папок

селен

ПОМ

Конфигурация

Бревна

Страницы

Тесты

Служебные программы

Я предполагаю, что это из-за пути к папке, потому что, когда я изменяю «../Журналы/журнал » на «../../Журналы/журнал», код начинает работать для тестов вложенных папок и выдает сообщение об ошибке для тестов, которые находятся в основной папке тестов

Это пользовательский файл регистратора

 import inspect
import logging
import logging.config
import time


def custom_logger(log_level=logging.DEBUG):
    logger_name = inspect.stack()[1][3]
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)

    curr_time = time.strftime("%Y-%m-%d")
    log_file_name = '../Logs/log'   curr_time   '.log'

    file_handler = logging.FileHandler(log_file_name.format(logger_name), mode='a')
    file_handler.setLevel(log_level)

    formatter = logging.Formatter('%(asctime)s - %(filename)s:[%(lineno)s] - %(name)s - %(levelname)s: %(message)s',
                                  datefmt='%m/%d/%Y %I:%M:%S %p')
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)

    return logger

 

Комментарии:

1. если вы хотите, чтобы журналы были привязаны к местоположению кода , почему бы не использовать __file__ их для построения пути?

2. Спасибо @2e0byo, после некоторой борьбы я нашел частичное решение своей проблемы. Пожалуйста, посмотрите мой ответ, если вам интересно.

Ответ №1:

Я смог частично решить проблему с помощью этого решения

 curr_time = time.strftime("%Y-%m-%d")
path = Path(__file__).parent.absolute().joinpath('Logs')
log_file_name = str(path)   '/log'   curr_time   '.log'
 

Проблема с этим заключается в том, что он создает файлы журналов в разделе Утилиты/Журналы (потому что custom_logger.py находится в папке утилиты), в то время как я хотел, чтобы они были созданы в папке корня проекта /журналов

os.chdir не помог, так как в зависимости от того, в какой папке выполняется тест, он неправильно изменит каталог.

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

Комментарии:

1. Если я правильно понимаю вашу иерархию, почему бы просто Path(__file__).parent.parent / f"Logs/log{current_time}.log" не ?

2. Я не знаю, почему и как, но это решило мою проблему, большое вам спасибо! log_file_name = f"{Path(__file__).parent.parent}/Logs/log{current_time}.log"