如何在调用 python 脚本时捕获 python 脚本的结果?

How can I capture the result of a python script in calling python script?

python.

的新手

我正在尝试从 python 脚本调用 python 脚本,除了捕获结果外,我大部分都成功了。

a.py

status = subprocess.call("python /hosting/apps/b.py"+" "+server+" "+port+" "+sid, shell=True)

b.py

在第二个脚本中,我正在做一些计算并尝试使用 print 和 return

传回一个名为 status 的变量
print status;
return status;

这似乎不起作用。这是正确的做法吗?

return 不会 return 来自模块(即文件)的值;这仅适用于使用 def 关键字创建的函数。您可以设置 sys.stdout。参见 Redirect stdout to a file in Python?

您可以在变量中使用 subprocess.check_output() rather than subprocess.call() to retrieve the content of the standard output (in which you have written with print and not return as (已注明)。此方法非常通用,不限于 python 脚本(您可以调用任何可访问的可执行文件)。

status = subprocess.check_output("python /hosting/apps/b.py"+" "+server+" "+port+" "+sid, shell=True)

但是,您将检索需要解析的字符串形式的输出(在执行 b.py 期间打印的所有内容)。您可能想要做的是在 b.py 模块中定义一个函数:

## b.py
def main(server, port, sid):
  # Do things
  return status

并从 a.py 调用它(前提是 b 在你的 sys.path 中):

## a.py
import b
status = b.main(server, port, sid)

评论中建议的两个选项可能是您最好的选择。以下是一些小的工作示例:

这里,b.py设置status为当前时间,并打印出来。

b.py

import time

status = time.time()

print status

a.py(子进程)

import subprocess

p = subprocess.Popen('python -u b.py', stdout=subprocess.PIPE)

(out,_) = p.communicate()

b_status = out

print b_status

输出:

1427685638.46

(注意,这里额外的 space 是有意的,b_status 将有一个尾随换行符。这一点要记住。)

a.py(导入)

import b

b_status = b.status   # Directly access b.py's status variable

print b_status

输出:

1427685801.45
1427685801.45

请注意,使用第二种方法,status会显示两次。一次在 b.py 的 print status 中,一次在 a.py 的 print b_status 中。不要让它让您感到困惑,b_status 仅包含时间戳,并且没有像第一种方法那样的尾随换行符。

(其实第一种方法也是"displayed"两次,只是b.py的输出被a.py捕获了,b_status就是这样使用该方法时设置。)

总的来说,我认为导入是更好的选择,因为打印和解析更容易出错。