简体   繁体   English

无法打印与子进程一起运行的python脚本的输出

[英]Can not print output of python script that run with subprocess

I try to test server and want print it output on end of the test here 我尝试测试服务器,并希望在测试结束时在此处打印输出

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

When I run it, stdout and err is empty, but server code was executed (I tested it main function in server/__main__.py with pdb) 当我运行它时,stdout和err为空,但是服务器代码已执行(我使用pdb在server / __ main__.py中测试了它的主要功能)

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

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

OK

Source here 来源在这里

I tried a lot of answers on stackowerflow almost 3 hours and none helped, I gave up. 在将近3个小时的时间里,我在stackowerflow上尝试了很多答案,但没有帮助,我放弃了。

The terminate signal was handled unproperly. 终止信号处理不当。

Was

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")

become 成为

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()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM