Python 3 - Flask Restful API для перезапуска другого API
Я создал веб-сервис python REST, и он выполнит серию команд подпроцесса для перезапуска другого веб-сервиса python REST. Но проблема в том, что он действительно не запускает мою другую службу REST после ее вызова.
Вот мой код для REST API:
from flask import Flask, jsonify, request, make_response
from flask_restful import fields, reqparse, abort, Api, Resource
import sqlalchemy
from sqlalchemy.sql import table, column, select, update, insert, delete, func
from sqlalchemy.orm import sessionmaker
import requests
import time
import traceback
import subprocess
import os
app = Flask(__name__)
api = Api(app)
class RestartPython(Resource):
def get(self):
command1 = 'fuser -k 9876/tcp'
proc1 = subprocess.Popen(command1, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
proc1.wait()
print('kill python process done')
command2 = 'source activate envpy3'
proc2 = subprocess.Popen(command2, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
proc2.wait()
print('switch python env done')
command3 = 'python ReceiveCall.py'
print(command3)
proc3 = subprocess.Popen(command3, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
proc3.wait()
print('ReceiveCall started')
return make_response(jsonify({'message': 'Python webservice is restarted', 'status': 'Ok'}), 200)
api.add_resource(RestartPython, '/restart')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8082, debug=True)
Это будет работать, если я просто запустил его, не помещая их в веб-сервис
import subprocess
if __name__ == '__main__':
command1 = 'fuser -k 9876/tcp'
proc1 = subprocess.Popen(command1, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
proc1.wait()
print('kill python process done')
command2 = 'source activate envpy3'
proc2 = subprocess.Popen(command2, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
proc2.wait()
print('switch python env done')
command3 = 'python ReceiveCall.py'
print(command3)
proc3 = subprocess.Popen(command3, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
proc3.wait()
print('ReceiveCall started')
Есть идеи?
1 ответ
Вместо wait() я бы порекомендовал использовать connect () . связь используется, чтобы избежать тупика везде, где используется канал. Дайте мне знать, если ниже модификация работает для вас
from flask import Flask, jsonify, request, make_response
from flask_restful import fields, reqparse, abort, Api, Resource
import sqlalchemy
from sqlalchemy.sql import table, column, select, update, insert, delete, func
from sqlalchemy.orm import sessionmaker
import requests
import time
import traceback
import subprocess
from subprocess import PIPE,Popen
import os
app = Flask(__name__)
api = Api(app)
class RestartPython(Resource):
def get(self):
command1 = 'fuser -k 9876/tcp'
proc1 = subprocess.Popen(command1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
#proc1.wait()
(stdout, stderr) = proc1.communicate()
print '.'.join(stdout)
print '.'.join(stderr)
print('kill python process done')
command2 = 'source activate envpy3'
proc2 = subprocess.Popen(command2, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
#proc2.wait()
proc2.communicate()
print('switch python env done')
command3 = 'python ReceiveCall.py'
print(command3)
proc3 = subprocess.Popen(command3, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, shell=True)
#proc3.wait()
proc3.communicate()
print('ReceiveCall started')
return make_response(jsonify({'message': 'Python webservice is restarted', 'status': 'Ok'}), 200)
api.add_resource(RestartPython, '/restart')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8082, debug=True)