【问题标题】:How can I get return values with subprocess?如何使用子流程获取返回值?
【发布时间】:2023-03-18 17:27:02
【问题描述】:

我正在编写一个 Python 脚本,它使用子进程调用 python 并处理几个函数,如以下简化代码。 (当然,下面的脚本不起作用。)

如何获取每个函数的返回值?请帮帮我。

import subprocess

p = subprocess.Popen("python", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write("1+3\n")
print p.stdout.read()
p.stdin.write("2+4\n")
print p.stdout.read()

【问题讨论】:

  • @sparkandshine 标记问题时会自动发表评论,只有刷新页面才能看到评论
  • 您的示例不是处理函数,它看起来像是在尝试评估几个表达式。请说明你想要做什么。
  • @sparkandshine 谢谢,但我不认为我的问题与您提到的问题重复。我会参考它以进一步理解。
  • 不相关:不要将python脚本作为子进程运行,导入相应的模块并调用所需的函数。如果你需要在单独的进程中运行 Python 代码,你可以使用multiprocessing,见Call python script with input with in a python script using subprocess

标签: python python-2.7 subprocess


【解决方案1】:

如果您以非交互方式打开 python,则它会等到它读取所有标准输入后再运行脚本,因此您的示例将无法运行。如果您编写命令,然后在阅读之前关闭标准输入,如下所示,您可以获得结果。

import subprocess

p = subprocess.Popen("python", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write("print 1+3\n")
p.stdin.write("print 2+4\n")
p.stdin.close()
print p.stdout.read()

或者,使用“-i”强制python进入交互模式:

import subprocess

p = subprocess.Popen(["python", "-i"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
p.stdin.write("1+3\n")
print p.stdout.readline()
p.stdin.write("2+4\n")
print p.stdout.readline()
p.stdin.write("4+6\n")
print p.stdout.readline()
p.stdin.close()

这会产生:

Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> >>> 4

>>> 6

>>> 10

【讨论】:

  • 另外,您可以强制 python 与 -i 交互,然后在每个语句之后调用 print p.stdout.readline()
  • 我认为你的评论是 OP 正在寻找的。​​span>
  • 1- 在第一个代码示例中,您应该使用 p.communicate("\n".join(["print 1+3", "print 2+4"])) 而不是 .write().read()。 2- 第二个代码示例 如果在循环中执行 如果python 可能返回多于/少于一行作为响应,例如r'print "\n"*10**6'(相应的 OS 管道缓冲区可能已填满并且发生死锁:子进程将尝试打印到完整的标准输出缓冲区,而父进程将尝试写入完整的标准输入缓冲区)
猜你喜欢
  • 2019-08-04
  • 1970-01-01
  • 2012-02-20
  • 2018-12-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
相关资源
最近更新 更多