如何在 Python 脚本中包装 bash shell 会话,以便 Python 可以将 stdout 和 stderr 存储到数据库,并偶尔写入 stdin?
我尝试使用带有类似 tee 的 Python 类的 subprocess 来重定向 IO,但它似乎使用 fileno 来完全绕过 Python。
外壳.py:
import os
import sys
from StringIO import StringIO
from subprocess import Popen, PIPE
class TeeFile(StringIO):
def __init__(self, file, auto_flush=False):
#super(TeeFile, self).__init__()
StringIO.__init__(self)
self.file = file
self.auto_flush = auto_flush
self.length = 0
def write(self, s):
print 'writing' # This is never called!!!
self.length += len(s)
self.file.write(s)
#super(TeeFile, self).write(s)
StringIO.write(self, s)
if self.auto_flush:
self.file.flush()
def flush(self):
self.file.flush()
StringIO.flush(self)
def fileno(self):
return self.file.fileno()
cmd = ' '.join(sys.argv[1:])
stderr = TeeFile(sys.stderr, True)
stdout = TeeFile(sys.stdout, True)
p = Popen(cmd, shell=True, stdin=PIPE, stdout=stdout, stderr=stderr, close_fds=True)
例如 Runningpython shell.py ping google.com
运行正确的命令并显示输出,但 Python 永远不会看到标准输出。