import subprocess
import threading
import StringIO
class terminal(threading.Thread):
def run(self):
self.prompt()
def prompt(self):
x = True
while x:
command = raw_input(':')
x = self.interpret(command)
def interpret(self,command):
if command == 'exit':
return False
else:
print 'Invalid Command'
return True
class test(threading.Thread):
command = 'java -jar ../bukkit/craftbukkit.jar'
test = StringIO.StringIO()
p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while (p.poll() == None):
line = p.stderr.readline()
if not line: break
print line.strip()
term = terminal()
testcl = test()
term.start()
testcl.start()
这样运行没有错误,但是在运行时你无法在提示符下键入任何输入。没有字符或返回用户类型出现,但正在运行的jar的输出打印。我正在寻找的是在终端类中输入,处理它,并将输出提供给正在运行的java程序。在搜索互联网之后我发现所有的是subprocess.Popen(),但我无法找出stdin-out-err重定向。如何使用Popen解决这个问题,或者使用完全不同的方法
答案 0 :(得分:0)
这是一个类似的问题:
Python and subprocess input piping
在这种情况下OP也运行jvm并期望用户输入。我想你会通过调用select((sys.stdin,),(),())
替换你的while循环。当select()
返回时,您应该有输入来读取其返回值,然后通过管道传输到Popen
对象。
答案 1 :(得分:0)
我的问题的最终解决方案是改变while循环,如AJ建议
while x:
select.select((sys.stdin,),(),())
a = sys.stdin.read(1)
if not a == '\n':
sys.stdout.write(a)
sys.stdout.flush()
else:
x = self.interpret(command)
并更改Popen电话
p = subprocess.Popen(command, shell=False, stdin = subprocess.PIPE)
我还必须更改shell = True参数。即使在我改变了循环之后,这个简单的论点也破坏了一切