如何在调用 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
就是这样使用该方法时设置。)
总的来说,我认为导入是更好的选择,因为打印和解析更容易出错。
python.
的新手我正在尝试从 python 脚本调用 python 脚本,除了捕获结果外,我大部分都成功了。
a.py
status = subprocess.call("python /hosting/apps/b.py"+" "+server+" "+port+" "+sid, shell=True)
b.py
在第二个脚本中,我正在做一些计算并尝试使用 print 和 return
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
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
就是这样使用该方法时设置。)
总的来说,我认为导入是更好的选择,因为打印和解析更容易出错。