Python:如何使用Flask操作subprocess.Popen的STDIN和STDOUT?

时间:2019-11-13 15:13:32

标签: python flask subprocess

我有一个使用STDIN和STDOUT进行操作的程序。 我想为此制作一个API。只需一个POST-输入字符串和输出字符串。

问题是程序必须将一些数据加载到RAM,然后才可以进行多个STDIN-STDOUT操作。

显示我的代码比解释我在做什么更容易。

Sort sortMock = Mockito.mock(Sort.class);
when(pageable.getSort()).thenReturn(sortMock);
when(sortMock.isSorted()).thenReturn(true);

Flask可以正常工作,但是当我发送带有curl的POST请求时,我得到:

#!/usr/bin/python3
from flask import Flask
from flask import request
import os
import sys
import subprocess

app = Flask(__name__)
app.url_map.strict_slashes = False

@app.route('/api/v1/someroute/', methods=['POST'])
def do_it():
    request_str = request.get_data().decode('utf-8').strip()
    request_lines = request_str.split('\n')
    output_list=[]

    for line in request_lines:
        output=''
        proc.stdin.write(line.encode())
        proc.stdin.close()
        output = proc.stdout.read().decode()
        print("output: ")
        print(translation)
        print("DONE")
        output_list.append(output.strip())
    print("MY output_list: ")
    print("output_list)
    print("DONE")
    return '\n'.join(output_list), 200

if __name__ == '__main__':
    proc = subprocess.Popen(["somepath", "some args"], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
    app.run(host='0.0.0.0',port=int(sys.argv[1]))

我想念什么?

此外,当我尝试发送带有500的第二个Flask响应请求时,因为我尝试写入已关闭的stdin。但是,如果我删除“ proc.stdin.close()”程序,则会冻结。

更新! 当我没有Flask等操作时。最简单的方法。

Name:*pogram name*  VmPeak:3021296 kB   VmRSS:300828 kB RSSMax:2992548 kB   user:43.311 sys:1.116   CPU:44.426  real:56.341
MY output: 

DONE
MY output_list: 
['']
DONE

1 个答案:

答案 0 :(得分:0)

我想您在从python调用的程序中或在传递的参数中都有错误,因此该调用的输出为空。

首先请确保您通过传递给Popen的args程序通过从命令行调用相同的内容来实际输出任何内容。

您的简单代码段应该可以正常工作。例如,使用cat对其进行测试:

import subprocess

proc = subprocess.Popen(['cat'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
proc.stdin.write('hello world'.encode())
proc.stdin.close()
print(proc.stdout.read(), 'out')

您还可以使用communicate()代替write() + close() + read()

import subprocess

proc = subprocess.Popen(['cat'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
out, err = proc.communicate(input='communicated input')
print(out)