รับค่าส่งคืนจากสคริปต์ python ที่ดำเนินการด้วย subprocess.Popen [ซ้ำ]

Sep 15 2020

ฉันมีmain.pyที่ดำเนินการfile.pyโดยใช้subprocess.Popen:

# Execute request
url = "http://something:50001/dosomething/run"
test = ["python", "file.py", "url", url]
writer = subprocess.Popen(test, shell=False)

File.py เรียกใช้ฟังก์ชันที่ได้รับ "รหัสออก" เมื่อขอ url:

exitCode = None
answer = requests.get(url)
janswer = answer.json()
exitCode = janswer.get("exitCode")
return exitCode

ด้วยเหตุผลบางอย่างฉันต้องดำเนินการfile.pyโดยใช้subprocess.Popenเพื่อให้โค้ดบางตัวmain.pyดำเนินการในขณะที่file.pyทำสิ่งต่างๆ

สิ่งที่ฉันพยายามที่จะทำตอนนี้คือการกู้คืนexitCodeจากการfile.pymain.py

ฉันพยายามใช้stdout=subprocess.Pipeและกู้คืนรหัสทางออกด้วยการพิมพ์ แต่ด้วยเหตุผลบางประการมันไม่ได้ผล

การได้รับwriter.returncodeไม่ใช่วิธีแก้ปัญหาเพราะจะให้รหัสจากกระบวนการย่อยแก่ฉันไม่ใช่จากการส่งคืนฟังก์ชันฟังก์ชันการส่งคืนexitCode = -2กระบวนการย่อยreturncode = 0ฉันต้องการ -2 (-2 เป็นเพียงตัวอย่างexitCodeไม่เหมือนกันตลอดเวลาและขึ้นอยู่กับพารามิเตอร์บางอย่าง)

คำตอบ

DanielJunglas Sep 15 2020 at 18:07

นี่คือโปรแกรมสั้น ๆ sys.exit()ที่แสดงให้เห็นถึงวิธีการที่คุณจะได้รับหมายเลขจากกระบวนการย่อยทั้งผ่านทางท่อหรือ โปรดทราบว่าช่วงของค่าที่สามารถส่งคืนได้sys.exit()นั้นมี จำกัด

import sys
import subprocess

def sub():
    try:
        print(42)
    except:
        # Print something even in case of an exception                          
        print(-1)
        raise
    sys.exit(43)

def main():
    writer = subprocess.Popen(["python3", sys.argv[0], "sub"],
                              stdout = subprocess.PIPE)
    for line in writer.stdout:
        print(int(line))
    exitcode = writer.wait()
    print('exitcode', exitcode)

if len(sys.argv) > 1 and sys.argv[1] == 'sub':
    sub()
else:
    main()

นี้พิมพ์

42
exitcode 43