标签: python-c-extension

如何在python中使用C扩展来绕过GIL

我想在多个内核中运行Python中的cpu密集型程序,并试图找出如何编写C扩展来执行此操作.是否有任何代码示例或教程?

python python-c-extension

11
推荐指数
3
解决办法
5313
查看次数

二进制上传后,easy_install因错误"无法找到设置脚本"而失败?

上传我的Python C扩展的二进制发行版后python setup.py bdist upload,easy_install [my-package-name]失败"错误:无法在/ tmp/easy_install/package-name-etc-etc中找到安装脚本".

我究竟做错了什么?

python binary easy-install python-c-extension

11
推荐指数
2
解决办法
2万
查看次数

C数组到PyArray

我在不使用Cython的情况下编写Python C-Extension.

我想在C中分配一个double数组,在内部函数中使用它(恰好在Fortran中)并返回它.我指出C-Fortran接口在C中完美运行.

static PyObject *
Py_drecur(PyObject *self, PyObject *args)
{
  // INPUT
  int n;
  int ipoly;
  double al;
  double be;

  if (!PyArg_ParseTuple(args, "iidd", &n, &ipoly, &al, &be))
    return NULL;

  // OUTPUT
  int nd = 1;
  npy_intp dims[] = {n};
  double a[n];
  double b[n];
  int ierr;

  drecur_(n, ipoly, al, be, a, b, ierr);

  // Create PyArray
  PyObject* alpha = PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, a);
  PyObject* beta = PyArray_SimpleNewFromData(nd, dims, NPY_DOUBLE, b);

  Py_INCREF(alpha);
  Py_INCREF(beta);

  return Py_BuildValue("OO", alpha, beta);
}
Run Code Online (Sandbox Code Playgroud)

我调试了这段代码,当我尝试从a创建alpha时,我遇到了Segmentation错误.到那里一切正常.功能drecur_工作,如果删除它我会遇到同样的问题.

现在,围绕C数据定义PyArray的标准方法是什么?我找到了文档,但没有很好的例子.还有,内存泄漏怎么样?返回之前INCREF是否正确,以便保留alpha和beta的实例?那些不再需要的解除分配怎么样?

编辑 …

python numpy python-c-api python-c-extension

11
推荐指数
1
解决办法
1万
查看次数

使用gcc编译Python C-extension时"......无法弄清楚......的架构类型"问题

我刚刚从Snow Leopard升级到Lion,而我必须更新的旧python c扩展程序不想正确编译.我真的不知道该怎么做.任何可以帮助我的人都可以编译好吗?它在Snow Leopard中编译得很好.

Home:folder Me$ python setup.py build
running build
running build_ext
building 'ccookies' extension
gcc -fno-strict-aliasing -fno-common -dynamic -arch ppc -arch i386 -g -O2 -DNDEBUG -g -O3 -I/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/include -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c ccookies.c -o build/temp.macosx-10.3-fat-2.7/ccookies.o
llvm-gcc-4.2: error trying to exec '/Developer/usr/bin//../llvm-gcc-4.2/bin/powerpc-apple-darwin11-llvm-gcc-4.2': execvp: No such file or directory
In file included from /usr/include/architecture/i386/math.h:630,
                 from /usr/include/math.h:28,
                 from /Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/pyport.h:312,
                 from /Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/Python.h:58,
                 from ccookies.c:5:
/usr/include/AvailabilityMacros.h:109:14: warning: #warning Building for Intel with Mac OS X Deployment Target < 10.4 is invalid.
lipo: can't figure out …
Run Code Online (Sandbox Code Playgroud)

gcc python-c-extension osx-lion

10
推荐指数
1
解决办法
8260
查看次数

使用C扩展python:将列表传递给PyArg_ParseTuple

我一直在尝试用C扩展python,到目前为止,基于文档,我在编写小型C函数和使用Python扩展它方面取得了相当大的成功.

但是,我现在遇到了一个相当简单的问题 - 我无法找到解决方案.所以,我想做的是传递double list给我的C函数.例如,要传递int,我执行以下操作:

int squared(int n)
{
    if (n > 0)
        return n*n;
    else
        return 0;
}

static PyObject*
squaredfunc(PyObject* self, PyObject* args)
{
    int n;

    if (!PyArg_ParseTuple(args, "i", &n))
        return NULL;

    return Py_BuildValue("i", squared(n));
}
Run Code Online (Sandbox Code Playgroud)

这将int n没有任何问题传递给我的C函数命名squared.

但是,如何将一个传递list给C函数?我确实尝试谷歌并阅读文档,到目前为止,我还没有找到任何有用的东西.

如果有人能指出我正确的方向,我真的很感激.

谢谢.

c python python-c-api python-c-extension

10
推荐指数
2
解决办法
1万
查看次数

python c扩展,在mac os上使用dlopen的问题

