python - JAR在终端中工作但不是从python

时间:2016-12-07 21:36:57

标签: java python python-3.x terminal subprocess

我正在编写一个python 3脚本来做一些替补(学校目的)。所以我需要调用我的JAR。 我使用subprocess.check_output。

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

在终端中它工作正常,我得到预期的输出,退出代码为0。 但在python中,我得到了这个:

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

这对我没有任何意义。谁能帮我 ?谢谢 ! 完整的代码如下(我也尝试过绝对路径):)

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()
编辑:我也试过java_out = subprocess.check_output([“java”,“ - jar”,“my_jar.jar”,“ - p”,“input_file”],shell = True),它什么都没改变。< / p>

编辑2:使用绝对路径或os.system

的结果相同

*解决方案* 由于我在写模式下打开文件,我的JAR无法打开它,并认为它是空的...感谢我的伙伴DjNikita:)

2 个答案:

答案 0 :(得分:-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程序中是否有任何可能导致它期望某种类型的输入流的内容?

答案 1 :(得分:-1)

尝试指定jar文件的绝对路径,因为您的子进程可能没有运行您认为的目录。

尝试运行&#39; dir&#39;例如,看看它返回的地方。也许检查一下&#39; java --V&#39; (版本标志?目前无法检查的位置)返回指示Java运行的内容,而不是错误。基本上,尝试通过Python运行一个简单的事情,然后扩展它。