【问题标题】:Interact with java program using python [duplicate]使用python与java程序交互[重复]
【发布时间】:2012-03-10 06:49:59
【问题描述】:

可能重复:
Calling Java app with “subprocess” from Python and reading the Java app output

基本上我正在寻找的是,我想在使用 python 运行时与 java 程序进行交互,这样我就可以访问它的输出并将输入传递给它。 我已经设法使用 python 运行 Java 程序。我想知道我可以在我的 python 程序中访问 java 程序的输出。 例如。 在java程序中: System.out.println("输入编号"); 在python中,我应该能够将“Enter no”作为字符串获取,并从python.a将值传递给java程序

我设法做到了,直到没有: Python程序:

import sys
import os.path,subprocess

def compile_java(java_file):
    subprocess.check_call(['javac', java_file])

def execute_java(java_file):
    java_class,ext = os.path.splitext(java_file)
    cmd = ['java', java_class]
    subprocess.call(cmd, shell=False)            

def run_java(java_file):
    compile_java(java_file)
    execute_java(java_file)

Java 程序:

import java.io.*;
import java.util.*;
class Hi
{
        public static void main(String args[])throws IOException
        {
        Scanner t=new Scanner(System.in);

        System.out.println("Enter any integer");
        int str1=t.nextInt();           
        System.out.println("You entered"+str1);     

        }
}

感谢:)

【问题讨论】:

标签: java python django linux subprocess


【解决方案1】:

如果您只需要从 Java 程序的非交互式执行中获取输出,请使用 subprocess.check_output 而不是 subprocess.call。

http://docs.python.org/library/subprocess.html

您需要 Python 2.7 或更高版本才能使用 check_output。

如果您需要与 Java 程序交互,您可以使用 Popen.communicate 执行此操作,您可以在其中读取进程的输出并使用文件描述符将内容发送到其输入。

你也可以使用 pexpect python 库来自动化这种交互,pexpect 抽象了很多使用 Popen.communicate 所涉及的跑腿工作。

请注意,这些技术适用于您需要 Python 程序与之交互的任何类型的可执行文件,而不仅仅是 Java;只要它使用标准输入和标准输出,使用这些调用应该适合你。

【讨论】:

  • 感谢您的快速回复 :) 我尝试了一下 pexpect 并且非常喜欢它。只是想找到一些关于它的好教程。
【解决方案2】:

最简单的方法是使用 Jython,它是一个在 JVM 中运行的完整 Python 实现,并且可以与本机 Java 代码交互。但是,如果您想使用 CPython,并且通常沿着您在上面勾勒出的路径继续前进,您将需要创建一个可以与之交互的实时 Python Popen 对象。例如:

import sys
import os.path,subprocess

def compile_java(java_file):
    subprocess.check_call(['javac', java_file])

def execute_java(java_file):
    java_class,ext = os.path.splitext(java_file)
    cmd = ['java', java_class]
    return subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

def run_java(java_file):
    compile_java(java_file)
    process = execute_java(java_file)
    for i in range(10):
        process.stdin.write(str(i) + "\n")

【讨论】:

  • 感谢您这么快的回复 :) 我正在尝试您的建议,并将发布有关进展的信息 :)
猜你喜欢
  • 2012-03-25
  • 2012-12-26
  • 1970-01-01
  • 2021-02-25
  • 2014-07-03
  • 2020-12-12
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多