Python: выполните процесс с тайм-аутом и получите stdout, stderr и статус выхода [дубликат]

Предполагая, что вы используете PostgreSQL, курсоры, вероятно, просто реализованы с использованием собственного API-интерфейса курсора базы данных. Возможно, вы захотите взглянуть на исходный код для pg8000 , чистого модуля DB-API Python PostgreSQL, чтобы увидеть, как он обрабатывает курсоры. Вы также можете посмотреть документацию PostgreSQL для курсоров .

8
задан Community 23 May 2017 в 12:13
поделиться

2 ответа

I hate doing the work by myself. Just copy this into your proc.py module.

import subprocess
import time
import sys

class Timeout(Exception):
    pass

def run(command, timeout=10):
    proc = subprocess.Popen(command, bufsize=0, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    poll_seconds = .250
    deadline = time.time()+timeout
    while time.time() < deadline and proc.poll() == None:
        time.sleep(poll_seconds)

    if proc.poll() == None:
        if float(sys.version[:3]) >= 2.6:
            proc.terminate()
        raise Timeout()

    stdout, stderr = proc.communicate()
    return stdout, stderr, proc.returncode

if __name__=="__main__":
    print run(["ls", "-l"])
    print run(["find", "/"], timeout=3) #should timeout
13
ответ дан 5 December 2019 в 06:38
поделиться

Обратите внимание на linux с coreutils> = 7.0, вы можете добавить таймаут к команде, например:

timeout 1 sleep 1000
12
ответ дан 5 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: