2016-11-08 3 views
0

Я выполняю скрипт оболочки, который запускает процесс с опцией фона &. Сценарий оболочки вызывается из скрипта python, который висит.subprocess popen Python

Shell скрипт:

test -f filename -d & 

питон файл

cmd =["shellscript","restart"] 
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, stdin=subprocess.PIPE, **kwargs) 
pid = proc.pid 
out, err = proc.communicate() 
returncode = proc.poll() 

файл Python зависает, и он не будет возвращаться из процесса питона. Также процесс python является автоматизированным.

+0

Что такое "cmd"? – Hannu

+0

cmd - это только список [ restart]. – Shriram

+1

'test -f filename -d &' не похож на действительную команду, по крайней мере, если 'test' является стандартным двоичным стандартом posix или встроенной оболочкой. Это просто место для чего-то еще? – mata

ответ

0

Запятая отсутствует в вашем списке cmd:

cmd =["shellscript", "restart"] 
+0

извините, что моя ошибка. Но сценарий оболочки запускает процесс с опцией в качестве фона, который запускается с помощью python. – Shriram

1

Вызов proc.communicate() будет блокировать до тех пор, трубы, используемые для stderr и stdout закрыты. Если ваш сценарий оболочки порождает дочерний процесс, который наследует эти каналы, то он выйдет только после того, как этот процесс также завершит свои концы записи в трубах или выйдет из него.

Чтобы решить эту проблему можно либо

  • перенаправлять вывод запущенного подпроцесса к /dev/null или файл_журналу в сценарии оболочки, например:
    subprocess_to_start >/dev/null 2>&1 &
  • использования subprocess.DEVNULL или открытый файловый объект для stderr и stdout в вашем скрипте python и оставьте вызов communicate(), если вам не нужен вывод «shellscript» в python