Вы пытались использовать метод Popen.Poll (). Вы могли бы просто сделать это:
p = subprocess.Popen("subprocess",
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE)
time.sleep(SECONDS_TO_WAIT)
retcode = p.poll()
if retcode is not None:
# process has terminated
Это заставит вас всегда ждать 10 секунд, но если случай неудачи будет редким, он будет амортизироваться во всех случаях успеха.
Edit:
Как насчет:
t_nought = time.time()
seconds_passed = 0
while(p.poll() is not None and seconds_passed < 10):
seconds_passed = time.time() - t_nought
if seconds_passed >= 10:
#TIMED OUT
Уродливое ожидание занято, но я думаю, что оно выполняет то, что вы хотите.
Дополнительно, снова просматривая документацию по выбору вызовов, я думаю, что вы можете изменить ее следующим образом:
SECONDS_TO_WAIT = 10
select.select([p.stderr],
[],
[p.stdout, p.stderr],
SECONDS_TO_WAIT)
Поскольку вы обычно хотите читать из stderr, вы хотите знать, когда у него есть что-то доступное для чтения (т. Е. Случай сбоя).
Надеюсь, это поможет.