我正在编写一个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:)
答案 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运行一个简单的事情,然后扩展它。