Кажется, что функция wait () подпроцесса не ожидает завершения подпроцесса - PullRequest
0 голосов
/ 17 июня 2011

Я пытаюсь запустить скрипт php с модулем подпроцесса python.

proc = subprocess.Popen(['php', '-f', test.php], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

retCode = proc.wait

print retCode

val = float(kprocess.stdout.read())

return val

Я также пробовал:

proc = subprocess.Popen(['php', '-f', test.php], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

val = float(kprocess.communicate()[0])

return val

Оба способа работают локально, когда я просто запускаю егооднако в интерпретаторе python, когда я пытаюсь запустить его на реальном сервере, я всегда получаю «ValueError at / empty string for float ()».Это приводит меня к мысли, что процесс как-то не ждет.Чего мне не хватает?

РЕДАКТИРОВАТЬ: Я использую Django, так что, кажется, он ломается только при запуске с Django.

1 Ответ

5 голосов
/ 17 июня 2011

Вы должны вызвать функцию wait процессов:

proc = subprocess.Popen(...)
retCode = proc.wait # retCode will be the function wait
retCode = proc.wait() # retCode will be the return code

Однако, поскольку вы перенаправляете вывод в, вы должны учитывать предупреждение в wait документах и ​​использовать communicate. Убедитесь, что в вашем коде нет синтаксических ошибок:

  • test.php, вероятно, не имя переменной, а строка
  • Вы путаете два имени переменных, proc и kprocess
  • Вы вслепую анализируете результат communicate (Это не является строго ошибкой, но может помешать обнаружению и отслеживанию ошибок)

Вместо этого я бы предложил:

proc = subprocess.Popen(['php', '-f', 'test.php'],
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout,stderr = proc.communicate()
if proc.returncode != 0:
    raise Exception('Test error: ' + stderr)
return float(stdout)
...