【问题标题】:Capturing INPUT and output with subprocess (Python running java)使用子进程捕获输入和输出(运行 java 的 Python)
【发布时间】:2021-10-03 11:58:54
【问题描述】:

我想使用 Python 为 Java 类编写测试脚本。我能够使用subprocessjava.util.Scanner 和其他工具编译、运行、提供输入和捕获输出。代码运行,但我没有捕获我希望的运行日志。

问题

现在捕获的输出不包括输入... 我得到(其中 1、2、3、4 是来自文件的输入):

号码?数字?数字?数字?总和:10

我想捕捉:

号码? 1
数字? 2
数字? 3
数字? 4
总和:10

当前代码
Python

import os.path, subprocess

def compile_java(java_file, inputFile):
    #setup input file
    stdin = get_expected(inputFile)

    #compile java
    subprocess.check_call(['javac', java_file])

    #prep for running
    java_class, ext = os.path.splitext(java_file)
    cmd = ['java', java_class]

    #run java with input, and capturing output
    proc = subprocess.run(cmd, input=stdin, check=True, capture_output=True, text=True)

    print(proc.stdout)

def get_expected(filename):
    content = ""
    with open(f'{filename}', 'r') as f:
        for line in f.readlines():
            content += line
    return content

compile_java('Example.java', 'example.in')

Java - Example.java

import java.util.*;

public class Example{
      public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        
        int sum = 0;
        for(int i =0; i < 4; i++){
           System.out.print("Number? ");
           sum = sum + scan.nextInt();
        }
        System.out.println("Sum: " + sum);
     }
}

输入文件 - example.in

1
2
3
4

注意:我想测试 Java 文件,所以我不想以任何方式编辑 Java。我希望有一种方法可以通过更改 Python 代码来捕获这种格式的输出。

【问题讨论】:

  • 我正在继续努力……我找到了一个post,用户在其中使用了p.stdin.write("...")。我喜欢这个想法,但是当我运行代码时,我得到了Exception in thread "main" java.util.NoSuchElementException,我希望我可以用它来逐行提供输入,但仍然很挣扎。

标签: java python subprocess output java.util.scanner


【解决方案1】:

如果您只想以该格式捕获输出,为什么不执行以下操作:

for(int i =0; i < 4; i++){
    int a = scan.nextInt();
    System.out.println("Number? " + a);
    sum = sum + a;
}

【讨论】:

  • 感谢您的想法/评论,但这并没有实现我的目标。我的最终目标是能够通过使用我的 Python 文件运行 Java 文件并提供输入文件来对 Java 文件进行黑盒测试。如果我编辑了 Java 文件,我知道您的解决方案是如何工作的,但这没有达到我的目标。
  • 在这种情况下,是的,这不是一个解决方案。但是由于 proc.stdout 中的任何内容都是 Java 程序打印的内容,并且由于 System.out.println("Number? " + a); 不会改变您的 Java 程序的逻辑,所以如果没有其他方法,您可以试试这个。
猜你喜欢
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2012-10-04
  • 2013-07-11
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多