Как я могу выполнить внешнюю команду асинхронно из Python?

Единственная поверхность, которую можно восстановить из триангуляции Делоне, - это выпуклая оболочка. Возможно, вас больше заинтересует алгоритм восстановления поверхности, такой как , этот (для близкой модели, с созданием новых узлов) или , чем один (для открытых моделей, использующих только входные точки). [112 ]

99
задан Community 23 May 2017 в 10:31
поделиться

6 ответов

подпроцесс. Popen делает точно, что Вы хотите.

from subprocess import Popen
p = Popen(['watch', 'ls']) # something long running
# ... do other stuff while subprocess is running
p.terminate()

(Редактирование для завершения ответа из комментариев)

экземпляр Popen может сделать, различные другие вещи как Вы могут poll() это, чтобы видеть, работает ли это все еще, и Вы можете communicate() с ним, чтобы отправить ему данные по stdin и ожидать его для завершения.

119
ответ дан Ali Afshar 24 November 2019 в 05:03
поделиться

Если Вы хотите выполнить много процессов параллельно и затем обработать их, когда они приводят к результатам, можно использовать опрос как в следующем:

from subprocess import Popen, PIPE
import time

running_procs = [
    Popen(['/usr/bin/my_cmd', '-i %s' % path], stdout=PIPE, stderr=PIPE)
    for path in '/tmp/file0 /tmp/file1 /tmp/file2'.split()]

while running_procs:
    for proc in running_procs:
        retcode = proc.poll()
        if retcode is not None: # Process finished.
            running_procs.remove(proc)
            break
        else: # No process is done, wait a bit and check again.
            time.sleep(.1)
            continue

    # Here, `proc` has finished with return code `retcode`
    if retcode != 0:
        """Error handling."""
    handle_results(proc.stdout)

поток управления там является немного замысловатым, потому что я пытаюсь сделать его маленьким - можно осуществить рефакторинг к вкусу.:-)

Это имеет преимущество обслуживания запросов раннего окончания сначала. , Если Вы звоните communicate на первом рабочем процессе и это, оказывается, выполняет самое длинное, другие рабочие процессы будут там находиться в неактивном состоянии, когда Вы, возможно, обрабатывали их результаты.

44
ответ дан yizzlez 24 November 2019 в 05:03
поделиться

то, Что я задаюсь вопросом, - то, если это [os.system ()] надлежащий путь должно выполнить такую вещь?

os.system() не является надлежащим путем. Вот почему все говорят для использования subprocess.

Для получения дополнительной информации читавший http://docs.python.org/library/os.html#os.system

модуль подпроцесса предоставляет более мощные средства для порождения новых процессов и получения их результатов; использование того модуля предпочтительно для использования этой функции. Используйте модуль подпроцесса. Проверьте особенно Заменяющие Более старые Функции с разделом Module подпроцесса.

10
ответ дан S.Lott 24 November 2019 в 05:03
поделиться

Я имел хороший успех с модуль asyncproc , который имеет дело приятно с выводом от процессов. Например:

import os
from asynproc import Process
myProc = Process("myprogram.app")

while True:
    # check to see if process has ended
    poll = myProc.wait(os.WNOHANG)
    if poll is not None:
        break
    # print any new output
    out = myProc.read()
    if out != "":
        print out
7
ответ дан Noah 24 November 2019 в 05:03
поделиться

У меня такая же проблема при попытке подключиться к терминалу 3270 с помощью программного обеспечения сценариев s3270 на Python. Теперь я решаю проблему с подклассом Process, который я нашел здесь:

http://code.activestate.com/recipes/440554/

А вот образец, взятый из файла:

def recv_some(p, t=.1, e=1, tr=5, stderr=0):
    if tr < 1:
        tr = 1
    x = time.time()+t
    y = []
    r = ''
    pr = p.recv
    if stderr:
        pr = p.recv_err
    while time.time() < x or r:
        r = pr()
        if r is None:
            if e:
                raise Exception(message)
            else:
                break
        elif r:
            y.append(r)
        else:
            time.sleep(max((x-time.time())/tr, 0))
    return ''.join(y)

def send_all(p, data):
    while len(data):
        sent = p.send(data)
        if sent is None:
            raise Exception(message)
        data = buffer(data, sent)

if __name__ == '__main__':
    if sys.platform == 'win32':
        shell, commands, tail = ('cmd', ('dir /w', 'echo HELLO WORLD'), '\r\n')
    else:
        shell, commands, tail = ('sh', ('ls', 'echo HELLO WORLD'), '\n')

    a = Popen(shell, stdin=PIPE, stdout=PIPE)
    print recv_some(a),
    for cmd in commands:
        send_all(a, cmd + tail)
        print recv_some(a),
    send_all(a, 'exit' + tail)
    print recv_some(a, e=0)
    a.wait()
3
ответ дан 24 November 2019 в 05:03
поделиться

Использование pexpect [ http://www.noah.org/wiki/Pexpect ] с неблокирующими строками чтения - еще один способ сделать это. Pexpect решает проблемы взаимоблокировки, позволяет вам легко запускать процессы в фоновом режиме и дает простые способы иметь обратные вызовы, когда ваш процесс выплевывает предопределенные строки, и, как правило, значительно упрощает взаимодействие с процессом.

6
ответ дан 24 November 2019 в 05:03
поделиться
Другие вопросы по тегам:

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