2011-08-29 5 views
3

일부 Java 프로그램을 호출하는 스크립트를 작성하여 일부 작업을 수행합니다. 이전 작업이 완료된 경우에만 각 작업을 시작하는 것이 매우 중요합니다. 각 작업은 며칠 동안 실행되어 엄청난 양의 출력을 생성 할 수 있습니다. 그것은 거대한 데이터베이스에서 작동합니다subprocess.Popen을 사용하여 Java 프로그램을 호출하면 "주 클래스를 찾을 수 없습니다."동일한 호출이 os.system을 사용하여 작동합니다.

os.system()을 사용하여 스크립트를 실행하면 첫 번째 작업이 완료되지 않은 경우에도 첫 번째 작업이 몇 분 동안 실행 된 후 어떤 이유로 인해 두 번째 작업이 시작된다는 것을 알아 챘습니다. . 첫 번째 작업은 정상적으로 끝나지 않습니다. 갑자기 작동이 멈춘 것처럼 보입니다. 내가 처리하는 데 몇 분 밖에 걸리지 않는 작은 데이터베이스에서 시도해도 모든 것이 잘 동작한다.

왜 이런 식으로 행동하는지 이해할 수 없습니다!

이런 이유로 나는 프로세스의 끝까지 호출을 기다리기 위해()를 사용할 수 있도록 Popen()을 사용하려고했습니다.

어떤 이유로 외부 Java 프로그램을 호출하는 동일한 명령이 os.system()에서 작동하지만 Popen()을 사용하여 main()을 찾을 수 없다는 메시지가 나타납니다. 나는 상대 경로를 사용하고 있으며 운도없이 절대 경로를 시도했다.

Popen()에 대한 대안이 있습니까? 그러나 주 수업을 찾을 수없는 이유를 이해하지 못합니다. 외부 프로그램을 호출 할 때 os.system()과 Popen()의 차이점은 무엇입니까? 문제를 어떻게 해결할 수 있습니까?

import os 
from subprocess import Popen 

def doWork(): 

    owd = os.getcwd() 
    cmd = "java -Dfile.encoding=Cp1252 -classpath \"bin;lib\\mysql-connector-java-5.0.8-bin.jar;lib\\sqlitejdbc-v056.jar\" core.ODBManager" 
    os.chdir("ODBManager") 

    #this way does not work 
    p = Popen(cmd + "1", shell=True) #import 
    p.communicate() #now wait 

    p = Popen(cmd + "2", shell=True) #convert 
    p.communicate() #now wait 

    p = Popen(cmd + "3", shell=True) #export 
    p.communicate() #now wait 

    #this way works but does not wait the command to finish 
    #before starting another one 
# os.system(cmd+" 1") #import 
# os.system(cmd+" 2") #convert 
# os.system(cmd+" 3") #export 

    os.chdir(owd) 

가 감사 : 여기

는 코드입니다. 명확하지 않은 것이 있으면 언제든지 물어보십시오. 오후 8시 30 분 P.S. 자바 프로그램 (이클립스로 빌드)은 하위 폴더에 있으며 다른 하위 폴더에있는 파일에서 일부 입력을 읽으면 chdir과 함께 가야합니다. 그렇지 않으면 해당 파일을 찾을 수 없습니다.

답변

3

오타 (오타)가 아니라 설명하는대로 "작동하지 않습니다"라는 것이 확실하지 않은 경우 cmd와 연결된 "1", "2"및 "3"문자열 사이에는 공백이 없습니다. os.system 호출을 사용하면 공간이 생깁니다. 공간이 없으면 실행하려는 주 방법의 클래스 이름을 효과적으로 변경하기 때문에 오류가보고됩니다.

+0

그게 다야! 고맙습니다. 어리석은 실수를 저에게 부끄러워하십시오. 그것은 현재 Popen과 실제로 작동합니다. 나는 그 공간을 놓치고 있었다. 이제 다음 작업을 시작하기 전에 각 작업이 실제로 실행되기를 기다리는 지 테스트해야합니다. – Danny

+0

그 소리가 들리니 문제가 해결되면 내 대답을 승인 된 것으로 표시 할 수 있습니다. –

+0

@ 대니 보리스의 대답으로 문제가 해결되면 체크 표시를 클릭하여 동의하십시오. –

관련 문제