Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.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 ProcessBuilder:当python使用线程setDaemon时,inheritIO不工作_Java_Python_Thrift_Processbuilder - Fatal编程技术网

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:
            ''
as
self.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()