문제

I 을 실행해야 쉘이 명령어에서 비동기적으로 Python 스크립트입니다.이 뜻으로 나가려는 나의 Python 스크립트를 계속 실행되는 동안에 외부 명령이 꺼지고 모든 것을 관리 할 수 있습니다.

I read this post:

출 외부에서 명령 Python

나는 다음을 갔고 몇 가지 테스트,보 os.system() 일을 할 것입니다 제공하는 사용 & 의 끝에서 명령 그래서 나는 기다릴 필요가 없습니다.내가 무엇인지 궁금은 경우 이는 적절한 방법으로 달성하기 같은 것은?나 commands.call() 하지만 그것이 나를 위해 일하지 않기 때문에 그 블럭에는 외부 명령입니다.

알려주시기 바랍를 사용하는 경우 os.system() 이를 위해 권장하는 경우 시도해야하고 몇 가지 다른 경로입니다.

도움이 되었습니까?

해결책

하위 프로세스 .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에서 데이터를 보내고 종료 될 때까지 기다립니다.

다른 팁

실행하고 싶다면 많은 프로세스에 병행한 다음을 처리할 때 그들을 그들 결과를 얻을 수,당신이 사용할 수 있는 투표에서 같은 다음과 같다:

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 에 첫 번째 프로세스를 실행하고 그것을 실행하는 가장 긴 다른 프로세스를 실행하는 것이 앉아 있다가 유휴 상태 때 당신은 수 있었다 처리하는 그들의 결과입니다.

이 [os.system ()]이 그러한 일을 성취하는 올바른 방법이라면 궁금한 점은?

아니. os.system() 올바른 방법이 아닙니다. 그래서 모두가 사용하겠다고 말합니다 subprocess.

자세한 내용은 읽으십시오 http://docs.python.org/library/os.html#os.system

하위 프로세스 모듈은 새로운 프로세스를 산란하고 결과를 검색하기위한보다 강력한 시설을 제공합니다. 이 모듈을 사용하는 것이이 기능을 사용하는 것이 바람직합니다. 하위 프로세스 모듈을 사용하십시오. 특히 이전 기능을 하위 프로세스 모듈 섹션으로 바꾸는 것을 확인하십시오.

나는 좋은 성공을 거두었습니다 비동기 프로 프로세스의 출력을 잘 처리하는 모듈. 예를 들어:

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

pexpect 사용 [ http://www.noah.org/wiki/pexpect ] 비 블로킹 레드 라인을 사용하면이 작업을 수행하는 또 다른 방법입니다. Pexpect는 교착 상태 문제를 해결하고 백그라운드에서 프로세스를 쉽게 실행할 수 있으며 프로세스가 사전 정의 된 문자열을 뱉어 내고 일반적으로 프로세스와 훨씬 더 쉽게 상호 작용할 때 쉽게 콜백을 할 수있는 방법을 제공합니다.

Python의 S3270 스크립팅 소프트웨어를 사용하여 3270 터미널에 연결하는 것도 동일한 문제가 있습니다. 이제 여기에서 찾은 프로세스의 서브 클래스로 문제를 해결하고 있습니다.

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()

"돌아올 때까지 기다릴 필요가 없다"고 생각하면 가장 쉬운 솔루션 중 하나는 다음과 같습니다.

subprocess.Popen( \
    [path_to_executable, arg1, arg2, ... argN],
    creationflags = subprocess.CREATE_NEW_CONSOLE,
).pid

그러나 ... 내가 읽은 내용에서 이것은 보안 위험 때문에 "그러한 일을 성취하는 올바른 방법"이 아닙니다. subprocess.CREATE_NEW_CONSOLE 깃발.

여기서 일어나는 주요 일은 사용하는 것입니다 subprocess.CREATE_NEW_CONSOLE 새 콘솔을 만들려면 .pid (원하는 경우 나중에 프로그램을 확인할 수 있도록 프로세스 ID를 반환합니다.) 작업을 마치기 위해 프로그램을 기다리지 않도록하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top