#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
порядке. Выполнение nativegit
viapopen
кажется мне тоже подходящим. Я предполагаю, что проблема сcwd
этим не связана самаgit
по себе.
Ответ №1:
Отвечаю на свой собственный вопрос:
Это работает, когда я заменяю относительный путь ./../../../client-repository
абсолютным путем /home/user/client-repository
.
Я могу ошибаться, но я предполагаю, что из-за параллелизма Popen
пытается применить cwd
еще раз, когда он уже находится в папке с предыдущего выполнения.