【问题标题】:os.execl* not launching flask the same as os.systemos.execl* 没有像 os.system 一样启动烧瓶
【发布时间】: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* 的大多数用户都必须长期学习这条规则:-)

标签: python flask


【解决方案1】:

当您通过 shell 或通过os.system(通过 shell)运行程序时,shell 会在程序参数列表的开头隐式地向程序插入一个额外的命令行参数。默认情况下,该参数是正在执行的文件的文件名。

当您调用os.exec* 函数之一时,不会为您插入此参数。你必须自己做:

os.execl("/usr/local/bin/flask", "/usr/local/bin/flask", "run")

【讨论】:

    【解决方案2】:

    这是因为第零个参数(arg0)应该与路径相同(或者至少它具有特殊含义):

    os.execl("/usr/local/bin/flask", "flask", "run")
    

    os.execl("/usr/local/bin/flask", "/usr/local/bin/flask", "run")
    

    是正确的运行方式。

    【讨论】:

    • 是的!就是这个。实际上,我认为我以前遇到过这个问题,但忘记了非常直观的解决方案。
    猜你喜欢
    • 2021-12-26
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2020-12-09
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多