2014-09-23 2 views
0

나는 실행중인 .jar 파일이 Popen을 통해 있습니다. 이 서버는 시작하는 데 약 4 초가 걸리고 터미널에서 "Server Started"를 덤프 한 다음 사용자가 터미널을 종료 할 때까지 실행됩니다. 그러나 printwebbrowser.openPopen 때문에 즉시 실행되며 call을 사용하면 절대 실행되지 않습니다. wait을 사용하지 않고 서버를 시작해야만 printwebbrowser이 실행되지 않도록 할 수 있습니까? 서버에 대한 grep이 시작되었을 수 있습니까?Python에서 명령 순서 보장

from subprocess import Popen 
import glob 
import sys 
import webbrowser 

reasoner = glob.glob("reasoner*.jar") 

reasoner = reasoner.pop() 

port = str(input("Enter connection port: ")) 
space = "" 
portArg = ("-p", port) 
portArg = space.join(portArg) 

print "Navigate to the Reasoner at http://locahost:" + port 

reasoner_process = Popen(["java", "-jar", reasoner, "-i", "0.0.0.0", portArg, "--dbconnect", "jdbc:h2:tcp://localhost//tmp/UXDemo;user=sa;password=admin"]) 

# I want the following to execute after the .jar process above 

print "Opening http://locahost:" + port + "..." 
webbrowser.open("http://locahost:" + port) 

답변

2

당신이하려는 것은 CLI 응용 프로그램과 상호 작용하는 매우 단순하고 특별한 버전입니다. 따라서 두 가지 옵션이 있습니다.

먼저 거의 모든 CLI 응용 프로그램을 처리 할 수 ​​있도록 설계된 pexpect과 같은 라이브러리를 사용할 수 있습니다. 잔인한 학습 곡선이있을 수 있지만 기본 사항을 얻으면 문제가 간단 해집니다. JAR을 실행하고 "서버 시작"을 차단 한 다음 닫습니다.

또는 Popen 파이프를 사용하여 수동으로 수행 할 수 있습니다. 일반적으로 이것은 많은 문제를 가지고 있지만, 정확히 128 바이트에 맞는 하나의 결과가 나오면 그 출력을 차단하고 파이프를 닫고 싶지는 않습니다. 아무 문제도 발생하지 않습니다. 쪽으로. 따라서 :

reasoner_process = Popen(args, stdout=PIPE) 
line = reasoner_process.stdout.readline() 
if line.strip() != 'Server Started': 
    # error handling 

# Any code that you want to do while the server is running goes here 

reasoner_process.stdout.close() 
reasoner_process.kill() 
reasoner_process.wait() 

하지만 실제로 먼저 죽여야합니다. 종종 파이프를 폐쇄하는 것은 또한 0

가 아니라면이 경우 당신은 당신이 아마 with contextlib.closing(…)하려면, 당신은 또한 종료 코드를 확인하고 제기 할 수있는 경우에 kill()을 생략한다 수, 충분한이든 적절한이다 또는 try/finally을 사용하여 오류 처리 예외를 발생시키고 자식 유출을 방지 할 수 있는지 확인하십시오. (파이프와 Popen 자체가 컨텍스트 관리자로 사용 가능하다는 점을 보장하기 때문에 Python 3.2+는 훨씬 더 간단합니다.)

마지막으로, 사용자가 터미널을 종료 할 때까지 실행된다고 가정하고있었습니다. 시작하기를 기다린 다음 다른 물건을 실행하는 동안 계속 실행 한 다음 죽이십시오. 워크 플로가 다른 경우 분명히 작업 순서를 변경해야합니다.