Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从python脚本中执行来自另一个程序的命令_Java_Python_Input_Console_Communication - Fatal编程技术网

Java 从python脚本中执行来自另一个程序的命令

Java 从python脚本中执行来自另一个程序的命令,java,python,input,console,communication,Java,Python,Input,Console,Communication,无法从python脚本与java程序通信。 我有一个java程序,可以读取标准输入。 逻辑是: public static void main(String[] args) { ... BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String cmd; boolean salir = faslse while (!salir) { cmd = in.readLin

无法从python脚本与java程序通信。 我有一个java程序,可以读取标准输入。 逻辑是:

public static void main(String[] args) {
  ...
  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  String cmd;
  boolean salir = faslse

  while (!salir) {
    cmd = in.readLine();
    JOptionPane.showMessageDialog(null, "run: " + cmd);
    //execute cmd
    ... 
    System.out.println(result);
    System.out.flush();
  }

}
我通过控制台运行程序

java-cp MyProgram.jar package.MyMainClass

和执行命令并获取结果,并在对话框中显示执行的命令(JOptionPane.showMessageDialog(null,“run:+cmd”);)

我需要从python调用这个程序。 现在我正在尝试这样做:

#!/usr/bin/python
import subprocess

p = subprocess.Popen("java -cp MyProgram.jar package.MyMainClass", shell=True, stdout=subprocess.PIPE , stdin=subprocess.PIPE)
print '1- create ok'
p.stdin.write('comand parameter1 parameter2')
print '2- writeComand ok'
p.stdin.flush()
print '3- flush ok'
result = p.stdout.readline()  # this line spoils the script
print '4- readline ok'
print result
p.stdin.close()
p.stdout.close()
print 'end'
输出是

1- create ok
2- writeComand ok
3- flush ok
1- create ok
2- writeComand ok
3- flush ok
end
并且不显示该对话框

但是,如果我运行:

#!/usr/bin/python
import subprocess

p = subprocess.Popen("java -cp MyProgram.jar package.MyMainClass", shell=True, stdout=subprocess.PIPE , stdin=subprocess.PIPE)
print '1- create ok'
p.stdin.write('comand parameter1 parameter2')
print '2- writeComand ok'
p.stdin.flush()
print '3- flush ok'
p.stdin.close()
p.stdout.close()
print 'end'
输出是

1- create ok
2- writeComand ok
3- flush ok
1- create ok
2- writeComand ok
3- flush ok
end
并显示对话框

行p.stdout.readline()破坏了脚本,因为我可以解决这个问题


非常感谢您的帮助。

在打印一个
结果后,刷新您的
系统。

另外,请更改代码以执行此操作:

p = subprocess.Popen("java -cp MyProgram.jar package.MyMainClass",
    shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
p.stdin.write(command1)
p.stdin.flush()  # this should trigger the processing in the Java process
result = p.stdout.readline()  # this only proceeds if the Java process flushes
p.stdin.write(command2)
p.stdin.flush()
result = p.stdout.readline()
# and afterwards:
p.stdin.close()
p.stdout.close()

在java代码中?java代码运行良好。我从控制台运行它,得到了预期的结果。问题在于python脚本。谢谢,在Java代码中。当写入终端时,所有进程应用不同的缓冲。当写入管道(而不是tty)时,Java进程假定这是一个大容量数据连接,并且仅当缓冲区耗尽时才会刷新。插入冲水,再试一次。我试过了,但没成功。问题在于python代码。我无法在java解释器中运行命令。谢谢,来吧。相信我,冲洗是绝对必要的。在那里,做了几百次。它不会造成任何伤害。我将再次查看
通信
,看看我们应该使用什么,请稍候。我更改了答案。试试看:-)