2017-09-12 4 views
0

私はテストスイートの一部としてプロセスとしてフラスコサーバーを起動しようとしています。os.execl * os.systemと同じフラスコを起動していません

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 ????!! 

フラスコは、(我々は/ usr/local/bin /フラスコを見つける。)実行されますが、以下の私の標準的な使用方法の誤りを与えるが、間違っているものを言いません。

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。私のテストフレームワークでは、親プロセスの現在のPIDをキャプチャしているので、私はexecを使用したいのですが、テストが完了したらSIGINTを実行します。新しいPIDとフラッシュは私のSIGINTを取得しません)。

PPS。また、os.enivironをos.exec*eの亜種に渡してみました。運がない。ゼロ番目の引数(arg0)は、パスと同じにする必要があるためです

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

(https://docs.python.org/2/library/os.html#os.execl)... *いずれの場合においても、子プロセスへの引数は、実行されているコマンドの名前で開始する必要があります* – donkopotamus

+0

ええ、私はあなたが正しいと技術的には思っていますが、いくつかの例ではそこでの使用方法を明らかにするには長い道のりがあります。 – user48956

+0

ああ私は同意する...私は 'os.exec * 'のほとんどのユーザーはこのルールを遠くに学ばなければならないと思う:-) – donkopotamus

答えて

1

は(あるいは、少なくとも、それは特別な意味を持っている):

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

または

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

を実行するための正しい方法です。それ。

+0

はい!これだよ。実際に私はこれを前に打ち、非常に直感的な解決策を忘れてしまったと思います。 – user48956

2

シェルを介してプログラムを実行するか、os.system(シェルを経由する)を実行すると、シェルはプログラムの引数リストの先頭に余分なコマンドライン引数を暗黙的にプログラムに挿入します。デフォルトでは、この引数は実行中のファイルのファイル名です。

os.exec*のいずれかの関数を呼び出すと、この引数は挿入されません。あなたはそれを自分で行う必要があります:[Pythonのドキュメント]から

os.execl("/usr/local/bin/flask", "/usr/local/bin/flask", "run") 
関連する問題