【问题标题】:Get return value from python script executed with subprocess.Popen [duplicate]从使用 subprocess.Popen 执行的 python 脚本中获取返回值 [重复]
【发布时间】:2021-01-02 02:45:30
【问题描述】:

我有一个main.py 使用subprocess.Popen 执行file.py

# 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 并不总是相同,取决​​于一些参数。)

【问题讨论】:

  • 是否可以选择使用sys.exit() 终止子进程?这允许您指定子进程的退出代码,然后将反映在writer.returncode 中。请注意,您可以使用 sys.exit() 返回的值范围是有限的,但可能只使用几个小值就足够了。
  • 这可能对其他东西有用,但不是现在。我从 url 执行中得到一个代码,该代码是动态的 @DanielJunglas 不,但感谢您帮助 buran
  • 您能否更明确地说为什么使用stdout = PIPE 不起作用?它对我来说很好。
  • stdout = PIPE,由于某种不明原因,给我发回url,而不是exitCode,没有print(url),只有print(exitCode)return exitCode跨度>
  • 我认为你没有得到返回值的原因是因为当你尝试获取返回值时子程序还没有结束。我建议在这里使用 asyc await 概念

标签: python subprocess


【解决方案1】:

这是一个简短的程序,说明如何通过管道或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

【讨论】:

  • 你可以试试 writer.stdout=subprocess.popen.......
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2015-09-30
相关资源
最近更新 更多