Author: Armin Rigo <[email protected]>
Branch:
Changeset: r69710:7532271a94d7
Date: 2014-03-05 10:16 +0100
http://bitbucket.org/pypy/pypy/changeset/7532271a94d7/
Log: Merged in krono/pypy/popen-pclose (pull request #206)
Provide an exit status for popen'ed RFiles via pclose
diff --git a/rpython/rlib/rfile.py b/rpython/rlib/rfile.py
--- a/rpython/rlib/rfile.py
+++ b/rpython/rlib/rfile.py
@@ -125,7 +125,15 @@
rffi.free_nonmovingbuffer(value, ll_value)
def close(self):
+ """Closes the described file.
+
+ Attention! Unlike Python semantics, `close' does not return `None' upon
+ success but `0', to be able to return an exit code for popen'ed files.
+
+ The actual return value may be determined with os.WEXITSTATUS.
+ """
ll_f = self.ll_file
+ res = 0
if ll_f:
# double close is allowed
self.ll_file = lltype.nullptr(FILE)
@@ -133,6 +141,7 @@
if res == -1:
errno = rposix.get_errno()
raise OSError(errno, os.strerror(errno))
+ return res
_do_close = staticmethod(c_close) # overridden in RPopenFile
diff --git a/rpython/rlib/test/test_rfile.py b/rpython/rlib/test/test_rfile.py
--- a/rpython/rlib/test/test_rfile.py
+++ b/rpython/rlib/test/test_rfile.py
@@ -186,7 +186,7 @@
f.close()
-class TestPopen:
+class TestPopen(object):
def setup_class(cls):
if sys.platform == 'win32':
py.test.skip("not for win32")
@@ -196,3 +196,42 @@
s = f.read()
f.close()
assert s == '42\n'
+
+ def test_pclose(self):
+ retval = 32
+ printval = 42
+ cmd = "python -c 'import sys; print %s; sys.exit(%s)'" % (
+ printval, retval)
+ f = rfile.create_popen_file(cmd, "r")
+ s = f.read()
+ r = f.close()
+ assert s == "%s\n" % printval
+ assert os.WEXITSTATUS(r) == retval
+
+class TestPopenR(BaseRtypingTest):
+ def setup_class(cls):
+ if sys.platform == 'win32':
+ py.test.skip("not for win32")
+
+ def test_popen(self):
+ printval = 42
+ cmd = "python -c 'print %s'" % printval
+ def f():
+ f = rfile.create_popen_file(cmd, "r")
+ s = f.read()
+ f.close()
+ assert s == "%s\n" % printval
+ self.interpret(f, [])
+
+ def test_pclose(self):
+ printval = 42
+ retval = 32
+ cmd = "python -c 'import sys; print %s; sys.exit(%s)'" % (
+ printval, retval)
+ def f():
+ f = rfile.create_popen_file(cmd, "r")
+ s = f.read()
+ assert s == "%s\n" % printval
+ return f.close()
+ r = self.interpret(f, [])
+ assert os.WEXITSTATUS(r) == retval
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit