Исключение Python popen для cwd во время запроса колбы

#python #flask #popen

Вопрос:

Существует два основных шага:
Первая — это конечная точка колбы:

 @app.route('/updater/client', methods=['GET'])
def update_client():
    try:
        return _update(request, Unit.CLIENT)
    except:
        sv_exceptions.get_and_log_exception_info()
        return Response(status=BAD_REQUEST)
 

_update() Метод «тяжелый». Он проверяет репозиторий github, делает различия между двумя версиями, формирует zip-архив и отправляет его обратно в качестве ответа. Это может занять некоторое время.
Проблема в том, что существует один из шагов, который находит последнюю версию в репозитории с помощью popen:

 def get_latest_version(unit: Unit):
    repository_path = unit.repository_path
    branch = unit.branch

    print(f'repository_path: {repository_path}')
    try:
        with subprocess.Popen(["git", "rev-parse", branch],
                              cwd=r'{}'.format(repository_path),
                              universal_newlines=True,
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE) as p:
            for line in p.stdout:
                return line.rstrip('rn')
    
    except Exception as e:
        print(f'Exception in popen: {e}')
    return None
 

Все в порядке, когда первый запрос заканчивается до второго запроса:

 repository_path: ./../../../client-repository
127.0.0.1 - - [02/Sep/2021 13:04:44] "GET /updater/client?os=windowsamp;version=e7369fc9 HTTP/1.1" 200 -
repository_path: ./../../../client-repository
127.0.0.1 - - [02/Sep/2021 13:04:46] "GET /updater/client?os=linuxamp;version=e7369fc9 HTTP/1.1" 200 -
 

И исключение, когда один из запросов начинается до завершения второго

 repository_path: ./../../../client-repository
127.0.0.1 - - [02/Sep/2021 13:04:49] "GET /updater/client?os=windowsamp;version=e7369fc9 HTTP/1.1" 400 -
repository_path: ./../../../client-repository
Exception in popen: [Errno 2] No such file or directory: './../../../client-repository'
expected str, bytes or os.PathLike object, not NoneType
127.0.0.1 - - [02/Sep/2021 13:04:50] "GET /updater/client?os=linuxamp;version=e7369fc9 HTTP/1.1" 200 -
 

Как вы можете видеть repository_path , это всегда присутствует, но во втором случае оно падает вместе с No such file or directory .
Я не понимаю, почему это происходит.

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

1. почему бы вам не использовать git-клиент, например gitpython.readthedocs.io/en/stable/intro.html ?

2. @balderman в GitPython порядке. Выполнение native git via popen кажется мне тоже подходящим. Я предполагаю, что проблема с cwd этим не связана сама git по себе.

Ответ №1:

Отвечаю на свой собственный вопрос:

Это работает, когда я заменяю относительный путь ./../../../client-repository абсолютным путем /home/user/client-repository .
Я могу ошибаться, но я предполагаю, что из-за параллелизма Popen пытается применить cwd еще раз, когда он уже находится в папке с предыдущего выполнения.