web.py + subprocess = завис - PullRequest
       26

web.py + subprocess = завис

2 голосов
/ 17 февраля 2011

Вот мой основной файл:

import subprocess, time

pipe = subprocess.PIPE
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe)
time.sleep(3)

А вот test_web_app.py:

import web

class Handler:
  def GET(self):  pass
app = web.application(['/', 'Handler'], globals())
app.run()

Когда я запускаю основной файл, программа запускается, но процесс зомби остается висеть, и мне приходится убивать его вручную. Почему это? Как я могу заставить Попена умереть, когда программа заканчивается? Popen только зависает, если я передаю стандартный вывод и немного сплю, прежде чем программа завершится.

Правка - вот окончательная рабочая версия основного файла:

import subprocess, time, atexit

pipe = subprocess.PIPE
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe)

def kill_app():
  popen.kill()
  popen.wait()
atexit.register(kill_app)

time.sleep(3)

Ответы [ 2 ]

2 голосов
/ 17 февраля 2011

Вы не ожидаете редактирования процесса.Как только это будет сделано, вы должны позвонить popen.wait.

Вы можете проверить, завершен ли процесс, используя метод poll объекта popen, чтобы увидеть, завершился ли он.

Если вам не нужен стандартный вывод процесса веб-сервера, вы можете просто проигнорировать параметр стандартный вывод.


Вы можете использовать модуль atexit для реализации ловушки, которая вызывается при выходе из основного файла.Для этого следует использовать метод kill объекта Popen, а затем wait, чтобы убедиться, что он завершен.

1 голос
/ 17 февраля 2011

Если ваш основной скрипт не должен делать что-то еще, пока выполняется подпроцесс, я бы сделал:

import subprocess, time

pipe = subprocess.PIPE
popen = subprocess.Popen('pythonw -uB test_web_app.py', stdout=pipe, stderr=pipe)
out, err = popen.communicate()

(Я думаю, что если вы специально передаете стандартный вывод обратно в свою программу, вам нужно в какой-то момент прочитать его, чтобы избежать создания процессов-зомби - программа Communication прочтет его достаточно безопасным способом).

Или, если вам не нужен синтаксический анализ stdout / stderr, не беспокойтесь об этом:

popen = subprocess.Popen('pythonw -uB test_web_app.py')
popen.communicate()
...