在为C++库编写Cython包装器时,我遇到了一个不清楚如何正确决定何时删除某些C++实例的情况.
C++库看起来像这样:
#include <stdio.h>
#include <string.h>
class Widget {
char *name;
public:
Widget() : name(strdup("a widget")) {}
~Widget() { printf("Widget destruct\n"); }
void foo() { printf("Widget::foo %s\n", this->name); }
};
class Sprocket {
private:
Widget *important;
public:
Sprocket(Widget* important) : important(important) {}
~Sprocket() { important->foo(); }
};
Run Code Online (Sandbox Code Playgroud)
这个库的一个重要方面是Sprocket析构函数使用了Widget*它,因此Widget必须在它之后才能销毁Sprocket它.
我写的Cython包装器看起来像这样:
cdef extern from "somelib.h":
cdef cppclass Widget:
pass
cdef cppclass Sprocket:
Sprocket(Widget*)
cdef class PyWidget:
cdef Widget *thisptr
def __init__(self):
self.thisptr = new …Run Code Online (Sandbox Code Playgroud) 我想为python包创建一个setup.py脚本,其中包含几个依赖于cython和f2py的子模块.我试图使用setuptools和numpy.distutils,但到目前为止失败了:
我可以使用setuptools编译我的cython扩展(并为包的其余部分创建一个安装).但是,我无法弄清楚如何使用setuptools来生成f2py扩展.经过广泛的搜索,我只发现了像这样的旧消息,声明必须使用numpy.distutils编译f2py模块.
我可以使用numpy.distutils编译我的f2py扩展(并为包的其余部分创建安装).但是,我一直无法弄清楚如何让numpy.distutils编译我的cython扩展,因为它总是尝试使用pyrex来编译它(我使用的是特定于cython的扩展).我已经做了一个搜索来弄清楚如何为cython文件获取numpy.distutils - 至少在一年前 - 他们建议将一个猴子补丁应用于numpy.distutils.似乎应用这样的猴子补丁也限制了可以传递给Cython的选项.
我的问题是:为依赖于f2py和cython的软件包编写setup.py脚本的推荐方法是什么?是否应用numpy.distutils补丁真的要走了吗?
换一种说法: *.h/*.c --[??POSSIBLE??]--> *.pxd/*.pyx
好.我已经(我希望)在互联网上进行了足够的挖掘 - 但我认为这是一个很好的问题所以我会直截了当地问.
有一些相关的问题(例如,生成python绑定,使用什么方法/程序或在Python中包装C库:C,Cython或ctypes?)但是我不能总结我所问的情况也许是为了更"高级"的方法(特别是对于现有的库,而不是从python生成新的C).
在使用Cython之前,我已经掌握了一些经验.Cython对速度和可维护性赞不绝口.在我的书中可以使用小/单位代码 - 但是,这次我在我的板块上有更多...
遵循程序员的三大优点中的第一个 - 我希望尽可能少地完成这项工作.
所以真正的问题是如何通过.pxd和可能的.pyx文件的自动化方式来缓解创建(即节省时间而不是错误输入错误的东西).
这里似乎是关于如何做到这一点的唯一真实提示/注意事项 - 但是它上面的大多数项目都已经不存在了,旧的或者是sourceforge.许多似乎只适用于C++(这是我在这里做的).
还有人还在使用它们吗?最近?有没有人有这样的工作流程或最佳实践?我只是手动做得更好吗?
我的库由一组头文件很好地定义.一个包含所有C结构/类型的defs,另一个包含所有函数的原型.但它是loooonnnggg ...
谢谢你的任何提示.
更新(2015年8月25日):
是的,所以在过去的几个月里,当我有空余的时候,我试过:
CFFI(感谢@David指出这一点) - 有一个崇高的目标是"在不学习第三语言的情况下从Python调用C代码:现有的替代方案要求用户学习领域特定的语言(Cython,SWIG)或API(ctypes)" - 但它不太合适,因为它涉及到实际python文件中的相当程度的嵌入式C代码(或加载它).这对于一个大型库来说是一个非常手动的过程.也许我错过了一些东西......
SWIG是Python绑定的祖父,非常可靠.从根本上说,它并不像我理解的那样"放手" - 即你需要一个单独的规范文件.例如,您必须编辑所有C头文件以指示#define SWIG_FILE_WITH_INIT使用或使用其他注释构建python模块.SIP在这里也有同样的问题.您不会从标头自动生成,您可以修改它们以包含您自己的指令和注释,并创建完整的规范文件.
cwrap - 我在Mac上,所以我用这个版本来铿锵.https://github.com/geggo/cwrap真的很差的文档 - 但是使用源代码我终于让它运行并生成了... 一个非常简单的结构头的空的.pyx文件.不太好.
xdress - 这表明了承诺.该网站已关闭,所以文档实际上似乎在这里.这里有大量的工作,看起来很简单.但是它需要所有的llvm头文件(以及一个正确链接的clang版本).我不得不使用brew install llvm —with-clang.有一个xdress clang-3.5分支,但它似乎没有完成足够的修复.我尝试为早期版本的clang(安装llvm33/llvm34)点击自制软件/版本并将其构建完成.无论如何,我离题了...它对一个简单的例子非常有用,但是完整库的结果ctypes文件非常混乱并且拒绝构建.AST C-> Python中的东西有点不对......
ctypesgen不是我在原始搜索中遇到的那个.文档很稀疏 - 或者你可以称之为简洁.在过去的4年中,它似乎也没有做过多少工作(如果开发人员要进一步推进该项目,那么人们会询问问题列表).我已经尝试过运行它,但遗憾的是它似乎与我怀疑/似乎与Clang编译器cdefs.h使用的问题有关_attribute_.我尝试了类似-std=c11 但无济于事的事情.
总而言之,在我看过的所有内容中,我认为xdress最接近全自动生成的python绑定.它适用于给出的简单示例,但无法处理更复杂的现有库头,前向声明,枚举类型,void指针的所有复杂性 ......它似乎是一个设计良好且(有一段时间)维护良好的项目,因此,如果有人再次接受这些问题,可能会有一些方法来规避这些问题. …
cython在ipython笔记本中使用时,我看到下面的错误.怎么了?
%load_ext cythonmagic
/usr/local/lib/python2.7/dist-packages/IPython/extensions/cythonmagic.py:21: UserWarning: The Cython magic has been moved to the Cython package
warnings.warn("""The Cython magic has been moved to the Cython package""")
%%cython
def fib(int n):
cdef int a,b,i
for i in range(n):
a,b=a+b,b
return a
ERROR: Cell magic `%%cython` not found.
Run Code Online (Sandbox Code Playgroud) 我最近通过重命名所有模块(除了顶级Cythonized我的一个项目__init__.py)来*.pyx,并通过把ext_modules = [Extension('foo', ['foo.pyx'])]在setup.py.建筑和安装工作正常.但是,当我这样做时cd doc; make html,Sphinx失败了,因为它无法导入任何现在的模块*.pyx.
如果我编辑doc/conf.py并更改sys.path.insert(0, os.path.abspath('..'))为sys.path.insert(0, os.path.abspath('../build/temp.linux-x86_64-2.7')),那么Sphinx可以找到所有模块并可以生成文档,但在这种情况下我会收到类似的错误error while formatting arguments for foo.bar: <built-in function bar> is not a Python function.大概这是因为现在Sphinx只能访问*.so文件,而不是源文件.同样的sys.path修改还允许通过Sphinx(make doctest)运行doctests .
我尝试其他溶液使用扩展*.py,而不是*.pyx(和使用ext_modules = [Extension('foo', ['foo.py'])]中setup.py).在这种情况下,文档正确构建,但我认为doctests现在绕过Cython.
我无法在网上找到有关一起使用Sphinx和Cython的任何信息.我查看了一些使用两者的项目的源代码,但它们似乎没有在*.pyx文件中使用docstrings .我知道Sage确实如此,但是这个项目太复杂了我不能分开.
Sphinx是否支持Cython文件中的文档字符串?如果是这样,我该如何工作呢?
所以我尝试按照官方网站的说明安装Kivy:
$ sudo apt-get install python-setuptools python-pygame python-opengl \
python-gst0.10 python-enchant gstreamer0.10-plugins-good python-dev \
build-essential libgl1-mesa-dev libgles2-mesa-dev python-pip
$ sudo pip install --upgrade cython
$ sudo easy_install kivy
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
Searching for kivy
Reading http://pypi.python.org/simple/kivy/
Best match: Kivy 1.4.1
Downloading http://pypi.python.org/packages/source/K/Kivy/Kivy-1.4.1.tar.gz#md5=94bba894269e4bdecc7881f256367e01
Processing Kivy-1.4.1.tar.gz
Running Kivy-1.4.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-MMi2Fv/Kivy-1.4.1/egg-dist-tmp-EcKbfC
[INFO ] Kivy v1.4.1
Found GLES 2.0 headers at /usr/include/GLES2/gl2.h
Build configuration is:
* use_opengl_es2 = True
* use_glew = False
* use_opengl_debug = False
* use_mesagl = False
Generate config.h
Generate …Run Code Online (Sandbox Code Playgroud) 我有一些简单的代码,可以执行以下操作.
它F使用+ -1条目迭代所有可能的长度n列表.对于每一个,它使用+ -1条目迭代所有可能的长度2n列表S,其中$ S $的前半部分只是下半部分的副本.代码计算F每个S长度子列表的内积n.对于每个F,S,它计算在第一个非零内积之前为零的内积.
这是代码.
#!/usr/bin/python
from __future__ import division
import itertools
import operator
import math
n=14
m=n+1
def innerproduct(A, B):
assert (len(A) == len(B))
s = 0
for k in xrange(0,n):
s+=A[k]*B[k]
return s
leadingzerocounts = [0]*m
for S in itertools.product([-1,1], repeat = n):
S1 = S + S
for F in itertools.product([-1,1], repeat = n):
i = 0
while (i<m):
ip = innerproduct(F, S1[i:i+n]) …Run Code Online (Sandbox Code Playgroud) 我想知道的区别def,cdef而cpdef当我宣布一个功能.def和其他人之间的区别或多或少都很明显.而且我也看到有时它在声明(cdef void/double/int... name)中添加了返回类型,有时却没有.
我也想知道如何在cython中声明一个字符串变量,因为我不知道它,我把它声明为对象.
非零退出代码(1): _ pydevd_bundle/pydevd_cython.c:13:20:致命错误:Python.h:没有此类文件或目录编译终止.错误:命令'x86_64-linux-gnu-gcc'以退出状态1失败
请帮我解决尝试在PyCharm中安装Cython的错误.
我想使用Python编写的一些(单元)测试来获取Cython模块的覆盖信息.我现在所拥有的是测试本身的覆盖范围,即测试的哪些行是通过运行来执行的py.test.虽然很好看,但我宁愿得到.pyx文件的报道,即我的测试涵盖了C/Python接口的哪些行.
我已经找到了一些信息但是无法让它为我的项目运行:
http://blog.behnel.de/posts/coverage-analysis-for-cython-modules.html
https://medium.com/@dfdeshom/better-test-coverage-workflow-for-cython-modules-631615eb197a
这是有问题的代码:https://github.com/SCIP-Interfaces/PySCIPOpt/tree/coverage
cython ×10
python ×8
c ×2
algorithm ×1
c++ ×1
coverage.py ×1
declaration ×1
f2py ×1
gcc ×1
ipython ×1
kivy ×1
memory ×1
numba ×1
numpy ×1
performance ×1
pycharm ×1
python-3.x ×1