2016-12-27 155 views
0

我尝试测试服务器,并希望将其打印输出在这里的测试不能打印与子进程运行Python脚本的输出

class TestHandler(TestCase): 

    def setUp(self): 
     cmd = [ 
      'python', '-m', 'server', 
      '-f', write_to_path, 
      '--debug' 
     ] 
     self.server = Popen(cmd, universal_newlines=True, cwd=root_dir_path, 
          stdout=PIPE, stderr=PIPE) 

     # also tried this, did not help 
     # cmd = [ 
     #  'python -m server --debug -f ' + write_to_path 
     # ] 
     # self.server = Popen(cmd, shell=True, universal_newlines=True, cwd=root_dir_path, 
     #      stdout=PIPE, stderr=PIPE) 

    def tearDown(self): 
     try: 
      outs, errs = self.server.communicate(timeout=2) 
      print(outs, errs) 
     except TimeoutExpired: 
      print("kill") 
      self.server.kill() 
      outs, errs = self.server.communicate() 
      print(outs, errs) # empty output here 

    def testWordWithoutParent(self): 
     pass 

末当我运行它,stdout和犯错是空的,但服务器代码被执行(与PDB我测试了它的主要功能在服务器/ __ main__.py)

~/Documents/LINGUALEO/lingualeo2anki $ python -m unittest 
.kill 

. 
---------------------------------------------------------------------- 
Ran 2 tests in 2.006s 

OK 

Source here

我试过stackowerflow将近3小时,没有他很多答案我放弃了。

回答

0

终止信号处理不当。

当时

try: 
    httpd = HTTPServer(config.server_address, Handler) 
    debug('http server is running...listening on port %s', config.port) 
    httpd.serve_forever() 
except KeyboardInterrupt: 
    httpd.server_close() 
    sys.exit(0) 
finally: 
    httpd.socket.close() 
    httpd.server_close() 
    debug("finnaly") 

成为

server = None 

def close_server(signum, frame): 
    debug("Signal handler called with signal %s", signum) 
    if server: 
     server.server_close() 
     sys.exit() 

server = HTTPServer(config.server_address, Handler) 
signal.signal(signal.SIGINT, close_server) 
signal.signal(signal.SIGTERM, close_server) 
debug('http server is running...listening on port %s', config.port) 
server.serve_forever()