Я немного осмотрелся, но не могу решить эту проблему, которая у меня есть. Я хотел бы выполнить скрипт Python в представлении моего приложения Django. Я поместил код, который хотел бы выполнить, в команду управления django, чтобы он был доступен через командную строку python manage.py command-name
. Затем я попытался запустить эту команду, используя subprocess.Popen("python manage.py command-name",shell=True)
.
Однако выполнение этой команды может занять некоторое время, поэтому я бы хотел, чтобы представление продолжалось и позволяло сценарию выполняться в фоновом режиме. Использование subprocess.Popen, по-видимому, приводит к зависанию представления до завершения работы скрипта, поэтому я попытался использовать поток (следующий другой SA вопрос):
class SubprocessThread(threading.Thread):
def __init__(self, c):
self.command = c
self.stdout = None
self.stderr = None
threading.Thread.__init__(self)
def run(self):
p = subprocess.Popen(self.command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = p.communicate()
и затем выполнить его:
t = SubprocessThread("python manage.py command-name")
t.setDaemon(True)
t.start()
t.join()
Однако представление по-прежнему зависает: курсор имеет символ «занято», а AJAX на странице не загружается. В противном случае HTML-код страницы, кажется, загружается нормально, а команды в представлении после вызова потока появляются нормально завершенными (до завершения сценария). Может кто-нибудь, пожалуйста, помогите мне? Я бы хотел, чтобы скрипт выполнялся и выполнял свои функции, не задерживая просмотр или вызовы AJAX на странице.