我正在尝试将一个烧瓶服务器作为一个过程启动,作为测试套件的一部分。
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.eniviron传递给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.
答案 0 :(得分:2)
当您通过shell运行程序时,或通过os.system
(通过shell)运行程序时,shell会在程序开头隐式地向程序插入一个额外的命令行参数。参数列表。默认情况下,此参数是正在执行的文件的文件名。
当您调用其中一个os.exec*
函数时,不会为您插入此参数。你必须自己做:
os.execl("/usr/local/bin/flask", "/usr/local/bin/flask", "run")
答案 1 :(得分:1)
那是因为第0个参数(arg0
)应该与路径相同(或者至少它具有特殊含义):
os.execl("/usr/local/bin/flask", "flask", "run")
或
os.execl("/usr/local/bin/flask", "/usr/local/bin/flask", "run")
是运行它的正确方法。