1 new commit in py:

https://bitbucket.org/hpk42/py/commits/a990113bb086/
Changeset:   a990113bb086
User:        hpk42
Date:        2014-07-05 17:15:46
Summary:     make sure that forked functions run with auto-flushing 
stdout/stderr
so that if they segfault we get to see stdout/stderr.
Affected #:  5 files

diff -r 6698f8b49b78c6489c932ce95ebda8dac2a3655d -r 
a990113bb086420f36489082fdc5220f46c6f8d0 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -5,6 +5,10 @@
   methods to allow adding information in the boxed process.
   Thanks Marc Schlaich.
 
+- ForkedFunc in the child opens in "auto-flush" mode for
+  stdout/stderr so that when a subprocess dies you can see
+  its output even if it didn't flush itself.
+
 - refactor traceback generation in light of pytest issue 364
   (shortening tracebacks).   you can now set a new traceback style 
   on a per-entry basis such that a caller can force entries to be 

diff -r 6698f8b49b78c6489c932ce95ebda8dac2a3655d -r 
a990113bb086420f36489082fdc5220f46c6f8d0 py/__init__.py
--- a/py/__init__.py
+++ b/py/__init__.py
@@ -8,7 +8,7 @@
 
 (c) Holger Krekel and others, 2004-2013
 """
-__version__ = '1.4.21.dev2'
+__version__ = '1.4.21.dev3'
 
 from py import _apipkg
 

diff -r 6698f8b49b78c6489c932ce95ebda8dac2a3655d -r 
a990113bb086420f36489082fdc5220f46c6f8d0 py/_process/forkedfunc.py
--- a/py/_process/forkedfunc.py
+++ b/py/_process/forkedfunc.py
@@ -36,6 +36,19 @@
         sys.stderr.flush()
 
 
+def get_unbuffered_io(fd, filename):
+    f = open(str(filename), "w")
+    if fd != f.fileno():
+        os.dup2(f.fileno(), fd)
+    class AutoFlush:
+        def write(self, data):
+            f.write(data)
+            f.flush()
+        def __getattr__(self, name):
+            return getattr(f, name)
+    return AutoFlush()
+
+
 class ForkedFunc(HookMixin):
     EXITSTATUS_EXCEPTION = 3
 
@@ -63,14 +76,8 @@
     def _child(self, nice_level):
         # right now we need to call a function, but first we need to
         # map all IO that might happen
-        sys.stdout = stdout = open(str(self.STDOUT), "w")
-        fdstdout = stdout.fileno()
-        if fdstdout != 1:
-            os.dup2(fdstdout, 1)
-        sys.stderr = stderr = open(str(self.STDERR), "w")
-        fdstderr = stderr.fileno()
-        if fdstderr != 2:
-            os.dup2(fdstderr, 2)
+        sys.stdout = stdout = get_unbuffered_io(1, self.STDOUT)
+        sys.stderr = stderr = get_unbuffered_io(2, self.STDERR)
         retvalf = self.RETVAL.open("wb")
         EXITSTATUS = 0
         try:

diff -r 6698f8b49b78c6489c932ce95ebda8dac2a3655d -r 
a990113bb086420f36489082fdc5220f46c6f8d0 setup.py
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@
         name='py',
         description='library with cross-python path, ini-parsing, io, code, 
log facilities',
         long_description = open('README.txt').read(),
-        version='1.4.21.dev2',
+        version='1.4.21.dev3',
         url='http://pylib.readthedocs.org/',
         license='MIT license',
         platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],

diff -r 6698f8b49b78c6489c932ce95ebda8dac2a3655d -r 
a990113bb086420f36489082fdc5220f46c6f8d0 testing/process/test_forkedfunc.py
--- a/testing/process/test_forkedfunc.py
+++ b/testing/process/test_forkedfunc.py
@@ -56,6 +56,15 @@
     assert result.out == "s"
 
 
+def test_forkedfunc_on_stdout():
+    def boxf3():
+        import sys
+        sys.stdout.write("hello\n")
+        os.kill(os.getpid(), 11)
+    result = py.process.ForkedFunc(boxf3).waitfinish()
+    assert result.signal == 11
+    assert result.out == "hello\n"
+
 def test_forkedfunc_signal():
     result = py.process.ForkedFunc(boxseg).waitfinish()
     assert result.retval is None

Repository URL: https://bitbucket.org/hpk42/py/

--

This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
_______________________________________________
pytest-commit mailing list
pytest-commit@python.org
https://mail.python.org/mailman/listinfo/pytest-commit

Reply via email to