为什么我的简单金字塔应用程序不能与 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 进程通信,您可能不会这样做),为什么不直接使用标准模块子进程?
我有一个非常简单的金字塔应用程序,它提供一个简单的静态页面。假设它的名称是 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 进程通信,您可能不会这样做),为什么不直接使用标准模块子进程?