【问题标题】:python - JAR works in terminal but not from pythonpython - JAR 在终端中工作,但不适用于 python
【发布时间】:2017-04-23 00:11:25
【问题描述】:

我正在编写一个 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),它没有任何改变。

编辑 2:使用绝对路径或 os.system 的结果相同

* 解决方案 * 由于我以写入模式打开文件,因此我的 JAR 无法打开它,并认为它是空的...谢谢我的朋友 DjNikita :)

【问题讨论】:

  • 您是否尝试过使用 javamy_jar.jar 的完整路径?我运行你的代码(我没有my_jar.jar),我得到了同样的错误。
  • 是的,我已经尝试过这种可能性,但无论如何感谢您的帮助!
  • 有什么例外?
  • 语法无效,他不认识我的“+”(他应该)。但是当我在我的 java 代码中添加打印时,打印就像“跳过”
  • 使用绝对路径是不是同样的错误?

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


【解决方案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 程序中是否有任何内容可能导致它期望某种类型的输入流?

【讨论】:

  • 感谢您的帮助!我的 JAVA_HOME 很好,我得到了很好的 jdk 版本和东西
  • 我添加了另一个可能存在的问题。
  • 我的 java 只需要一个文件名并使用 BufferedReader 读取它。所以我想没关系
【解决方案2】:

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

例如,尝试运行 'dir' 并查看它返回的位置。也许检查'java --V'(版本标志?目前无法检查)返回指示Java运行的东西,而不是错误。基本上,尝试通过 Python 运行一个简单的东西,然后扩展它。

【讨论】:

  • 我试过 dir,它是一个很好的目录,即使使用绝对路径它也行不通....
  • 嗯,我真的希望投反对票的人能够评论他们反对的内容。我希望它不是 OP,因为有两件事要尝试,并且不清楚是否已尝试验证 java 调用...
  • 如果这是你的意思,我没有投反对票;)每条评论都是有帮助的,即使(更多)如果它不成功,因为它显示了另一种思维方式
  • 我希望如此!正如我所说,我会尝试检查 java 是否正在运行,也许只是没有 jar 文件的基本命令,然后如果没问题,一个 helloworld.jar 等。如果你能进入某个工作的阶段,那就更容易了比现在缩小问题的范围。
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多