Возврат вывода subprocess.popen() на веб-сервереPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Возврат вывода subprocess.popen() на веб-сервере

Сообщение Anonymous »

У меня есть веб-сервер на Python, использующий Django. Я хочу иметь возможность запустить длительный асинхронный подпроцесс, а затем провести опрос клиента с помощью GET или POST и получить стандартный вывод, а также другую информацию. Для каждой итерации сервер будет возвращать строки стандартного вывода, которые у него есть на данный момент. Когда процесс завершится, будет возвращена дополнительная информация.
Как сохранить экземпляр cmd=subprocess.popen(), чтобы при последующем GET/POST он мог выполнять соответствующие вызовы (например, cmd.poll, cmd .stdout.readline() и т. д.
Я пробовал использовать диспетчер сеансов Django, но всплывающий объект не подлежит сериализации Json.
Обновить< /h1>
Как предложено в комментариях, вместо того, чтобы пытаться сохранить всплывающий объект, я просто продолжаю поток после возврата запроса и сохраняю строки стандартного вывода в сеансе.
Но у меня возникла проблема с обновлением объекта сеанса после того, как запрос уже вернулся. Кажется, он обновляется, но при следующем запросе объект сеанса не содержит ни одной записи, добавленной после завершения запроса.
Вот код (

Код: Выделить всё

views.py). Я использую
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
для указания сеансов на основе файлов cookie.

Код: Выделить всё

import threading
from os.path import expanduser

from rest_framework.decorators import api_view
from rest_framework.response import Response
import subprocess

# Separate thred to continue running our external task
def monitor_task(cmd, session):
print('running thread')
session['stdout'] = []
while True:
line = cmd.stdout.readline()
print('line: ', line.replace('\n', ''))
if not line:
print('breaking')
break
session['stdout'].append(line.replace('\n', ''))

print(session['stdout'])
print('task is ending')

@api_view(['GET'])
def run_ngen(request):
if request.method == 'GET':
cmd = subprocess.Popen([expanduser("~/testSpawn.sh"), "10"], shell=False, bufsize=-1,
encoding='utf-8',
stdout=subprocess.PIPE, stderr=subprocess.PIPE)

x = threading.Thread(target=monitor_task, args=(cmd, request.session,))
x.start()
return Response('request started')

@api_view(['GET'])
def get_output(request):
# GEt the output that was put into the session by monitor_task
print('session: ', request.session.items())
stdout = request.session['stdout']
print('There are', len(stdout), 'lines')

print(stdout)
return Response(stdout)

Я запускаю внешнюю программу

Код: Выделить всё

#!/bin/bash

sleep=5
if [ -n "$1" ]
then
sleep=$1
fi
echo line1
echo line2
echo an error 1>&2

echo Sleeping for $sleep seconds
sleep $sleep
echo line3
echo another error 1>&2
echo line4
Проблема, которую я вижу, заключается в том, что любые строки, добавленные в сеанс после первоначального возврата запроса, не появляются в сеансе позже
Поток, выполняющий внешнюю задачу, похоже, работает нормально и добавляет в сеанс все 5 строк.
[img]https://i.sstatic .net/pzIUTzsf.png[/img]

Однако, когда я нажимаю конечную точку get_output, которая должна возвращать содержимое стандартного вывода, отображаются только первые 3 строки ( перед сном)
Изображение


Подробнее здесь: https://stackoverflow.com/questions/785 ... -webserver
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Возврат вывода subprocess.popen() на веб-сервере
    Anonymous » » в форуме Python
    0 Ответы
    51 Просмотры
    Последнее сообщение Anonymous
  • Subprocess.Popen для «ssh sudo -u user -i» не работает с «sudo: извините, для запуска sudo у вас должен быть tty»
    Гость » » в форуме Python
    0 Ответы
    104 Просмотры
    Последнее сообщение Гость
  • Как устранить проблемы безопасности, отмеченные Bandit для использования subprocess.Popen() в Python?
    Anonymous » » в форуме Python
    0 Ответы
    78 Просмотры
    Последнее сообщение Anonymous
  • Как сериализовать subprocess.popen()
    Anonymous » » в форуме Python
    0 Ответы
    61 Просмотры
    Последнее сообщение Anonymous
  • Несколько входов в subprocess.Popen
    Anonymous » » в форуме Python
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»