AutoIt StdoutRead 不会将 python 日志记录模块捕获到 stdout

问题描述 投票:0回答:1

我试图在我的 AutoIt 调用脚本中获取 python 脚本执行的完整 stdout 输出,我只是注意到标准日志记录调用没有被 autoit 中的 StdoutRead 函数捕获。

#include "Constants.au3"
#pragma compile(Console, true)
#AutoIt3Wrapper_Change2CUI=Y



Func ExecTestScript($command, $useEnv="")
    Local $line
    Local $pid = Run("cmd.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    StdinWrite($pid, 'cd "' & @ScriptDir & '"' & @CRLF)
    If StringLen($useEnv) > 0 Then
        StdinWrite($pid, "conda activate " & $useEnv & @CRLF)
    EndIf
    Local $cmd = $command & @CRLF
    ConsoleWrite($cmd & @CRLF)
    StdinWrite($pid, $cmd)
    StdinWrite($pid, "exit" & @CRLF)
    Local $nChars
    While 1
        $nChars = StdoutRead($pid)
        If @error Then ExitLoop
        If @extended > 0 Then
            ConsoleWrite("++ " & $nChars & @CRLF)
            $line &= $nChars
        EndIf
    WEnd
    ProcessClose($pid)
    return $line
EndFunc

Local $res = ExecTestScript('python myTestScript.py', 'py38')

我的简单Python脚本

import logging

logging.warning("Warning this could HURT!")

print(f'Hello world!')

这是我的 autoit 脚本的调试输出。

AutoIt Output

正如您所看到的,记录指令出现在 SciTe 输出中,但不是通过我的脚本(以绿色记录)。 当 DOS 命令提示符打开时,SciTe 输出还会捕获 Microsoft 消息。

有人对这个问题有解决方案或想法吗?

python stdout command-prompt autoit scite
1个回答
0
投票

感谢@Stephan指出了这个问题的根本原因。我修改了我的代码以包含 stderr。 python 脚本还需要显式地将日志记录级别设置为“调试”。这是自动脚本。

#include "Constants.au3"
#pragma compile(Console, true)
#AutoIt3Wrapper_Change2CUI=Y



Func ExecTestScript($command, $useEnv="")
    Local $line
    Local $pid = Run("cmd.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
    StdinWrite($pid, 'cd "' & @ScriptDir & '"' & @CRLF)
    If StringLen($useEnv) > 0 Then
        StdinWrite($pid, "conda activate " & $useEnv & @CRLF)
    EndIf
    Local $cmd = $command & @CRLF
    ConsoleWrite($cmd & @CRLF)
    StdinWrite($pid, $cmd)
    StdinWrite($pid, "exit" & @CRLF)
    Local $nChars
    While 1
        $nChars = StdoutRead($pid)

        If @error Then ExitLoop
        If @extended > 0 Then
            ConsoleWrite("+ " & $nChars & @CRLF)
            $line &= $nChars
        EndIf
        $nChars = StderrRead($pid)
        If @error Then ExitLoop
        If @extended > 0 Then
            ConsoleWrite("> " & $nChars & @CRLF)
            $line &= $nChars
        EndIf
    WEnd
    ProcessClose($pid)
    return $line
EndFunc

Local $res = ExecTestScript('python myTestScript.py', 'py38')

Python 脚本。

import logging
import sys
import time

#~ logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.getLogger().setLevel(logging.DEBUG)

logging.debug("Harmless debug Message")
time.sleep(0.1)
logging.info("Just an information")
time.sleep(0.1)
logging.warning("Warning this could HURT!")
time.sleep(0.1)
logging.error("Did you try to divide by zero")
time.sleep(0.1)
logging.critical("Internet is down")
time.sleep(0.1)

print(f'Hello world!')

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.