os.execl *没有像os.system

时间:2017-09-12 23:33:12

标签: python flask

我正在尝试将一个烧瓶服务器作为一个过程启动,作为测试套件的一部分。

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.

2 个答案:

答案 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")

是运行它的正确方法。