Python popen 명령. 명령이 끝날 때까지 기다리십시오


79

popen 셸 명령으로 시작하는 스크립트가 있습니다. 문제는 스크립트가 popen 명령이 완료 될 때까지 기다리지 않고 바로 이동이 계속된다는 것입니다.

om_points = os.popen(command, "w")
.....

쉘 명령이 완료 될 때까지 기다리도록 Python 스크립트에 어떻게 알릴 수 있습니까?

답변:


112

스크립트 작업 방식에 따라 두 가지 옵션이 있습니다. 명령을 차단하고 실행 중에는 아무 작업도하지 않으려면 subprocess.call.

#start and block until done
subprocess.call([data["om_points"], ">", diz['d']+"/points.xml"])

실행 중에 작업을 수행하거나에 항목을 공급 하려면 호출 후에 stdin사용할 수 있습니다 .communicatepopen

#start and process things, then wait
p = subprocess.Popen([data["om_points"], ">", diz['d']+"/points.xml"])
print "Happens while running"
p.communicate() #now wait plus that you can send commands to process

문서에 명시된대로 wait교착 상태가 될 수 있으므로 통신하는 것이 좋습니다.



많은 답변에서 하위 프로세스가 선호되지만 명령 내에서 공간과 할당량을 잘 처리 할 수 ​​없습니다. 위의 답변은 os.popen 질문을 직접 해결하지 않습니다.
Chang

서브 프로세스는 OS 시스템보다 느리게 배까지 될 수 있습니다 - bugs.python.org/issue37790
MonsieurBeilto

subprocess.run()파이썬 3.5에서 추가되었다 "서브 프로세스를 호출에 권장되는 방법"입니다
LoMaPh

29

subprocess이것을 달성하기 위해 사용할 수 있습니다 .

import subprocess

#This command could have multiple commands separated by a new line \n
some_command = "export PATH=$PATH://server.sample.mo/app/bin \n customupload abc.txt"

p = subprocess.Popen(some_command, stdout=subprocess.PIPE, shell=True)

(output, err) = p.communicate()  

#This makes the wait possible
p_status = p.wait()

#This will give you the output of the command being executed
print "Command output: " + output

서브 프로세스는 OS 시스템보다 느리게 배까지 될 수 있습니다 - bugs.python.org/issue37790
MonsieurBeilto

12

다음을 수행 popen하여 모든 출력을 읽을 때까지 계속하지 않습니다.

os.popen(command).read()

2
저는 파이썬 전문가는 아니지만 이것은 원본 코드를 가장 적게 수정하는 가장 간단한 솔루션 인 것 같습니다. 이것이 좋은 해결책이 아닌 이유는 무엇입니까?
jdmcnair

7

전달하려는 명령을

os.system('x')

그런 다음 진술로 은밀하게

t = os.system('x')

이제 파이썬은 변수에 할당 될 수 있도록 명령 줄에서 출력을 기다릴 것 t입니다.


4

당신이 찾고있는 것은 wait방법입니다.


하지만 다음과 같이 입력하면 om_points = os.popen (data [ "om_points"] + ">"+ diz [ 'd'] + "/ points.xml", "w"). wait ()이 오류가 나타납니다. Traceback (최근 호출 마지막) : 파일 "./model_job.py", 77 행, <module> om_points = os.popen (data [ "om_points"] + ">"+ diz [ 'd'] + "/ points .xml ","w "). wait () AttributeError : 'file'개체에 'wait'속성이 없습니다. 문제가 무엇입니까? 다시 한 번 감사드립니다.
michele

12
내가 제공 한 링크를 클릭하지 않았습니다. 클래스 wait의 방법입니다 subprocess.
Olivier Verdier

1
프로세스가 stdout에 쓰고 아무도 읽지 않으면 wait가 교착 상태가 될 수 있습니다.
ansgri

서브 프로세스는 OS 시스템보다 느리게 배까지 될 수 있습니다 - bugs.python.org/issue37790
MonsieurBeilto

2

wait () 잘 작동합니다. 하위 프로세스 p1, p2 및 p3은 동시에 실행됩니다. 따라서 모든 프로세스는 3 초 후에 완료됩니다.

import subprocess

processes = []

p1 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)
p2 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)
p3 = subprocess.Popen("sleep 3", stdout=subprocess.PIPE, shell=True)

processes.append(p1)
processes.append(p2)
processes.append(p3)

for p in processes:
    if p.wait() != 0:
        print("There was an error")

print("all processed finished")

서브 프로세스는 OS 시스템보다 느리게 배까지 될 수 있습니다 - bugs.python.org/issue37790
MonsieurBeilto

0

나는 process.communicate ()가 작은 크기의 출력에 적합하다고 생각합니다. 더 큰 출력의 경우 최선의 접근 방식이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.