我试图在我的 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 脚本的调试输出。
正如您所看到的,记录指令出现在 SciTe 输出中,但不是通过我的脚本(以绿色记录)。 当 DOS 命令提示符打开时,SciTe 输出还会捕获 Microsoft 消息。
有人对这个问题有解决方案或想法吗?
感谢@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!')