我有一个使用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
答案 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)