2012-04-09 1 views
0

나는 반복적으로 다음 코드를 통해 파이썬 함께 외부 프로그램을 실행하려고 의도 한대로은 ...

3 javarun='java -classpath /home/jrm6u/code/weka_dir/weka.jar' 
4 java1='java' 
5 java2='-classpath' 
6 java3='/home/jrm6u/code/weka_dir/weka.jar' 
7 weka_args='weka.clusterers.DBScan' 
8 db_type='weka.clusterers.forOPTICSAndDBScan.Databases.SequentialDatabase' 
9 db_dist='weka.clusterers.forOPTICSAndDBScan.DataObjects.EuclidianDataObject' 

...

28 traindir = './arff_dir/' 
29 trainfile = 'of3_O_0_0.arff' 
30 trainer = traindir + trainfile 

을 ... 행동하지 subprocess.call

45  subprocess.call([java1, java2, java3, weka_args, '-E', str(eps), '-M', str(min), '-I', db_type, '-D', db_dist, '-t', trainer], shell=True) 

여기서 eps 및 min은 각각 0.12510입니다.

Usage: java [-options] class [args...] 
     (to execute a class) 
or java [-options] -jar jarfile [args...] 
     (to execute a jar file) 
where options include: 
-d32   use a 32-bit data model if available 
-d64   use a 64-bit data model if available 
-server  to select the "server" VM 
       The default VM is server. 

후 더 출력 :

내 파이썬 코드의 실행시 나는 다음과 같은 오류가 발생합니다. 이것은 bash 쉘에 단순히 java을 입력 할 때 얻는 결과와 정확히 일치합니다. 이것은 어떻게 든 subprocess.call이 모든 단일 인수를 읽지 않는다고 믿게 만듭니다. 이 경우인가요? 이 명령을 올바르게 평가하는 방법은 무엇입니까?

이 명령은 쉘에 수동으로 올바르게 입력 할 수 있지만이 스크립트를 사용하는 뒤에있는 동기는 mineps의 값과 반복적으로 실행시켜야 자동으로 실행할 수 있습니다.

+0

당신은 하나의 문자열로 인수의 형식을 지정할 수 있다는 것을 알고 있습니다. 셸에서 실행 한 정확한 문자열을 시도하고 무슨 일이 일어나는 지보십시오. –

+0

이 문제는 일부 인수를 변경하여 변경하기 쉽도록 분할하는 것입니다. java1, java2, java3은 처음에 하나의 문자열이었고 똑같은 문제가 생겨서 – drjrm3

+0

을 나눠 봤습니다. 여러분은 항상 ""% s % s % s ... "'으로 서식을 지정할 수 있지만, 디버그로 제안했습니다. 단계, 해결책이 아닙니다. 또한 java 실행 파일의 정확한 경로가되도록 Java arg를 변경했습니다. BTW에서는 jython없이 python과 java를 통합 할 수 있다는 점에 유의할 가치가 있습니다. http://jpype.sourceforge.net/ 또는 https://github.com/thouis/Python-Java-Bridge –

답변

0

필자는 매개 변수를 무시하고 있다고 생각하지 않지만 필요한 경우가 아니라면 쉘 매개 변수를 피하려고합니다. 때로는 이상한 동작 (명령 줄 구문 분석과 파이썬이 아닌)이 있습니다.

자바에 대해 잘 모르겠지만 잘못된 매개 변수를 제공하고 출력 오류로 아무 것도 말하지 않을 것입니다 (단 java은 발견되었으며 올바른 매개 변수를 얻지 못함을 의미하지는 않습니다. 아무것도 얻지 않는다).

간단한 인쇄 또는 import pdb을 사용하여 subprocess.call에 전달할 사전을 디버깅하고 이전 줄에서 디버거를 얻으려면 pdb.set_trace()을 호출하고 해당 매개 변수가있는 명령이 예상대로 작동하는지 확인하십시오. .

나는 그것이 적절한 답이 아니라는 것을 알고 있지만 이것은 주석 줄에는 너무 길다.

+0

shell = True 명령을 사용하고 있습니다. OSError : [Errno 2] No such file or directory' – drjrm3

+0

@ Laurbert515 'java'가 없기 때문에 오류가 발생한다고 생각합니다. PATH, 자바에 풀 패스를 사용하거나 PATH 시스템에 'java'를 추가하십시오. – KurzedMetal