我想检索从主程序调用的模块函数的stdout,stderr和resultcode。我以为子流程是关键,但是我没有成功将模块功能提交给子流程。
我有的:
#my_module.py
def run(args):
do stuff
print this
return THAT
if name == "__main__":
args = read_args()
run(args)
。
#my_main_script.py
import subprocess as sp
import my_module
p = sp.Popen(my_module.run(args), stdout=sp.PIPE, stderr=sp.PIPE)
out, err = p.communicate()
result = p.resultcode
发生了什么:
显然,子流程模块使用my_module.run()返回的THAT进行了某些操作,从而引发了崩溃:
如果
THAT = list_of_lists
错误:AttributeError: "sublist" object has no attribute rfind
如果
THAT = ["a","b",0]
错误:TypeError: execv() arg 2 must contain only strings
如果THAT = ["a","b"]
错误:OSError: [Errno 2] No such file or directory
因此,子进程显然希望THAT是包含文件路径的列表?
最佳答案
您没有以正确的方式使用子流程:
sp.Popen(["./my_module.py", "arg1", "arg2"], stdout=sp.PIPE, stderr=sp.PIPE)
顺便说一句,如果您没有使用
sys.exit(retcode)
函数正确退出程序,将不会得到任何结果代码。最终脚本如下所示:
#my_module.py
def run(args):
do stuff
print this
return THAT
if name == "__main__":
import sys
args = read_args()
sys.exit(run(args))
#my_main_script.py
import subprocess as sp
p = sp.Popen(["./my_module.py", "arg1", "arg2"], stdout=sp.PIPE, stderr=sp.PIPE)
out, err = p.communicate()
result = p.returncode
关于python - 子流程中模块的Python调用函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31513350/