如何在通过python执行脚本时在java中询问用户输入

时间:2015-02-17 10:55:26

标签: python input cmd subprocess

我正在创建一个执行以下任务的python脚本: 1)列出目录中的所有文件 2)如果找到的文件是.java类型的话 3)它使用subprocess.check_call编译java文件 4)如果没有错误,则使用与文件名相同的类名执行文件

现在某些文件需要在运行时输入用户。 这正是我被困的地方。我的脚本编译并运行java程序。 但每当我的java程序要求输入时,"输入数字:" ,我的脚本不接受输入,因为引发了以下错误:

输入数字

线程中的异常" main" java.lang.NumberFormatException:null

at java.lang.Integer.parseInt(Integer.java:415)

at java.lang.Integer.parseInt(Integer.java:497)

at inp.main(inp.java:17)

我希望屏幕应该等待我的输入,当我输入数字时,它会恢复执行

我的java程序是:

import java.io.*;
class inp
{
    public static void main(String args[])throws IOException
    {
        InputStreamReader in=new InputStreamReader(System.in);
        BufferedReader br=new BufferedReader(in);
        System.out.println("Enter the Number");
        int n=Integer.parseInt(br.readLine());
        int b=10*n;
        System.out.println("T 10 multiple of Number is : "+b);
    }
}

我的python脚本是:

import subprocess
import sys
import os

s=os.getcwd()
s="codewar/media/"
print os.chdir(s)
t=os.getcwd()
print os.listdir(t)
for file in os.listdir(t):
    if file.endswith(".java"):
        proc=subprocess.check_call(['javac',file])
        print proc
        if proc==0:
            l=file.split(".")
            proc=subprocess.Popen(['java',l[0]],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
            input=subprocess.Popen(['java',l[0]],shell=True,stdin=subprocess.PIPE)
            print proc.stdout.read()

请指出错误或告诉我一种新方法。

2 个答案:

答案 0 :(得分:1)

  

在通过python

执行脚本时在java中询问时给用户输入
#!/usr/bin/env python
import os
from glob import glob
from subprocess import Popen, PIPE, call

wdir = "codewar/media"

# 1) list all .java files in directory
for path in glob(os.path.join(wdir, "*.java")):
    # 2) compile the java file
    if call(['javac', path]) != 0: # error
        continue
    # 3) if there is no error it then executes the file using its 
    # class name which is same as file name
    classname = os.path.splitext(os.path.basename(path))[0]
    p = Popen(['java', '-cp', wdir, classname], 
              stdin=PIPE, stdout=PIPE, stderr=PIPE,
              universal_newlines=True) # convert to text (on Python 3)
    out, err = p.communicate(input='12345')
    if p.returncode == 0:
        print('Got {result}'.format(result=out.strip().rpartition(' ')[2]))
    else: # error
        print('Error: exit code: {}, stderr: {}'.format(p.returncode, err))

密钥as @user2016436 suggested是在这里使用.communicate()方法。


  

但我想以这样一种方式,即它的运行和显示进入一个   number:屏幕应该等待我输入,当我进入时   号码它恢复执行

如果您不需要捕获输出并且想要通过键盘手动提供输入,那么您不需要使用Popen(.., PIPE).communicate(),只需使用call()代替:

#!/usr/bin/env python
import os
from glob import glob
from subprocess import call

wdir = "codewar/media"

# 1) list all .java files in directory
for path in glob(os.path.join(wdir, "*.java")):
    # 2) compile the java file
    if call(['javac', path]) != 0: # error
        continue
    # 3) if there is no error it then executes the file using its
    # class name which is same as file name
    classname = os.path.splitext(os.path.basename(path))[0]
    rc = call(['java', '-cp', wdir, classname])
    if rc != 0:
        print('Error: classname: {} exit code: {}'.format(classname, rc))

答案 1 :(得分:0)

首先,而不是:

proc=subprocess.Popen(['java',l[0]],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
input=subprocess.Popen(['java',l[0]],shell=True,stdin=subprocess.PIPE)

它应该是:

proc=subprocess.Popen(['java',l[0]],stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=True,stdin=subprocess.PIPE)

其次,使用Popen.communicate与子进程通信,即用输入提供它。在您的示例中:

(stdoutdata, stderrdata) = proc.communicate('2')

将通过' 2'到子进程,并返回子进程的stdout和stderr。