Python alt süreci iletişim yöntemini kullanırken çıkış kodu nasıl alınır?


186

Python'un subprocessmodülünü ve communicate()yöntemini kullanırken çıkış kodunu nasıl alabilirim ?

İlgili kod:

import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]

Bunu başka bir şekilde yapmalı mıyım?

Yanıtlar:


266

Popen.communicatereturncodeözelliği tamamlandığında ayarlayacaktır (*). İlgili dokümantasyon bölümü:

Popen.returncode 
  The child return code, set by poll() and wait() (and indirectly by communicate()). 
  A None value indicates that the process hasnt terminated yet.

  A negative value -N indicates that the child was terminated by signal N (Unix only).

Yani sadece yapabilirsin (test etmedim ama işe yaramalı):

import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode

(*) Bu, uygulanma şekli nedeniyle olur: çocuğun akışlarını okumak için iş parçacıkları ayarladıktan sonra, sadece arar wait.


34
Bu örnek bana yardımcı oldu, ancak örnekler "kısaltma olarak sp olarak içe aktarma" modelini belirsiz bir kısaltma olarak standart bir şey içe aktarma modelini yapmasaydı iyi olurdu. Bu, onu izleyen koddan 8 karakter keserken, anlaşılmasını ve yeniden kullanılmasını da zorlaştırır.
uglycoyote

16
@uglycoyote Kopyalayıp yapıştırmanız gerektiğini söyleyen bir kural yoktur. İstediğiniz gibi yeniden yazın, 4 satır gibi.
Jason C

5
@uglycoyote ayrıca böyle bir şey olarak düzenleyebilir from subprocess import Popenve daha sonra muhtemelen okunabilirliği artırır ve satırları kısaltır diyebilirim Popenyerine kullanınsubprocess(or sp).Popen
Mitch

2
Evet ... aramalı process.communicate()ve sonra returncodebir değişkene atamalıyız. Ödev çağrılmadan önce yapılırsa communicate, olur None.
WesternGun

1
Boruyu yönlendirmeden dönüş kodunu göstermek mümkün müdür? Ben bash kodu arıyorum ve çıkış terminalde gerçek zamanlı olarak görmek istiyorum
Nisba

10

Öncelikle, işlemin tamamlandığından ve dönüş kodunun .waityöntem kullanılarak okunduğundan emin olmalısınız . Bu kodu döndürür. Daha sonra erişmek istiyorsanız .returncode, Popennesnede olduğu gibi saklanır .


24
.communicate()zaten alt sürecin sona ermesini bekliyor.
Mekanik salyangoz

8

.poll() dönüş kodunu güncelleyecektir.

Deneyin

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()

Buna ek olarak, sonra .poll()nesneye dönüş kodu olarak adlandırılır child.returncode.


Bunu yaptığımda .poll () boştu. Bunun çalışması için child.communicate () komutunu child.poll () komutunun üzerinde çalıştırmam gerekiyordu.
NateW

1
Belgelere göre .poll () yerine .wait () kullanmak istediğinizi düşünüyorum: docs.python.org/3/library/subprocess.html . .Wait () yönteminin uygun olabilecek isteğe bağlı bir zaman aşımı parametresi aldığını unutmayın.
gg99


1

Bu benim için çalıştı. Ayrıca, alt işlem tarafından döndürülen çıktıyı yazdırır

child = subprocess.Popen(serial_script_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.