Nano Hash - криптовалюты, майнинг, программирование

Выполнить подпроцесс, выводящий на стандартный вывод, дождаться текста и затем продолжить выполнение основного скрипта.

В Python 3, как я могу:

  1. Выполнить процесс и вывести его стандартный вывод на стандартный вывод,
  2. Следите за стандартным выводом, чтобы дождаться некоторого текста, и
  3. Продолжить выполнение моей программы Python, не останавливая процесс после того, как текст будет найден, и не останавливая его вывод на стандартный вывод.

живой вывод команды подпроцесса не является дубликатом, потому что все ответы там не позволяйте вашему коду Python продолжать работу и выводите стандартный вывод процесса.

Я предполагаю, что решение будет включать в себя какой-то поток, сопрограмму или задачу.

21.05.2020

  • Немного непрямой подход, так что просто прокомментирую, но что, если вы разветвитесь на уровне ОС? Выполнить процесс с флагом &? Не знаю, сработает ли. Просто идея. bashitout.com/2013/05/18/Ampersands- в командной строке.html 21.05.2020
  • Точный дубликат Выполнить подпроцесс, который печатает в стандартный вывод и ждать текста, позволяя продолжить выполнение после того, как текст будет виден 21.05.2020
  • @jordanm: StackOverflow специально говорит, что вы можете открыть новый вопрос, если вопрос закрыт. Пожалуйста, подумайте, полезны ли ваши действия. 21.05.2020
  • @Neil: Интересная идея, но я не думаю, что она сработает, потому что мне все еще нужно как-то обработать данные stdout. Также я бы не стал запускать свою команду через оболочку (как правило, плохая идея). 21.05.2020
  • @Timmmm Я не знал, что политика изменилась. В прошлом предполагалось, что вы отредактируете свой существующий вопрос и проголосуете за его повторное открытие. Кнопка «закрыть» -> «дубликат» использовалась для обозначения точного дубликата. 21.05.2020
  • В любом случае, я бы начал с оригинальной вещи, которую я связал. Попробуйте выполнить p.stdout = sys.stdout и прервите цикл, чтобы продолжить вывод на стандартный вывод. 21.05.2020
  • О, интересная идея, я бы не подумал, что это сработает, но я попробую. 21.05.2020
  • К сожалению, это не сработало. Я думаю, что вам действительно нужно что-то вроде p.stdout.pipe(sys.stdout), но я пока не нашел ничего подобного. 21.05.2020

Ответы:


1

Относительно простой подход — запустить новый поток для копирования stdout процесса в stdout Python после того, как вы закончите его обработку. Вот пример запуска webpack-dev-server и извлечения из него URL-адреса (на самом деле не реализовано):

#!/usr/bin/env python3

import subprocess
import sys
import os
from threading import Thread

from typing import IO

def pipe(a: IO[bytes], b: IO[bytes]):
  for x in a:
    b.write(x)
    b.flush()


process = subprocess.Popen(
  [
    "node_modules/.bin/webpack-dev-server",
    # Note that I had to add --colour because for some reason
    # webpack-dev-server detects stdout as supporting colour,
    # but not stderr.
    "--color",
    # This prints a progress bar using ANSI escape characters
    # which works too!
    "--progress",
  ],
  cwd=".",
  env=dict(os.environ, NODE_ENV="development"),
  stdout=subprocess.PIPE,
)

for line in process.stdout:
  sys.stdout.buffer.write(line)
  # Flush is necessary otherwise stdout will buffer more
  # than one line.
  sys.stdout.buffer.flush()

  # Process the text however you want.
  if b"Project is running at" in line:
    print("Server started at address ??")
    break

# Start a thread to do the pipe copying.
thread = Thread(target=pipe, args=(process.stdout, sys.stdout.buffer))
thread.start()

print("Now we can do other stuff and the process will continue to print to stdout")

Обратите внимание, что я не подумал о надлежащей очистке — выходе из потока, закрытии файлов и т. д.

21.05.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..