วิธีรับรหัสออกเมื่อใช้วิธีการสื่อสารการประมวลผลย่อย Python


186

ฉันจะเรียกรหัสทางออกเมื่อใช้subprocessโมดูลPython และcommunicate()วิธีการได้อย่างไร

รหัสที่เกี่ยวข้อง:

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

ฉันควรจะทำเช่นนี้อีกทาง?

คำตอบ:


266

Popen.communicateจะตั้งค่าreturncodeแอตทริบิวต์เมื่อดำเนินการเสร็จแล้ว (*) นี่คือส่วนเอกสารที่เกี่ยวข้อง:

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).

ดังนั้นคุณสามารถทำได้ (ฉันไม่ได้ทดสอบ แต่ควรใช้งานได้):

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

(*) นี้เกิดขึ้นเนื่องจากวิธีการที่จะได้ดำเนินการ: waitหลังจากตั้งค่าหัวข้อการอ่านลำธารของเด็กก็แค่โทร


34
ตัวอย่างนี้ช่วยฉัน แต่มันจะดีถ้าตัวอย่างไม่ได้ทำรูปแบบ "import subprocess as sp" ของการนำเข้าบางสิ่งบางอย่างมาตรฐานเป็นตัวย่อที่ไม่ชัดเจน ในขณะที่นี่จดจ้องรหัสอักขระ 8 ตัวที่ตามมามันทำให้ยากต่อการเข้าใจและนำมาใช้ใหม่
uglycoyote

16
@uglycoyote ไม่มีกฎที่บอกว่าคุณต้องคัดลอกและวาง เพียงพิมพ์อีกครั้งตามที่คุณต้องการมันก็เหมือนกับ 4 เส้น
Jason C

5
@uglycoyote คุณยังสามารถแก้ไขมันจะเป็นสิ่งที่ชอบfrom subprocess import Popenและจากนั้นเพียงแค่ใช้Popenแทนsubprocess(or sp).Popenซึ่งผมว่าอาจจะเพิ่มความสามารถในการอ่านและลดระยะเส้น
มิทช์

2
ใช่ ... ต้องโทรprocess.communicate()แล้วมอบหมายreturncodeให้ตัวแปรบางตัว หากได้รับมอบหมายจะทำก่อนที่จะเรียกเป็นcommunicate None
WesternGun

1
เป็นไปได้หรือไม่ที่จะแสดงรหัสส่งคืนโดยไม่เปลี่ยนเส้นทางไปป์ ฉันกำลังเรียกรหัสทุบตีและฉันต้องการที่จะเห็นผลลัพธ์ในเวลาจริงใน terminal
Nisba

10

คุณควรตรวจสอบให้แน่ใจว่ากระบวนการทำงานเสร็จสมบูรณ์และอ่านรหัสส่งคืนโดยใช้.waitวิธีการนั้น นี่จะส่งคืนรหัส หากคุณต้องการเข้าถึงในภายหลังมันจะถูกเก็บไว้.returncodeในPopenวัตถุ


24
.communicate()รอให้กระบวนการย่อยสิ้นสุดแล้ว
หอยทากเครื่องกล

8

.poll() จะอัปเดตโค้ดส่งคืน

ลอง

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

นอกจากนี้หลังจากที่เรียกว่ารหัสการส่งคืนมีอยู่ในวัตถุที่เป็น.poll()child.returncode


เมื่อฉันทำ. poll () นี้ว่างเปล่า ฉันต้องเรียกใช้ child.communicate () ในบรรทัดด้านบน child.poll () เพื่อให้ทำงานได้
NateW

1
ฉันคิดว่าคุณหมายถึงการใช้ .wait () แทน .poll () ตามเอกสาร: docs.python.org/3/library/subprocess.html โปรดทราบว่า. wait () ใช้พารามิเตอร์การหมดเวลาที่ไม่จำเป็นซึ่งสะดวกสบาย
gg99

7

exitcode = data.wait(). กระบวนการลูกจะถูกบล็อกหากมันเขียนลงในเอาต์พุต / ข้อผิดพลาดมาตรฐานและ / หรืออ่านจากอินพุตมาตรฐานและไม่มีเพียร์


1

สิ่งนี้ใช้ได้สำหรับฉัน นอกจากนี้ยังพิมพ์เอาต์พุตที่ส่งคืนโดยกระบวนการชายด์

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.