Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SWIG和distutils包装包含Python API的C代码在Mac 10.8 64位上失败_Python_C_Numpy_Osx Mountain Lion_Swig - Fatal编程技术网

使用SWIG和distutils包装包含Python API的C代码在Mac 10.8 64位上失败

使用SWIG和distutils包装包含Python API的C代码在Mac 10.8 64位上失败,python,c,numpy,osx-mountain-lion,swig,Python,C,Numpy,Osx Mountain Lion,Swig,一段时间以来,我一直试图将现有的C代码包装到Python模块中,但我一直遇到反复出现的错误和失败的构建。。。在广泛阅读了这个论坛上可用的文档和帖子之后,我想知道是否有人知道它为什么不起作用 我想使用stsci.imagemanip.interp2d.expand2d函数,它由一个调用使用python.h库的C函数的python脚本组成。这是在Mac10.8 64位和Python2.7下实现的 我不熟悉将C函数包装到Python中,我决定使用SWIG和distutils 我的输入文件如下: >

一段时间以来,我一直试图将现有的C代码包装到Python模块中,但我一直遇到反复出现的错误和失败的构建。。。在广泛阅读了这个论坛上可用的文档和帖子之后,我想知道是否有人知道它为什么不起作用

我想使用stsci.imagemanip.interp2d.expand2d函数,它由一个调用使用python.h库的C函数的python脚本组成。这是在Mac10.8 64位和Python2.7下实现的

我不熟悉将C函数包装到Python中,我决定使用SWIG和distutils

我的输入文件如下:

>>> from bilinearinterp import bilinearinterp as lininterp
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "bilinearinterp.py", line 28, in <module>
    _bilinearinterp = swig_import_helper()
  File "bilinearinterp.py", line 24, in swig_import_helper
    _mod = imp.load_module('_bilinearinterp', fp, pathname, description)
ImportError: dlopen(./_bilinearinterp.so, 2): Symbol not found: _bilinearinterp
  Referenced from: ./_bilinearinterp.so
  Expected in: flat namespace
 in ./_bilinearinterp.so
双线性插值

/* bilinearinterp.i */
%module bilinearinterp

%{
#define SWIG_FILE_WITH_INIT
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <stdio.h>
#include <Python.h>
#include <math.h>
#include <numpy/arrayobject.h>
#include "bilinearinterp.h"
%}

static PyObject * bilinearinterp(PyObject *obj, PyObject *args);
/* bilinearinterp.i */
%module bilinearinterp

%{
static PyObject * bilinearinterp(PyObject *obj, PyObject *args);
%}

static PyObject * bilinearinterp(PyObject *obj, PyObject *args);
setup.py

#!/usr/bin/env python

from distutils.core import setup, Extension

bilinearinterp_module = Extension('_bilinearinterp',
                                  sources = ['bilinearinterp_wrap.c','bilinearinterp.c'],
# Path to locate numpy/arrayobject.h     
                                  include_dirs=['/Library/Python/2.7/site-packages/numpy-override/numpy/core/include'])

setup (name = 'bilinearinterp',
       version = '1.1',
       author      = "Space Telescope Science Institute - stsci_python",
       description = """bilinear interpretation for 2D array extrapolation""",
       ext_modules = [bilinearinterp_module],
       py_modules = ["bilinearinterp"],
       )
然后在终端中运行以下操作:

>>>swig -python bilinearinterp.i
>>>python setup.py build_ext --inplace
正在创建相应的文件: _BilinerInterp.so BilinerInterp.py BilinerInterp.pyc BilinerInterp_wrap.c 以及包含一些文件的构建目录

当setup.py正在运行但似乎已完成时,我会收到警告。 在各种测试中,我反复犯了两个错误:

警告:使用不推荐的NumPy API,请通过定义NPY_NO_不推荐的NPY_API NPY_1_7_API_版本[-Wwarnings]来禁用它

这可能会引发与numpy相关的其他几个警告

警告:函数“bilinearinterp”具有内部链接,但未定义[-Wundefined internal]静态PyObject*bilinearinterpPyObject*obj,PyObject*参数;BilineInterp_wrap.c:2971:24:注意:此处使用的结果=PyObject*BilineInterparg1,arg2

然后,在python脚本中调用模块时,我得到以下结果:

>>> from bilinearinterp import bilinearinterp as lininterp
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "bilinearinterp.py", line 28, in <module>
    _bilinearinterp = swig_import_helper()
  File "bilinearinterp.py", line 24, in swig_import_helper
    _mod = imp.load_module('_bilinearinterp', fp, pathname, description)
ImportError: dlopen(./_bilinearinterp.so, 2): Symbol not found: _bilinearinterp
  Referenced from: ./_bilinearinterp.so
  Expected in: flat namespace
 in ./_bilinearinterp.so
我使用以下方法编译:

>>>swig -python -o bilinearinterp_wrap.c bilinearinterp.i
>>>gcc -c -fpic bilinearinterp.c bilinearinterp_wrap.c
-I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
-I/System//Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/include
bilinearinterp_wrap.c:2955:19: warning: function 'bilinearinterp' has internal
      linkage but is not defined [-Wundefined-internal]
static PyObject * bilinearinterp(PyObject *obj, PyObject *args);
                  ^
bilinearinterp_wrap.c:2971:24: note: used here
  result = (PyObject *)bilinearinterp(arg1,arg2);
                       ^
1 warning generated.
>>>gcc -bundle -flat_namespace -undefined suppress bilinearinterp.o bilinearinterp_wrap.o -o _bilinearinterp.so
然后我仍然在python解释器中得到相同的导入错误。 这可能是由于我的numpy安装或我的gcc参数


谢谢

嗯,我不太明白你想达到什么目的,但我看到了一些不好的做法。例如,将bilinearinterp everywhere设置为静态,静态函数不会导出,只能在实现的同一模块中使用。我认为读一点关于SWIG设计思想的书会很有帮助。当然,这需要一些时间,但您将从更广阔的角度了解SWIG的功能和不足。

您将SWIG和Python C扩展混合在一起,这是不同的事情。阅读如何构建Python SWIG模块。感谢您指出这一点!按照介绍中的示例,仅将函数声明保留在接口文件中,我仍然会遇到gcc的编译问题。请参阅上面的编辑。在一个稍微不同的轨道上,您是否考虑过用cython而不是SWIG包装您的C代码?这可能会帮你省去很多目前正在处理的麻烦。这让我觉得我可能在方法上完全错了。由于我对将C代码包装到Python的理解有限,我花了一段时间才理解我想要使用的C代码已经使用Python.h库和numpy C-API进行了包装。因此,我想做的是添加一个名为bilinearinterp的python模块,它使用bilinearinterp.c。单独使用distutils应该可以做到这一点,而且不需要swig。我的新方法对吗?
>>>swig -python -o bilinearinterp_wrap.c bilinearinterp.i
>>>gcc -c -fpic bilinearinterp.c bilinearinterp_wrap.c
-I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
-I/System//Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy/core/include
bilinearinterp_wrap.c:2955:19: warning: function 'bilinearinterp' has internal
      linkage but is not defined [-Wundefined-internal]
static PyObject * bilinearinterp(PyObject *obj, PyObject *args);
                  ^
bilinearinterp_wrap.c:2971:24: note: used here
  result = (PyObject *)bilinearinterp(arg1,arg2);
                       ^
1 warning generated.
>>>gcc -bundle -flat_namespace -undefined suppress bilinearinterp.o bilinearinterp_wrap.o -o _bilinearinterp.so