2016-12-07 3 views
1

나는 벤치 (학교 목적)를 수행하기 위해 python 3 스크립트를 작업하고 있습니다. 그래서 JAR을 호출해야합니다. 그것에 대해 subprocess.check_output을 사용합니다. 잘 작동 터미널에서python - JAR는 터미널에서 작동하지만 파이썬에서는 작동하지 않습니다.

java_out = subprocess.check_output("java -jar my_jar.jar -p input_file", shell=True) 

, 내가 예상 출력하고 종료 코드가 0 입니다 그러나 파이썬에서, 나는이를 얻을 수 : 나에게 어떤 이해가되지 않습니다

Syntax error. (One of my java exception, but it might not happen in this case) 
Traceback (most recent call last): 


File "C:/Users/Jeremy/PycharmProjects/bench_bf/bench_script.py", line 41, in <module> 
    main() 
    File "C:/Users/Jeremy/PycharmProjects/bench_bf/bench_script.py", line 32, in main 
    result_list.append(bench(bf_file, stats_file)) 
    File "C:/Users/Jeremy/PycharmProjects/bench_bf/bench_script.py", line 10, in bench 
    java_out = subprocess.check_output("java -jar my_jar.jar -p input_file", shell=True) 
    File "C:\Python34\lib\subprocess.py", line 620, in check_output 
    raise CalledProcessError(retcode, process.args, output=output) 
subprocess.CalledProcessError: Command 'java -jar my_jar.jar -p input_file' returned non-zero exit status 5 

Process finished with exit code 1 

. 누구든지 나를 도울 수 있습니까? 감사 ! 나는 또한 시도 java_out = subprocess.check_output ([ "자바", "-jar", "my_jar.jar : 전체 코드는 (나는 또한 절대 경로로 시도했습니다) :

import subprocess 
import os 
import re 

FILE_NAME = "input_file" 
JAR_NAME = "my_jar.jar" 
TEST_ITER = 5 

def bench(bf_file, stats_file): 
    java_out = subprocess.check_output("java -jar "+ JAR_NAME + " -p " + FILE_NAME, shell=True) 
    print(java_out) 
    m = re.search(".*EXEC_TIME : (\d*) ms.*EXEC_MOVE : (\d*)", java_out) 
    return [m.group(0), m.group(1)] 

def init_stats(f): 
    f.write("Iterations; Exec time; exec move") 

def write_file(f): 
    f.write("+++") 

def main(): 

    bf_file = open(FILE_NAME, "w", encoding="utf-8") 
    stats_file = open("bench-result.csv", "w") 

    write_file(bf_file) 
    init_stats(stats_file); 

    result_list = [] 
    for i in range(0,TEST_ITER): 
     result_list.append(bench(bf_file, stats_file)) 
    average_time = 0; 
    for res in result_list: 
     average_time += res[0] 
    average_time /= TEST_ITER; 
    stats_file.write(average_time + ";" + result_list[0][1]) 



main() 

편집을 따르고 ","-p ","input_file "], shell = True), 아무 것도 변경하지 않습니다.

편집 2 : 절대 경로 또는 os.system을을 사용하여 동일한 결과

* 해결 방법 * 내가 쓰기 모드로 파일을 열 때문에, 내 항아리를 열고이 비어 고려하지 수 있습니다 ... 감사합니다 내 친구 DjNikita :)

+0

'java'와'my_jar.jar'에 대한 전체 경로를 시도 했습니까? 나는 당신의 코드를 실행한다. (그리고 나는'my_jar.jar'을 가지고 있지 않다.) 나는 같은 에러를 얻는다. – furas

+0

예이 가능성을 시도했지만 어쨌든 도움에 감사드립니다! –

+0

예외는 무엇입니까? – Kariamoss

답변

-1

내 첫 번째 생각은 하위 프로세스로 전송되지 않는 무언가가 사용자 환경에있는 것입니다. 시도해보고 관련성이있는 내용이 출력되는지 확인하십시오.

import os 
for key in os.environ: 
    if any(token in key.lower() for token in ['java', 'jre', 'jdk']): 
     print(key, os.environ[key]) 

나는 또 다른 생각을 가지고 있습니다. 일부 프로그램은 입력이 tty (즉, 대화식 터미널)가 될 것으로 예상하고 파이프에 입력되면 화를냅니다. Java 프로그램에서 특정 유형의 입력 스트림을 예상 할 수있는 요소가 있습니까?

+0

도움을 주셔서 감사합니다! 내 JAVA_HOME이 좋다. jdk 버전과 물건이 좋다. –

+0

거기에 또 다른 가능한 문제가있다. – user3030010

+0

내 자바 그냥 파일 이름을 기대하고 BufferedReader로 읽어보십시오.그래서 나는 괜찮다고 생각한다. –

-1

jar 파일의 절대 경로를 지정하십시오. 하위 프로세스가 생각하는 디렉토리를 실행하지 않을 수도 있습니다.

예를 들어 'dir'을 실행하고 반환하는 위치를 확인해보십시오. 어쩌면 'java -V'(현재 확인해야 할 위치에없는 버전 플래그)가 오류가 아니라 Java가 실행되었음을 나타내는 내용을 반환하는지 확인하십시오. 기본적으로 파이썬을 통해 간단한 작업을 실행 한 다음 확장하십시오.

+0

나는 dir을 시도해 봤고, 그것은 절대 경로로도 작동하지 않을 것이다. ... –

+0

흠, 정말로 반대표를 던지는 사람들은 그들이 반대하고있는 것에 관해서 논평하기를 바란다. 에. 시도 할 두 가지가 있기 때문에 그것이 OP가 아니 었으면 좋겠다. 그리고 Java 호출의 유효성 검사가 시도되었는지 확실하지 않다 ... –

+0

당신이 의미하는 바라면 나는 투표하지 않았다;) Every 의견이 다른 방법을 보여주기 때문에 의견이 도움이된다. 성공하지 못했다면 (더) –