2017-10-23 2 views
2

데이터베이스에서 쿼리하고 결과를 표시하는 스크립트 클래스가 있습니다. 문제는 내가 스크립트 아래에 하위 프로세스를 추가 할 때 스크립트가 중단되거나 기다리는 것이며 ctr-c로 끝나면 계속됩니다.(Python) 서브 프로세스 블로킹

예 : 그룹 B가 삭제되면 그룹 A가 실행됩니다. 그룹 B가 삭제되면 그룹 B가 실행됩니다.

#Group A 
queryStrings = ['SELECT top 100 * FROM myDb', 
'SELECT top 10 * FROM anotherDb'] 

## class that connects to db and output the content ## 
db = Database 
conn = db.connectToDb() 

for query in queryStrings: 
    db.runPreQueries(conn, query) 

conn.close 

##Group B 

if os.path.exists("DoSomething.vbs"): 
    p = subprocess.Popen("cscript DoSomething.vbs", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) 
    stdout, stderr = p.communicate() 

print("vbs completed") 

또한 subprocess.call을 사용하여 시도한 다음 종료합니다. 이것은 늘 걸어하지만 당신이 정말로 데이터베이스를 종료하지 않을 conn.close를 실행할 때 스크립트

p = subprocess.call("cscript DoSomething.vbs") 
p.terminate() 
+0

콘솔에서 실행할 때''cscript DoSomething.vbs "'무엇을합니까? 끝내나요? –

+0

예 종료합니다. 그 단순한 반향 – Led

+0

먼저''p = subprocess.Popen ([ "cscript", 'DoSomething.vbs "], stdout = subprocess.PIPE)'시도해 보겠습니다. 출력이 필요합니까? 입력을 전달해야합니까? ? –

답변

3

을 실행하지 않습니다. 당신이 함수를 호출하지 않기 때문에 아무것도하지 않습니다.

다음 호출은 데이터베이스 액세스를 기다리는 동안 차단 된 상태로 있습니다.

수정 :

conn.close() 

참고 (당신은 입력, 출력, ... 신경 쓰지 않기 때문에)는 이후에 프로세스를 실행하는 적절한 방법 :

subprocess.check_call(["cscript","DoSomething.vbs"]) 

이 의지 cscript이 0이 아닌 반환 코드를 반환하면 오류가 발생합니다. 이는 충분히 안전합니다. 데이터베이스 인터페이스는 아마 그 경우, 문맥 관리자를 지원

참고가 작성하는 더 나은 것 :이 경우

with db.connectToDb() as conn:  
    for query in queryStrings: 
     db.runPreQueries(conn, query) 

이 연결이 자동으로 종료됩니다 with 블록을 종료 할 때.