【问题标题】:Running script via subprocess.Popen with return value通过 subprocess.Popen 运行脚本并返回值
【发布时间】:2016-06-22 13:34:05
【问题描述】:

我有一个简单的脚本,其结构如下:

if __name__ =='main':
    #do some logic
    #print to console the result

现在,我使用 subprocess.Popen() 方法通过代码运行脚本,如下所示:

p = subprocess.Popen(
  ["python", path_of_script_to_run] + arguments_list, 
  stdout=subprocess.PIPE,
  stderr=subprocess.PIPE)

我的问题是如何使用返回值或其他方法将运行脚本中的值返回给调用脚本。

我不能在 if __name__ =='main': 的上下文中使用 return 那么这是否意味着我不能将要在调用脚本中分配的返回值传递给p 变量?
我还想尝试避免将脚本的打印结果解析到控制台..

【问题讨论】:

  • list + list 在 python 中是一个连接的列表
  • 可以使用exit设置返回码。例如,假设您要返回 2,只需执行 exit(2)
  • 我想传递一个整数元组之类的东西,例如 (1,5)
  • 最好的方法是导入要运行的脚本并调用返回所需数据的方法。请参阅 JF Sebastian stackoverflow.com/questions/30664263/… 的回答
  • 将数据写入stdout 并让父脚本解析它是很常见的。但是,如果脚本还输出了其他难以解析的内容,那么您就有问题了。也许那个子脚本应该有一个“简洁模式”标志,告诉它停止闲聊,只返回一个容易解析的结果。

标签: python subprocess


【解决方案1】:

使用communicate() 检索脚本的输出。和returncode 获取退出代码。

p = subprocess.Popen(
  ["python", path_of_script_to_run] + arguments_list, 
  stdout=subprocess.PIPE,
  stderr=subprocess.PIPE)

(stdoutdata, stderrdata) = p.communicate()
exit_code = p.returncode

要让您的其他脚本返回退出代码,您应该使用sys.exit(code)

import sys
if __name__ =='main':
    try:
        # do stuff
        sys.exit(0)
    except Exception as err:
        print(err)
        sys.exit(1)

【讨论】:

  • 但是我如何从正在运行的脚本的上下文中传递返回代码,尝试编写 return [something],因为你得到语法错误 - 'return' out of function
  • 在你的脚本中使用sys.exit(code)
【解决方案2】:

您可以使用subprocess.check_output() 捕获调用脚本中的输出:

from subprocess import check_output
result = check_output(args).decode()

要同时捕获结果中的标准错误,请使用stderr=subprocess.STDOUT

【讨论】:

  • 但是我如何从正在运行的脚本的上下文中传递返回代码,尝试编写 return [something],因为你得到语法错误 - 'return' out of function
  • @JavaSa 只是 print 吗?
  • 这正是我想要避免的,打印和解析打印比返回值更弱
  • 但我想我做不到
  • @JavaSa,更多的是您没有非常清楚地解释“返回”的含义。如果您希望 Python 解释器以该状态退出,这很容易,但您所要求的并不明显。
猜你喜欢
  • 2021-05-30
  • 2011-09-20
  • 2023-03-26
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多