在python中,如何运行一个命令行程序,直到我向其发送Ctrl + D才会返回

时间:2014-11-20 20:48:07

标签: python unit-testing rest tomcat7 atlassian-plugin-sdk

我正在编写python单元测试,测试需要作为另一个进程运行的REST API。

REST服务器是一个tomcat应用程序,我从shell调用它以开发模式运行,所以我在python测试中要做的是:

  1. 启动服务器,在服务器启动时返回。
  2. 运行单元测试
  3. 发送服务器 Ctrl + D ,以便正常关闭。
  4. 有没有办法为python使用单一入口点,以便服务器启动并且单元测试从一个python脚本调用中运行?

    我在python中查看python子进程和多线程,但我还是不太清楚如何从这里到达那里。

    对于那些熟悉的人来说,这是我们正在开发的Atlassian JIRA插件,所以实际的shell命令是" atlas-run"。

1 个答案:

答案 0 :(得分:3)

由于没有人提供任何代码来帮助解决这个问题,我会做类似以下的事情。结果pexpect非常强大,您不需要signal模块。

import os
import sys
import pexpect

def run_server():
    server_dir = '/path/to/server/root'
    current_dir = os.path.abspath(os.curdir)

    os.chdir(server_dir)
    server_call = pexpect.spawn('atlas-run')
    server_response = server_call.expect(['Server Error!', 'Sever is running!'])
    os.chdir(current_dir)
    if server_response:
        return server_call #return server spawn object so we can shutdown later
    else:
        print 'Error starting the server: %s'%server_response.after
        sys.exit(1)

def run_unittests():
    # several ways to do this. either make a unittest.TestSuite or run command line
    # here is the second option
    unittest_dir = '/path/to/tests'
    pexpect.spawn('python -m unittest discover -s %s -p "*test.py"'%unittest_dir)
    test_response = pexpect.expect('Ran [0-9]+ tests in [0-9\.]+s') #catch end
    print test_response.before #print output of unittests before ending.
    return

def main():
    server = run_sever()
    run_unittests()
    server.sendcontrol('d') #shutdown server

if __name__ == "__main__":
    main()