Java ProcessBuilder:当python使用线程setDaemon时,inheritIO不工作
我正在从Java ProcessBuilder:当python使用线程setDaemon时,inheritIO不工作,java,python,thrift,processbuilder,Java,Python,Thrift,Processbuilder,我正在从Java(openjdk 1.7.0_85)运行python进程: 我设置pb.inheritIO()将python打印重定向到标准输出。如果我的python进程做了一些简单的事情,那么流的重定向就会像预期的那样工作 我正在使用thriftpy(0.3.2)进行JavaPython通信。Python进程在线程中打开thrift服务器: def __run_server(self, serverport): t = Globals.thrifts.split(',') th
Java(openjdk 1.7.0_85)
运行python进程:
我设置pb.inheritIO()
将python打印重定向到标准输出。如果我的python进程做了一些简单的事情,那么流的重定向就会像预期的那样工作
我正在使用thriftpy(0.3.2)
进行JavaPython
通信。Python进程在线程中打开thrift服务器:
def __run_server(self, serverport):
t = Globals.thrifts.split(',')
thrifts = thriftpy.load(t[0], module_name="processsideserver_thrift", include_dirs=[t[1]])
self.server = make_server(thrifts.ProcessSideServer, self, '127.0.0.1', serverport)
def run(self):
if self.can_run == True:
self.running = True
try:
self.server.serve()
except Exception:
''
asself.server.service()
是一个阻塞函数。由于这条线,我的流重定向停止工作。应用程序和Java Python通信工作正常。但python打印并没有显示在控制台中
Thrifpy代码类似于:
def serve(self):
self.trans.listen()
while not self.closed:
try:
client = self.trans.accept()
t = threading.Thread(target=self.handle, args=(client,))
t.setDaemon(self.daemon)
t.start()
except KeyboardInterrupt:
raise
except Exception as x:
logging.exception(x)
为什么会这样?因为迪蒙线?如何强制重定向流?我重载了thrifpy TThreadedServer的句柄线程方法:
def custom_handle(self, client):
itrans = self.itrans_factory.get_transport(client)
otrans = self.otrans_factory.get_transport(client)
iprot = self.iprot_factory.get_protocol(itrans)
oprot = self.oprot_factory.get_protocol(otrans)
try:
while True:
self.processor.process(iprot, oprot)
sys.stdout.flush()
sys.stderr.flush()
except TTransportException:
pass
except Exception as x:
logging.exception(x)
itrans.close()
otrans.close()
我添加了两行sys.stdout.flush()和sys.stderr.flush()。成功了。似乎如果我们有一个while循环,就没有时间刷新了。只是暗示一下。有关系吗?这是我自己的另一个经验:我在LinuxMint17.2上测试。我的申请表也挂不住。我可以用Java方法成功地完成System.out.println,该方法通过thrift从python调用。
def custom_handle(self, client):
itrans = self.itrans_factory.get_transport(client)
otrans = self.otrans_factory.get_transport(client)
iprot = self.iprot_factory.get_protocol(itrans)
oprot = self.oprot_factory.get_protocol(otrans)
try:
while True:
self.processor.process(iprot, oprot)
sys.stdout.flush()
sys.stderr.flush()
except TTransportException:
pass
except Exception as x:
logging.exception(x)
itrans.close()
otrans.close()