2016-11-02 2 views
1

Flask 끝점을 통해 스크립트의 stdout을 스트리밍하려고합니다.Popask in Flask가 파이썬 인터프리터를 시작합니다.

this 그래서 내 시작점으로 대답을 사용하고 있습니다. 그 스크립트는 나에게 잘 돌아갔다. 이 코드는 "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') 

파이썬 인터프리터 (아래 참조).

* 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. 
>>> 

나는 플라스크를 통해 스트리밍 파이썬 스크립트를 호출 위의 무엇을 해결할 수 있습니까?

+1

'yield'는 내부 함수에 있어야합니다. – syntonym

+0

@syntonym 그게 내 질문에 오타이야. 지금 고치고있어. 수율은 내 실제 함수의 내부 함수입니다. – 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

고마워! 두 번째로 권장하는 변경 사항은 일을 실행하는 데 필요한 모든 것입니다. – ABM

관련 문제