2016-11-02 1 views
1

Flaskエンドポイントを通して、スクリプトのstdoutをにストリームしようとしています。FlaskのPopenがPythonインタプリタを起動します

私は出発点としてthis SO答えを使用しています。そのスクリプトは私のためにうまくいった。ここのコードは、 "dmesg"の代わりにPythonスクリプトを直接呼び出すことを除いて、実質的にその答えと同じです。私が移動するとmyscript.pyが

import subprocess 
def main(): 
    subprocess.Popen(['dmesg'], shell=True, stdout=subprocess.PIPE) 

if __name__ == '__main__': 
    main() 

私は「このページに到達することはできません」というエラーを取得し、私のブラウザで「/歩留まり」、およびフラスコテストサーバーに内に落下

@app.route('/yield') 
def index(): 
    def inner(): 
     proc = subprocess.Popen(
      ['python', 'myscript.py'],    
      shell=True, 
      stdout=subprocess.PIPE 
     ) 

     for line in iter(proc.stdout.readline,''): 
      time.sleep(1)       
      yield line.rstrip() + '<br/>\n' 

    return Flask.Response(inner(), mimetype='text/html') 

Pythonインタプリタ(下記参照)と他に何も起こりません。

* Running on http://0.0.0.0:7000/ (Press CTRL+C to quit) 
* Restarting with stat 
* Debugger is active! 
* Debugger pin code: 262-399-135 
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

私はフラスコ経由のストリーミング用のPythonスクリプトを呼び出すために上記の中で何を修正できますか?

+1

'yield'は内部関数にあるべきです。 – syntonym

+0

@syntonymそれは、SOの質問の私の部分のタイプミスです。今修正。利回りは私の実際の関数の内部関数にあります。 – ABM

+0

'' myscript.py'の終わりの引用符がありません - 投稿やコードの入力ミスですか? – CAB

答えて

1

実行可能ファイルはpythonです。このファイルは常にインタープリタを起動します。おそらく、あなたが作業している実行可能ファイルを直接呼び出す必要があります。私はFlaskをよく知っているわけではありませんが、実際にはWSGIアプリケーションを実行していると仮定しています。仮想環境などを使用している場合、開いているシェルはその仮想Pythonの場所を知ることができません動的に設定されます。

import sys 

try: 
    import uwsgi 
    ex = os.path.join(uwsgi.opt['home'], 'bin/python') # or some default location 
except (ImportError, KeyError): 
    ex = sys.executable 

次に呼び出し:

proc = subprocess.Popen(
    [ex, 'myscript.py'],    
    shell=True, 
    stdout=subprocess.PIPE 
) 

さて、これは本当にあなたの問題を解決しないことがありますこのような何かは正しい実行ファイルのパスを取得します。また、スクリプトがシェルへのパラメータとして適切に渡されていないようです。あなたはデフォルトのインタプリタやそれが呼び出しているコマンドが正しいかどうかを二重にチェックする何かでそれを使いこなしたいかもしれません。あるいは、パラメータを分離しないで取り除くことができます。

proc = subprocess.Popen(
    ['python myscript.py'],    
    shell=True, 
    stdout=subprocess.PIPE 
) 
+0

ありがとう!あなたが推薦した2回目の変更は、私が物事を動かすために必要なものでした。 – ABM

関連する問題