Miałem zadzwonić do polecenia Shell

subprocess.Popen(command, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

Ja to zrobiłem. i:

I to polecenie jest drukowane Druki, takie jak Verbose, jest włączona, a następnie, gdy to zrobiono, jest to zadanie, które drukuje (pisze) blah blah : Ready

Muszę zadzwonić do tego polecenia, poczekaj na tekst "gotowy" i pozostaw go działa na tle, a następnie pozwól reszcie kodu uruchomić

Próbowałem tego i rzeczy takie jak , nie działały

...
done=False
with subprocess.Popen(command, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) as proc:
  while not done:
    x=proc.stdout.read()
    x=x.find('Ready')
    if x > -1:
      done=True
  print("YaaaY, this subprocess is done it's job and now running on background")
  #rest of the code

Pobiegłem podobnym (edytowanym) kodem na terminalu Pythona i myślę, że nie mogę nawet uzyskać dostępu (czytać) terminalu podprocesyjnej. dlatego... KONSOLUJĄCE KONCENKUJE

Spodziewałem się, że pokaże każdą linię, którą drukuje ten podprocess, ale. to tylko czeka.

0
norahCii 21 kwiecień 2021, 03:52

1 odpowiedź

Najlepsza odpowiedź

Twój problem jest proc.stdout.read(). Odczytuje to całe wyjście podjednostki, która nie jest znana, dopóki nie zakończył (zwykle). Spróbuj czegoś takiego:

output = b''
while not done:
  output += proc.stdout.read(1)
  x = output.find(b'Ready')
  if x > -1:
    done = True

Odczytuje ten typ procesu jeden znak na raz, więc nie musi czekać na zakończenie.

Należy zauważyć, że użycie Popen w bloku kontekstu ({x1}} bloku) spowoduje, że twój program będzie czekać na zakończenie procesu dziecka, zanim wychodzi z blokady with, więc nie zostanie to uruchomione przeszłość tego punktu. To jest niejasne, jeśli to jest pożądane zachowanie, czy nie.

1
Oli 21 kwiecień 2021, 14:09