From: Antoine Pitrou Date: Wed, 9 Dec 2009 00:03:16 +0000 (+0000) Subject: Merged revisions 76723 via svnmerge from X-Git-Tag: v3.1.2rc1~277 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=53b44f75c1f7dc2ad5e1ccd0171d8b19bbb3005a;p=thirdparty%2FPython%2Fcpython.git Merged revisions 76723 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r76723 | antoine.pitrou | 2009-12-09 01:01:27 +0100 (mer., 09 déc. 2009) | 3 lines Issue #7461: objects returned by os.popen() should support the context manager protocol ........ --- diff --git a/Lib/os.py b/Lib/os.py index a59c5df1f6c8..7c342feb4326 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -650,6 +650,10 @@ class _wrap_close: return returncode else: return returncode << 8 # Shift left to match old behavior + def __enter__(self): + return self + def __exit__(self, *args): + self.close() def __getattr__(self, name): return getattr(self._stream, name) def __iter__(self): diff --git a/Lib/test/test_popen.py b/Lib/test/test_popen.py index 99ad41df749b..24fb846bef10 100644 --- a/Lib/test/test_popen.py +++ b/Lib/test/test_popen.py @@ -49,6 +49,14 @@ class PopenTest(unittest.TestCase): else: self.assertEqual(os.popen("exit 42").close(), 42 << 8) + def test_contextmanager(self): + with os.popen("echo hello") as f: + self.assertEqual(f.read(), "hello\n") + + def test_iterating(self): + with os.popen("echo hello") as f: + self.assertEqual(list(f), ["hello\n"]) + def test_main(): support.run_unittest(PopenTest)