I have a main.py that execute file.py using 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

出于某些原因,我需要使用subprocess.Popen来执行这个file.py,以便在main.py中的一些代码执行的同时,file.py做它的事情。

我现在想做的是把exitCodefile.py恢复到main.py

我试着用stdout=subprocess.Pipe,用打印的方式恢复退出代码,但不知道为什么,它没有作用。

获取writer.returncode并不是解决办法,因为它将给我子进程的代码,而不是函数的代码 函数返回exitCode = -2,子进程返回returncode = 0,我需要那个-2。(-2只是一个例子,exitCode并不总是一样的,取决于一些参数。)

5 个评论
使用sys.exit()来终止子进程是否是一种选择?这允许你指定子进程的退出代码,这将反映在writer.returncode中。注意,用sys.exit()可以返回的数值范围是有限的,但也许只用几个小数值就足够了。
这可能是有用的东西,但不是现在。我在执行网址时得到一个代码,这个代码是动态的 @DanielJunglas 没有,但谢谢你的帮助,Buran
Could you be more explicit why using stdout = PIPE does not work? It works fine for me.
stdout = PIPE,由于一些不明显的原因,给我寄回url,而不是exitCode,没有print(url),只有一个print(exitCode)return exitCode
我认为你没有得到返回值的原因是,当你试图得到返回值时,子程序还没有结束。我建议在这里使用asyc await概念。
python
subprocess
benvdg
benvdg
发布于 2020-09-15
1 个回答
Daniel Junglas
Daniel Junglas
发布于 2020-09-15
已采纳
0 人赞同

下面是一个简短的程序,说明如何通过管道或sys.exit()从一个子进程中获得一个数字。请注意,可以从sys.exit()返回的数值范围是有限的。

import sys
import subprocess
def sub():
        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()