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

时间:2015-03-30 02:26:04

标签: python return subprocess

新手在python中。

我正在尝试从python脚本中调用python脚本,因为除了捕获结果之外,其中大部分都是成功的。

a.py

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

b.py

在第二个脚本中,我正在进行一些计算并尝试使用print返回一个名为status的变量并返回

print status;
return status;

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

3 个答案:

答案 0 :(得分:1)

您可以使用subprocess.check_output()而不是subprocess.call()来检索标准输出的内容(您使用print而不是return编写BBrown })在变量中。这种方法很通用,不仅限于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)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

此处,b.pystatus设置为当前时间,并将其打印出来。

<强> 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

(注意,这里有额外的空间,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只包含时间戳,没有像第一种方法那样的尾随换行符。

(事实上,它在第一种方法中也“显示”两次,但b.py的输出由a.py捕获,这是使用该方法时设置b_status的方式。)< / p>

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