我想检索从主程序调用的模块函数的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/

10-12 04:48