我正在创建一个执行以下任务的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()
请指出错误或告诉我一种新方法。
答案 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。