我想在复杂的编号输入和python中调用c编写的函数。我已经尝试过使用SWIG来生成一个包装器 - 但它似乎已经失败了。我想我需要找出适当的'宏'用于numpy.i - 但不确定它是什么 - 任何人都有这方面的经验 - 或者其他方式我可以解决这个问题?
numpy.i在底部显示了这一点 - 尽管它已经被注释掉了。我尝试使用这些宏 - 但它们失败了,SWIG抱怨我尝试过以下宏扩展的语法错误:
%numpy_typemaps(complex float, NPY_CFLOAT , int)
%numpy_typemaps(complex double, NPY_CDOUBLE, int)
%numpy_typemaps(complex long double, NPY_CLONGDOUBLE, int)
这些是我的文件:
ComplexNumbers.c
# include <math.h>
# include <complex.h>
double complex returnX(double complex X)
/*
fresnel reflection coefficient rs
*/
{
return X;
}
ComplexNumbers.i:
%{
#define SWIG_FILE_WITH_INIT
%}
%include "numpy.i"
%init %{
import_array();
%}
%module ComplexNumbers
%inline %{
extern double complex returnX(double complex X);
%}
的Python:
#!/usr/bin/env python
"""
setup.py file for ComplexNumbers
"""
from distutils.core import setup
from distutils.extension import Extension
import numpy
ComplexNumbers_module = Extension('_ComplexNumbers',
sources=['ComplexNumbers_wrap.c',
'ComplexNumbers.c'],
include_dirs=[numpy.get_include()]
)
setup (name = 'ComplexNumbers',
version = '1.0',
author = "JP Hadden jp.hadden@bristol.ac.uk",
description = """Spectral Interfereometry functions""",
ext_modules = [ComplexNumbers_module],
py_modules = ["ComplexNumbers"],
)
编译器输出错误
C:\MinGW32-xy\bin\gcc.exe -mno-cygwin -mdll -O -Wall -IC:\Python27\lib\site-pack
ages\numpy\core\include -IC:\Python27\include -IC:\Python27\PC -c ComplexNumbers
_wrap.c -o build\temp.win32-2.7\Release\complexnumbers_wrap.o
ComplexNumbers_wrap.c:2975:23: error: expected '=', ',', ';', 'asm' or '__attrib
ute__' before 'returnX'
ComplexNumbers_wrap.c: In function '_wrap_returnX':
ComplexNumbers_wrap.c:2982:18: error: expected '=', ',', ';', 'asm' or '__attrib
ute__' before 'arg1'
ComplexNumbers_wrap.c:2982:18: error: 'arg1' undeclared (first use in this funct
ion)
ComplexNumbers_wrap.c:2982:18: note: each undeclared identifier is reported only
once for each function it appears in
ComplexNumbers_wrap.c:2986:18: error: expected '=', ',', ';', 'asm' or '__attrib
ute__' before 'result'
ComplexNumbers_wrap.c:2986:18: error: 'result' undeclared (first use in this fun
ction)
ComplexNumbers_wrap.c:2997:24: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:2997:24: error: pointer value used where a floating point
value was expected
ComplexNumbers_wrap.c:2997:14: error: invalid type argument of unary '*' (have '
double')
ComplexNumbers_wrap.c:3000:20: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3000:20: warning: implicit declaration of function 'return
X'
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: pointer value used where a floating point
value was expected
ComplexNumbers_wrap.c:3001:15: error: expected ')' before 'complex'
ComplexNumbers_wrap.c:3001:15: error: incompatible type for argument 1 of 'memcp
y'
c:\mingw32-xy\bin\../lib/gcc/mingw32/4.5.2/../../../../include/string.h:38:40: n
ote: expected 'void *' but argument is of type 'double'
error: command 'gcc' failed with exit status 1
答案 0 :(得分:3)
我不确定这是如何与Numpy交互的,但SWIG肯定包括对C99复杂类型的支持。我能够通过以下示例验证这一点:
%module test
%{
#include <complex.h>
%}
%include <complex.i>
%inline %{
double complex test(double complex X) {
return X;
}
%}
这使用SWIG complex.i接口。
(注意,这里%inline
用于在一个地方声明,定义和包装 - 方便测试,但对于“真正的”代码,我倾向于使用%include
)。
我用(
)编译了这个(在Linux上)swig -Wall -python test.i
gcc -std=c99 -Wall -Wextra test_wrap.c -I/usr/include/python2.7 -shared -o _test.so
只用一个警告就建好了。一旦完成,我就可以做到:
LD_LIBRARY_PATH=. python
Python 2.7.3 (default, Aug 1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.test(complex(0,1))
1j
>>> test.test(complex(0,2))
2j
>>> test.test(complex(1,2))
(1+2j)
>>>
似乎接受并返回原生Python复杂类型。
我还能够进行以下界面编译:
%{
#define SWIG_FILE_WITH_INIT
#include <complex.h>
%}
%include <complex.i>
%include <numpy.i>
%init %{
import_array();
%}
%numpy_typemaps(complex float, NPY_CFLOAT , int)
%numpy_typemaps(complex double, NPY_CDOUBLE, int)
%numpy_typemaps(complex long double, NPY_CLONGDOUBLE, int)
%module test
%inline %{
double complex test(double complex X) {
return X;
}
%}
在编译器标志中添加%include <complex.i>
和-std=c99
。我认为你可以使用像these options这样的东西来设置distutils。