4

我使用 Python 2.7。这是我目前正在做的从 Python 启动其他程序,将 STDOUT 和 STERR 重定向到 LOGFILE:

    try:
    # Execute command and print content to LOGFILE
        tempname = os.path.abspath('./text.txt')
        TEMPFILE = open(tempname, 'wb')
        print 'Executing: ', command
        subprocess.check_call(command, shell = True, stdout = TEMPFILE, stderr = TEMPFILE)
        TEMPFILE.close()
        LOGFILE.write(open(tempname, 'rU').read())
        LOGFILE.close()
        os.remove(tempname)
    except Exception as errmsg:
    # If fails then print errors to LOGFILE
        TEMPFILE.close()
        LOGFILE.write(open(tempname, 'rU').read())
        os.remove(tempname)
        print messages.crit_error_bad_command % command, '\n', str(errmsg)
        print >> LOGFILE, messages.crit_error_bad_command % command, '\n', str(errmsg)
        LOGFILE.close() 

首先,我不确定我上面的脚本是最好的解决方案。我不得不使用临时文件,因为即使在 subprocess.check_call 调用失败的情况下我也想捕获日志。如果您有想法如何改进上述脚本,我将不胜感激。

此外,我想更改此设置,以便 STDOUT 和 STDERR 正常显示在屏幕上,并且也显示到日志文件中。我该怎么做呢?请注意,如果我不指定 STDOUT,我会看到类似“有错误,您希望继续 [y/n]?”之类的内容。在屏幕上,然后我可以对它做出反应。现在因为一切都进入日志,我在屏幕上看不到任何东西。我在这里的问题的答案应该有助于解决这个问题。

谢谢。

4

1 回答 1

1

我会看到诸如“出现错误,您要继续 [y/n] 吗?”之类的内容。在屏幕上,然后我可以对它做出反应。

要重定向子进程的标准输出并手动或使用预定义的答案与进程交互,您可以使用pexpect

from contextlib import closing
import pexpect

with open('text.txt', 'rb') as logfile:
    with closing(pexpect.spawn(command, logfile=logfile)) as child:
        # call here child.expect(), child.sendline(), child.interact(), etc

使用 实现相同的功能subprocess.Popen非易事

于 2012-06-28T03:18:34.397 回答