以下是我想要达到的要求的减少。
# run.py
import requests
import time
from subprocess import Popen, PIPE
server = Popen("./app.py", stdout=PIPE, stderr=PIPE, shell=True)
time.sleep(1)
res = requests.get("http://localhost:1234/")
assert res.status_code == 200
server.kill()
server.terminate()
res = requests.get("http://localhost:1234/")
print res
实际的服务器脚本。
#!/usr/bin/env python
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route('/')
def view():
return make_response("")
if __name__ == "__main__":
app.run(host="localhost", port=1234)
在命令行上,我运行python run.py
。来自shell:
(t)yeukhon@fubini:/tmp$ ps aux|grep app
yeukhon 21452 0.6 0.4 16416 9992 pts/2 S 03:50 0:00 python ./app.py
yeukhon 21471 0.0 0.0 4384 804 pts/2 S+ 03:51 0:00 grep --color=auto app
所以app.py
仍然悬在那里。我必须从命令行中删除它。事实上,run.py
的最后一行告诉我们服务器仍然存活(返回200)。
我试图用os.kill(server.pid, signal.SIGTERM)
和os.kill(server.pid, signal.SIGKILL)
杀死但没有效果。
通常kill
会起作用,但我真的不确定为什么它无法接收信号。我确信Flask拒绝停止。
我有哪些选择?
奇怪的是,我上面的脚本在Mac OSX上完全正常(我在10.8.5,Mountain Lion)。到目前为止,我已经在两台Ubuntu 12.04机器上进行了测试,它们具有相同的行为。我在Ubuntu机器上运行Python 2.7.3,在Mac OSX上运行Python 2.7.2。校正: 我唯一的选择是使用http://flask.pocoo.org/snippets/67/。但我不愿意。是的,我必须使用Popen启动一个。
答案 0 :(得分:2)
通过指定shell=True
,命令由子shell运行。
server = Popen("./app.py", stdout=PIPE, stderr=PIPE, shell=True)
server.terminate
将终止子shell,但不会杀死Web服务器。
如何验证? print server.pid
调用后尝试Popen
,并将其与ps
输出进行比较。
答案 1 :(得分:2)
从您的Popen中删除shell=True
。这将是第一个请求。杀死这个过程。然后为第二次尝试抛出异常。