【发布时间】:2017-09-12 23:33:12
【问题描述】:
我正在尝试将烧瓶服务器作为测试套件的一部分启动。
import os
if __name__=='__main__'
pth = "/fullpath/to/myapp.py"
d,f = os.path.split(pth)
os.chdir(d) # Not necessary (flash can launch from anywhere when full path in FLASK_APP
os.environ["FLASK_APP"] = pth
os.environ["FLASK_DEBUG"] = "1"
# os.system("/usr/local/bin/flask run") # Succeeds!
os.execl("/usr/local/bin/flask", "run") # Fails. Why ????!!
Flask 运行(我们找到 /usr/local/bin/flask),但给了我下面的标准用法错误,但没有说明问题所在。
如果将 os.execl 替换为 os.system("/usr/local/bin/flask run") 它可以工作。如果我改为执行“/use/bin/env”,我可以验证 FLASK_APP 和 FLASK_DEBUG 是否设置正确。如果我跑:
FLASK_APP=/fullpath/to/myapp.py FLASK_DEBUG=1 /usr/local/bin/flask
...一切正常。为什么 os.system 会在 os.exec* 导致烧瓶认为有问题的地方工作?
(PS。我想使用 exec 的原因是,在我的测试框架中,我已经在父进程中捕获了当前的 PID,当我的测试完成时我将 SIGINT。os.system 用一个新的 PID 和闪存没有收到我的 SIGINT)。
PPS。还尝试将 os.environ 传递给 os.exec*e 变体。没有运气。
Usage: flask [OPTIONS] COMMAND [ARGS]...
This shell command acts as general utility script for Flask applications.
It loads the application configured (through the FLASK_APP environment
variable) and then provides commands either provided by the application or
Flask itself.
The most useful commands are the "run" and "shell" command.
Example usage:
$ export FLASK_APP=hello.py
$ export FLASK_DEBUG=1
$ flask run
Options:
--version Show the flask version
--help Show this message and exit.
Commands:
run Runs a development server.
shell Runs a shell in the app context.
【问题讨论】:
-
来自python docs ... 在任何一种情况下,子进程的参数都应该以正在运行的命令的名称开头
-
是的,我想从技术上讲你是对的——尽管一些例子可以很清楚地说明那里的用法。
-
哦,我同意...我认为
os.exec*的大多数用户都必须长期学习这条规则:-)