Python tail-like 文件读取
Python tail-like file read
在测试中,我将 stderr
重定向到文件并尝试以 tail-like 方式读取它。
所以这里是重定向:
class RedirectedEnv(object):
def __init__(self, stderr=None):
self._stderr = stderr or sys.stderr
def __enter__(self):
self.old_stderr = sys.stderr
self.old_stderr.flush()
self.old_exit = getattr(sys, 'exit')
sys.stderr = self._stderr
def mock_exit():
raise Exception
sys.exit = mock_exit
def __exit__(self, exc_type, exc_val, exc_tb):
self._stderr.flush()
sys.stderr = self.old_stderr
sys.exit = self.old_exit
self._stderr.close()
及其用法:
def test_invalid_args(self):
with RedirectedEnv(stderr=tempfile.NamedTemporaryFile()):
for args in [['-id', '123456789.00'], ['-i'], ['-i', '0'], ['-i', '../some_invalid_path/not_exist.json']]:
try:
self.parser.parse(args)
except Exception:
sys.stderr.flush()
self.assertTrue(sys.stderr.readlines()[0].startswith("usage:")) <<-- here I need help
有什么优雅的方法可以做到这一点吗? (不要把 enumerate
和 tell()
和 seek()
搞得一团糟)也许有一些 FIFO queue
和文件接口?
您可以为每个测试创建一个新文件,然后查找到最前面以获取其值。我搬到 TemporaryFile
因为你不使用文件名。
def test_invalid_args(self):
for args in [['-id', '123456789.00'], ['-i'], ['-i', '0'], ['-i', '../some_invalid_path/not_exist.json']]:
with RedirectedEnv(stderr=tempfile.TemporaryFile()):
try:
self.parser.parse(args)
raise AssertionError("should have failed")
except Exception:
sys.stderr.seek(0)
self.assertTrue(sys.stderr.readline().startswith("usage:"))
在测试中,我将 stderr
重定向到文件并尝试以 tail-like 方式读取它。
所以这里是重定向:
class RedirectedEnv(object):
def __init__(self, stderr=None):
self._stderr = stderr or sys.stderr
def __enter__(self):
self.old_stderr = sys.stderr
self.old_stderr.flush()
self.old_exit = getattr(sys, 'exit')
sys.stderr = self._stderr
def mock_exit():
raise Exception
sys.exit = mock_exit
def __exit__(self, exc_type, exc_val, exc_tb):
self._stderr.flush()
sys.stderr = self.old_stderr
sys.exit = self.old_exit
self._stderr.close()
及其用法:
def test_invalid_args(self):
with RedirectedEnv(stderr=tempfile.NamedTemporaryFile()):
for args in [['-id', '123456789.00'], ['-i'], ['-i', '0'], ['-i', '../some_invalid_path/not_exist.json']]:
try:
self.parser.parse(args)
except Exception:
sys.stderr.flush()
self.assertTrue(sys.stderr.readlines()[0].startswith("usage:")) <<-- here I need help
有什么优雅的方法可以做到这一点吗? (不要把 enumerate
和 tell()
和 seek()
搞得一团糟)也许有一些 FIFO queue
和文件接口?
您可以为每个测试创建一个新文件,然后查找到最前面以获取其值。我搬到 TemporaryFile
因为你不使用文件名。
def test_invalid_args(self):
for args in [['-id', '123456789.00'], ['-i'], ['-i', '0'], ['-i', '../some_invalid_path/not_exist.json']]:
with RedirectedEnv(stderr=tempfile.TemporaryFile()):
try:
self.parser.parse(args)
raise AssertionError("should have failed")
except Exception:
sys.stderr.seek(0)
self.assertTrue(sys.stderr.readline().startswith("usage:"))