新手在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;
这似乎不起作用。这是正确的做法吗?
答案 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.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
(注意,这里有额外的空间,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>
一般来说,我认为导入是一个更好的选择,因为打印和解析它更容易出错。