Just to imform that my approach works:
if (_import_array() < 0) {
/* Clear the error state since we are handling the error.
*/
PyErr_Clear();
/* ... set up for the
sans-numpy case. */
}
else {
/* ... set up for the
with-numpy case. */
}
It is based on Roberts idea to call PyImport_ImportModule("numpy"); and
check if that succeededand clean up. In fact, _import_array() is doing
this.
The code of _import_array() is in the header file __multiarray_api.h in the
numpy folder of the distributed files:
static int
_import_array(void)
{
int st;
PyObject
*numpy = PyImport_ImportModule("numpy.core.multiarray");
PyObject
*c_api = NULL;
if (numpy == NULL) return -1;
c_api =
PyObject_GetAttrString(numpy, "_ARRAY_API");
if (c_api == NULL)
{Py_DECREF(numpy); return -1;}
if (PyCObject_Check(c_api))
{
PyArray_API = (void
**)PyCObject_AsVoidPtr(c_api);
}
Py_DECREF(c_api);
Py_DECREF(numpy);
if (PyArray_API == NULL) return -1;
/*
Perform runtime check of C API version */
if (NPY_VERSION !=
PyArray_GetNDArrayCVersion()) {
PyErr_Format(PyExc_RuntimeError, "module compiled against
"\
"ABI version %x but this
version of numpy is %x", \
(int)
NPY_VERSION, (int) PyArray_GetNDArrayCVersion());
return
-1;
}
if (NPY_FEATURE_VERSION >
PyArray_GetNDArrayCFeatureVersion()) {
PyErr_Format(PyExc_RuntimeError, "module compiled against
"\
"API version %x but this
version of numpy is %x", \
(int)
NPY_FEATURE_VERSION, (int)
PyArray_GetNDArrayCFeatureVersion());
return -1;
}
/*
* Perform runtime check of endianness and check
it matches the one set by
* the headers (npy_endian.h) as a
safeguard
*/
st = PyArray_GetEndianness();
if (st == NPY_CPU_UNKNOWN_ENDIAN) {
PyErr_Format(PyExc_RuntimeError, "FATAL: module compiled as unknown
endian");
return -1;
}
#if NPY_BYTE_ORDER
==NPY_BIG_ENDIAN
if (st != NPY_CPU_BIG) {
PyErr_Format(PyExc_RuntimeError, "FATAL: module compiled as
"\
"big endian, but detected
different endianness at runtime");
return -1;
}
#elif NPY_BYTE_ORDER == NPY_LITTLE_ENDIAN
if (st !=
NPY_CPU_LITTLE) {
PyErr_Format(PyExc_RuntimeError, "FATAL:
module compiled as "\
"little
endian, but detected different endianness at runtime");
return -1;
}
#endif
return 0;
}
As you can see, this routine is doing the same at the beginning with
additional tests and the return value indicates if ok or not.
So I only had to call PyErr_Clear(); when it failes and the problem is
solved.
Thanks for your input.
Peter
Sent: Wednesday, February 03, 2010 16:57
Subject: Re: [Numpy-discussion] Determine if numpy is installed from
anextension
Ah, that is maybe the
idea:
if (_import_array() < 0) {
/* Clear the
error state since we are handling the error. */
PyErr_Clear();
/* ... set up for the sans-numpy case.
*/
}
else {
/* ... set up for the with-numpy case.
*/
}
I did not call PyErr_Clear() when _import_array() < 0 and the error
is probably still hanging and then given later.
I will try this this evening.
Thank you for the hints.
Peter
On Wed, Feb 3, 2010 at 4:22 PM, Robert Kern
<robert.kern@gmail.com>
wrote:
On Wed, Feb 3, 2010 at 03:41, David Cournapeau <
cournape@gmail.com> wrote:
> On
Wed, Feb 3, 2010 at 5:38 PM, Peter Notebaert <
peno@telenet.be> wrote:
>>
>From an extension? How to import numpy from there and then test if
that
>> succeeded and that without any annoying message if
possible...
>
> One obvious solution would be to simply call
PyImport_Import, something like:
>
> #include
<Python.h>
>
> PyMODINIT_FUNC initfoo(void)
>
{
> PyObject *m, *mod;
>
>
m = Py_InitModule("foo", NULL);
>
if (m == NULL) {
>
return;
>
}
>
> mod =
PyImport_ImportModule("numpy");
> if (mod ==
NULL) {
>
return;
> }
>
Py_DECREF(mod);
Or rather, to recover from the
failed import as the OP wants to do:
mod = PyImport_ImportModule("numpy");
if (mod == NULL)
{
/* Clear the error state since we are handling the
error. */
PyErr_Clear();
/* ... set up for the
sans-numpy case. */
}
else {
Py_DECREF(mod);
import_array();
/* ... set up for the with-numpy case.
*/
}
--
Robert Kern
"I have come to
believe that the whole world is an enigma, a harmless
enigma that is made
terrible by our own mad attempt to interpret it as
though it had an
underlying truth."
-- Umberto Eco
_______________________________________________
NumPy-Discussion
mailing
list
NumPy-Discussion@scipy.org
http://mail.scipy.org/mailman/listinfo/numpy-discussion