我已经把一个库作为二进制库(.a)和头文件分发,编写了一些c ++代码,并希望将结果包装在python模块中.

我已经这样做了这里.

问题是,在Mac OSX上导入此模块时(我已经尝试过10.5和10.6),我收到以下错误:

dlopen(/Library/Python/2.5/site-packages/dirac.so, 2): Symbol not found: _DisposePtr
  Referenced from: /Library/Python/2.5/site-packages/dirac.so
  Expected in: dynamic lookup
Run Code Online (Sandbox Code Playgroud)

这看起来像Carbon框架中定义的符号没有得到妥善解决,但我不知道该怎么做.我提供-framework Carbondistutil.core.Extensionextra_link_args参数,所以我不知道我应该做些什么.

任何帮助将非常感激.

更新:

setup.py生成的编译行如下所示:

gcc -fno-strict-aliasing -Wno-long-double -no-cpp-precomp -mno-fused-madd -fno-common -dynamic -DNDEBUG -g -Os -Wall -Wstrict-prototypes -DMACOSX -I/usr/include/ffi -DENABLE_DTRACE -arch i386 -arch ppc -pipe -Isource -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/Extras/lib/python/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/numarray/numpy -I/usr/lib/python/2.5/site-packages/numpy/numarray -I/usr/lib/python/2.5/site-packages/numpy/core/include -I/System/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -c source/Dirac_LE.cpp -o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o
Run Code Online (Sandbox Code Playgroud)

链接器行如下所示:

g++ -Wl,-F. -bundle -undefined dynamic_lookup -arch i386 -arch ppc build/temp.macosx-10.5-i386-2.5/diracmodule.o build/temp.macosx-10.5-i386-2.5/source/Dirac_LE.o -Llibs/MacOSX -lDiracLE -o build/lib.macosx-10.5-i386-2.5/dirac.so -framework Carbon …
Run Code Online (Sandbox Code Playgroud)

python linker dlopen python-c-extension setup.py

9
推荐指数
1
解决办法
1634
查看次数

对于Python C Extensions,使用Py_DECREF而不是Py_XDECREF有什么好处?

我正在使用Python C Extension文档来定义新类型,并且刚刚完成了对数据属性提供更精细的控制部分.

在本节中,他们更改示例代码以确保结构的firstlast属性Noddy永远不会NULL,例如通过将属性初始化为空字符串new并添加TypeError在用户尝试删除或以其他方式设置这些属性时引发的getter和setter 到Null.

此外(和我的问题点),笔者改变了所有的Py_XDECREFPy_DECREF这些属性,指出:

通过这些更改,我们可以确保第一个和最后一个成员永远不会为NULL,因此我们几乎可以在所有情况下删除对NULL值的检查.这意味着大多数Py_XDECREF()调用都可以转换为Py_DECREF()调用.我们无法更改这些调用的唯一地方是在deallocator中,这些成员的初始化可能在构造函数中失败.

在我看来,使用它会更安全Py_XDECREF,因为它会Py_DECREF导致a segmentation fault传递一个NULL值.

使用Py_DECREF结束有Py_XDECREF什么好处?

python python-c-api python-c-extension

9
推荐指数
1
解决办法
1376
查看次数

有没有理由在PyMem_Malloc上使用malloc?

我正在阅读Python C扩展中的内存管理文档,据我所知,似乎没有太多理由使用malloc而不是PyMem_Malloc.假设我想分配一个不暴露给Python源代码的数组,并将存储在一个将被垃圾收集的对象中.有什么理由可以使用malloc吗?

c python malloc python-c-extension

8
推荐指数
2
解决办法
3878
查看次数

发布GIL的成本是多少?

假设我有一个C扩展函数,它可以完全独立于Python解释器.有没有理由释放GIL?

例如,有没有理由不写这样的代码(除了可读性和避免微优化之类的问题 - 重要但与我的问题无关的事情)?

Py_BEGIN_ALLOW_THREADS
    a = 1 + 1;
Py_END_ALLOW_THREADS
Run Code Online (Sandbox Code Playgroud)

显然,这是一个简单的代码,其中性能可能无关紧要.但有没有任何表现理由不在这里发布GIL?或者只应发布GIL以获得更多CPU密集型代码?

python multithreading gil python-c-extension

8
推荐指数
1
解决办法
1464
查看次数

在Python中,如何判断模块是否来自C扩展?

如果导入的模块来自C扩展而不是纯Python模块,那么从Python中判断出正确或最强大的方法是什么?这很有用,例如,如果Python包具有既包含纯Python实现又包含C实现的模块,并且您希望能够在运行时告知正在使用哪个模块.

一个想法是检查文件扩展名module.__file__,但我不确定应该检查所有文件扩展名,以及这种方法是否必须最可靠.

python python-c-extension extension-modules

8
推荐指数
2
解决办法
2527
查看次数