从python到robot框架的日志记录不适用于subprocess.call

从python到robot框架的日志记录不适用于subprocess.call,python,logging,robotframework,Python,Logging,Robotframework,我有一个名为Log的函数,它将日志字符串写入robot框架日志文件。 如果我从定义了该函数的.py内调用该函数,它将按预期登录到output.html。但是,如果我从另一个python函数init.py调用此函数,而init.py又使用subprocess.call从A.py本身调用,则它不会登录到output.html。它只是忽略了这一点。 A.py: def Log( logString,typeOfLog): ts = time.time() st = da

我有一个名为Log的函数,它将日志字符串写入robot框架日志文件。 如果我从定义了该函数的.py内调用该函数,它将按预期登录到output.html。但是,如果我从另一个python函数init.py调用此函数,而init.py又使用subprocess.call从A.py本身调用,则它不会登录到output.html。它只是忽略了这一点。 A.py:

def Log( logString,typeOfLog):
        ts = time.time()
        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
        print(st)
        if typeOfLog=="INFO":
                logger.console(st + '  ' + logString)
                logger.info(logString)
        elif typeOfLog=="DEBUG":
                logger.console(st + '  ' + logString)
                logger.debug(logString)
        elif typeOfLog=="WARN":
                logger.console(st + '  ' + logString)
                logger.warn(logString)
        elif typeOfLog=="ERROR":
                logger.console(st + '  ' + logString)
                logger.error(st + '  ' + logString)
        elif typeOfLog=="":
                logger.console(logString)
                logger.trace(logString)
.
.
.
.
def Test():
        Log("My debug statement in DEPLOY.PY","INFO")----->gets logged to output.html
        ret = subprocess.call("python init.py", shell=True)
        .
        .
        .
from A import Log
from robot.api import logger
def initfunc1():
        Log("Something","INFO")------>this does not get logged to output.html

initfunc1()
init.py的代码:

def Log( logString,typeOfLog):
        ts = time.time()
        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
        print(st)
        if typeOfLog=="INFO":
                logger.console(st + '  ' + logString)
                logger.info(logString)
        elif typeOfLog=="DEBUG":
                logger.console(st + '  ' + logString)
                logger.debug(logString)
        elif typeOfLog=="WARN":
                logger.console(st + '  ' + logString)
                logger.warn(logString)
        elif typeOfLog=="ERROR":
                logger.console(st + '  ' + logString)
                logger.error(st + '  ' + logString)
        elif typeOfLog=="":
                logger.console(logString)
                logger.trace(logString)
.
.
.
.
def Test():
        Log("My debug statement in DEPLOY.PY","INFO")----->gets logged to output.html
        ret = subprocess.call("python init.py", shell=True)
        .
        .
        .
from A import Log
from robot.api import logger
def initfunc1():
        Log("Something","INFO")------>this does not get logged to output.html

initfunc1()
如果有人能解释为什么会发生这种情况,以及如何按照预期从init.py调用Log函数并登录到output.html,这将对我有很大帮助


提前感谢。

子流程.call开始的流程无法访问Robot Framework(RF)执行上下文,而Robot Framework(RF)执行上下文是Robot Framework(RF)将日志消息写入RF输出文件(output.xml、log.html等)所必需的。在这种情况下,由于进程无法找到上下文,
robot.api.logger
将使用python日志模块记录消息,请参阅以了解详细信息


为了从子进程获取到robot日志的输出,您可以使用
子进程.run
而不是
子进程.call
来捕获子进程的输出,并将捕获的输出记录到RF输出。另请参阅RF以了解从RF执行进程的另一种方法。

什么是
记录器
?我已从robot.api导入了它,以便可以从python登录到robot framework控制台。.A中的
记录器
是什么?相同的?你告诉它在哪里输出到
output.html
yes在A.py中也是一样的。有一个名为robot.api的包公开robot框架的api。因此,我使用该包中的logger模块从python代码中记录到robot框架。我没有明确提到在任何地方登录output.html。但当我运行robot脚本(该脚本反过来调用A.py的Test())时,它会自动创建output.html,其中包含使用logger.info等记录的日志。我假设问题是,当使用
子流程时,两个python实例完全分离,这意味着它们中只有一个可以同时写入
output.html
。然而,我并不精通该框架,也无法帮助您。如果可能,最好根本不使用子流程。