[Numpy-svn] r8139 - in trunk/numpy/core/src: multiarray private

numpy-svn@scip... numpy-svn@scip...
Sat Feb 20 12:06:00 CST 2010


Author: ptvirtan
Date: 2010-02-20 12:06:00 -0600 (Sat, 20 Feb 2010)
New Revision: 8139

Modified:
   trunk/numpy/core/src/multiarray/methods.c
   trunk/numpy/core/src/multiarray/multiarraymodule.c
   trunk/numpy/core/src/private/npy_3kcompat.h
Log:
3K: BUG: fix tofile/fromfile on Py3 by dup-ing the file descriptor before fdopening -- works around issues in flushing data

Modified: trunk/numpy/core/src/multiarray/methods.c
===================================================================
--- trunk/numpy/core/src/multiarray/methods.c	2010-02-20 18:05:41 UTC (rev 8138)
+++ trunk/numpy/core/src/multiarray/methods.c	2010-02-20 18:06:00 UTC (rev 8139)
@@ -498,7 +498,11 @@
     else {
         Py_INCREF(file);
     }
-    fd = npy_PyFile_AsFile(file, "wb");
+#if defined(NPY_PY3K)
+    fd = npy_PyFile_Dup(file, "wb");
+#else
+    fd = PyFile_AsFile(file);
+#endif
     if (fd == NULL) {
         PyErr_SetString(PyExc_IOError, "first argument must be a " \
                         "string or open file");
@@ -506,6 +510,9 @@
         return NULL;
     }
     ret = PyArray_ToFile(self, fd, sep, format);
+#if defined(NPY_PY3K)
+    fclose(fd);
+#endif
     Py_DECREF(file);
     if (ret < 0) {
         return NULL;

Modified: trunk/numpy/core/src/multiarray/multiarraymodule.c
===================================================================
--- trunk/numpy/core/src/multiarray/multiarraymodule.c	2010-02-20 18:05:41 UTC (rev 8138)
+++ trunk/numpy/core/src/multiarray/multiarraymodule.c	2010-02-20 18:06:00 UTC (rev 8139)
@@ -1723,7 +1723,11 @@
     else {
         Py_INCREF(file);
     }
-    fp = npy_PyFile_AsFile(file, "rb");
+#if defined(NPY_PY3K)
+    fp = npy_PyFile_Dup(file, "rb");
+#else
+    fp = PyFile_AsFile(file);
+#endif
     if (fp == NULL) {
         PyErr_SetString(PyExc_IOError,
                 "first argument must be an open file");
@@ -1734,6 +1738,9 @@
         type = PyArray_DescrFromType(PyArray_DEFAULT);
     }
     ret = PyArray_FromFile(fp, type, (intp) nin, sep);
+#if defined(NPY_PY3K)
+    fclose(fp);
+#endif
     Py_DECREF(file);
     return ret;
 }

Modified: trunk/numpy/core/src/private/npy_3kcompat.h
===================================================================
--- trunk/numpy/core/src/private/npy_3kcompat.h	2010-02-20 18:05:41 UTC (rev 8138)
+++ trunk/numpy/core/src/private/npy_3kcompat.h	2010-02-20 18:06:00 UTC (rev 8139)
@@ -134,18 +134,27 @@
  */
 #if defined(NPY_PY3K)
 static NPY_INLINE FILE*
-npy_PyFile_AsFile(PyObject *file, char *mode)
+npy_PyFile_Dup(PyObject *file, char *mode)
 {
-    int fd;
+    int fd, fd2;
+    PyObject *ret, *os;
     fd = PyObject_AsFileDescriptor(file);
     if (fd == -1) {
         return NULL;
     }
-#warning XXX -- who releases the FILE* returned by fdopen? fclose() closes the file...
-    return fdopen(fd, mode);
+    os = PyImport_ImportModule("os");
+    if (os == NULL) {
+        return NULL;
+    }
+    ret = PyObject_CallMethod(os, "dup", "i", fd);
+    Py_DECREF(os);
+    if (ret == NULL) {
+        return NULL;
+    }
+    fd2 = PyNumber_AsSsize_t(ret, NULL);
+    Py_DECREF(ret);
+    return fdopen(fd2, mode);
 }
-#else
-#define npy_PyFile_AsFile(file, mode) PyFile_AsFile(file)
 #endif
 
 static NPY_INLINE PyObject*



More information about the Numpy-svn mailing list