为什么我的简单金字塔应用程序不能与 pexpect 一起工作?

Why my simple pyramid application cannot work with pexpect?

我有一个非常简单的金字塔应用程序,它提供一个简单的静态页面。假设它的名称是 mypyramid 并使用端口 9999.


如果我在另一个 linux 控制台中手动启动 mypyramid,那么我 可以 使用以下代码打印出html 字符串.

if __name__ == "__main__":
    import urllib2
    print 'trying to download url'
    response = urllib2.urlopen('http://localhost:9999/index.html')
    html = response.read()
    print html

但我想在应用程序中自动启动 mypyramid

所以在我的另一个应用程序中,我使用 pexpect 启动 mypyramid,然后尝试从 http://localhost:9999/index.html 获取 html 字符串.

def _start_mypyramid():
    p = pexpect.spawn(command='./mypyramid')
    return p

if __name__ == "__main__":
    p = _start_mypyramid()
    print p
    print 'mypyramid started'
    import urllib2
    print 'trying to download url'
    response = urllib2.urlopen('http://localhost:9999/index.html')
    html = response.read()
    print html

似乎 mypyramid 已使用 pexpect 成功启动,因为我可以看到进程的打印并且已达到 mypyramid started

但是,应用程序在trying to download url之后挂起,我无法得到任何东西。


解决方法是什么?我的意思是我认为 pexpect 会创建另一个进程。如果那是真的,那为什么要停止检索 html?

我的猜测是 pexpect.spawn 返回的 child 需要通信。 它尝试写入但没有人读取,因此该应用程序停止了。 (虽然我只是猜测)。

如果您没有任何理由使用 pexpect(如果您不与 child 进程通信,您可能不会这样做),为什么不直接使用标准模块子进程?