Как я могу получить вывод команды запуска с использованием подпроцесса в режиме реального времени? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть маршрут колбы, который использует модуль подпроцесса для вызова скрипта Python на сервере.Моя проблема в том, что этот скрипт загружает файлы, и время, которое требуется для этого, определить невозможно.Я хочу как-то обновить клиента, получив выходные данные подпроцесса.Вот весь маршрут:

@app.route("/adyen_request_download", methods=["POST", "GET"])
def adyen_request_download():
    merchant_manager = MerchantManager()
    error = None
    if request.method == "POST":
        pfjs = []
        prefixes = []
        extensions = []
        ftpd = "/var/ftp/CONTROLE_TESTE"
        for result in request.get_json():
            if result["name"] == "pfj-select":
                pfjs.append(result["value"])
            if result["name"] == "prefix-select":
                prefixes.append(result["value"])
            if result["name"] == "extension-select":
                extensions.append(result["value"])
            if result["name"] == "start-date":
                start_date = result["value"]

        logging.info(f"Requisição de download manual de arquivos realizada.")
        logging.info(f">> PFJs: {str(pfjs)}")
        logging.info(f">> Prefixos: {str(prefixes)}")
        logging.info(f">> Extensões: {str(extensions)}")
        logging.info(f">> Data: {start_date}")
        if prefixes and not extensions:
            run_command = f'python ../InputDataController/acquirer_file_downloader.py --acquirer "adyen" --pfj {" ".join(pfjs)} --prefix {" ".join(prefixes)} --date "{start_date}" --ftpd "{ftpd}" --force'
        elif extensions and not prefixes:
            run_command = f'python ../InputDataController/acquirer_file_downloader.py --acquirer "adyen" --pfj {" ".join(pfjs)} --ext {" ".join(extensions)} --date "{start_date}" --ftpd "{ftpd}" --force'
        elif not prefixes and not extensions:
            run_command = f'python ../InputDataController/acquirer_file_downloader.py --acquirer "adyen" --pfj {" ".join(pfjs)} --date "{start_date}" --ftpd "{ftpd}" --force'
        elif prefixes and extensions:
            run_command = f'python ../InputDataController/acquirer_file_downloader.py --acquirer "adyen" --pfj {" ".join(pfjs)} --prefix {" ".join(prefixes)} --ext {" ".join(extensions)} --date "{start_date}" --ftpd "{ftpd}" --force'
        subprocess.run(run_command, shell=True) # HERE <<<<<<<
    return json.dumps({"result": "ok"})

Я видел метод getoutput , но это не совсем то, что я хочу, мне нужно получить вывод оболочки в в реальном времени в каком-то файле.Возможно ли это?

1 Ответ

0 голосов
/ 14 ноября 2018

Согласно документации , subprocess.run имеет аргумент stdout. Поэтому я предполагаю, что если вы передадите ему обработчик файла, вывод будет записан в режиме реального времени, и вы сможете прочитать его.

Нечто подобное (не проверено):

with open(yourfile, "r+") as output_file:
    subprocess.run(run_command, shell=True, stdout=output_file)
    // loop to read the file while subprocess running
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...