将Cython模块与Python软件包捆绑在一起

丹尼尔·斯坦迪奇

我在Cython中包装了一个C ++库,我想将其作为Python包分发。我一直在使用本教程作为指南。

这是事物的组织方式。

.
├── inc
│   └── Rectangle.h
├── rect
│   ├── __init__.py
│   └── wrapper.pyx
├── setup.py
└── src
    └── Rectangle.cpp

我已将这些文件的内容粘贴在文章的底部以及此GitHub存储库中

我使用进行编译和安装时没有问题python setup.py install,并且可以import rect从解释器中毫无问题地进行操作。但这似乎是一个空类:我不能Rectangle使用以下任何一个来创建对象。- Rectangle- rect.Rectangle- wrapper.Rectangle-rect.wrapper.Rectangle

我在这里做错了什么?


Rectangle.h教程中的内容,复制和粘贴。

namespace shapes {
    class Rectangle {
    public:
        int x0, y0, x1, y1;
        Rectangle();
        Rectangle(int x0, int y0, int x1, int y1);
        ~Rectangle();
        int getArea();
        void getSize(int* width, int* height);
        void move(int dx, int dy);
    };
}

的内容Rectangle.cpp

#include "Rectangle.h"

namespace shapes {

  Rectangle::Rectangle() { }

    Rectangle::Rectangle(int X0, int Y0, int X1, int Y1) {
        x0 = X0;
        y0 = Y0;
        x1 = X1;
        y1 = Y1;
    }

    Rectangle::~Rectangle() { }

    int Rectangle::getArea() {
        return (x1 - x0) * (y1 - y0);
    }

    void Rectangle::getSize(int *width, int *height) {
        (*width) = x1 - x0;
        (*height) = y1 - y0;
    }

    void Rectangle::move(int dx, int dy) {
        x0 += dx;
        y0 += dy;
        x1 += dx;
        y1 += dy;
    }

}

Cython包装器代码wrapper.pyx

# distutils: language = c++
# distutils: sources = src/Rectangle.cpp

cdef extern from "Rectangle.h" namespace "shapes":
    cdef cppclass Rectangle:
        Rectangle() except +
        Rectangle(int, int, int, int) except +
        int x0, y0, x1, y1
        int getArea()
        void getSize(int* width, int* height)
        void move(int, int)

cdef class PyRectangle:
    cdef Rectangle c_rect      # hold a C++ instance which we're wrapping
    def __cinit__(self, int x0, int y0, int x1, int y1):
        self.c_rect = Rectangle(x0, y0, x1, y1)
    def get_area(self):
        return self.c_rect.getArea()
    def get_size(self):
        cdef int width, height
        self.c_rect.getSize(&width, &height)
        return width, height
    def move(self, dx, dy):
        self.c_rect.move(dx, dy)

setup.py我已为此文件组织改编脚本。

from distutils.core import setup, Extension
from Cython.Build import cythonize

setup(
    name='rect',
    packages=['rect'],
    ext_modules=cythonize(Extension(
        'Rectangle',
        sources=['rect/wrapper.pyx', 'src/Rectangle.cpp'],
        include_dirs=['inc/'],
        language='c++',
        extra_compile_args=['--std=c++11'],
        extra_link_args=['--std=c++11']
    )),
)
丹尼尔·斯坦迪奇

在这种情况下,问题出在该.pyx文件和扩展名没有相同的基名。当我改名wrapper.pyxRectangle并重新安装,我能够运行Python解释如下。

>>> import Rectangle
>>> r = Rectangle.PyRectangle(0, 0, 1, 1)
>>> r.get_area()
1
>>>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将VC ++ 2015可再发行的软件包与ClickOnce(.NET)应用程序捆绑在一起?

来自分类Dev

我可以在不安装可分发VC ++软件包的情况下将MSVCRT DLL与我的应用程序捆绑在一起吗

来自分类Dev

将 webpack 与 dotnet run 捆绑在一起

来自分类Dev

将所有js文件捆绑在一个捆绑包中,并与css文件捆绑在一起

来自分类Dev

当 node_modules 在不同的包中时,将项目与 webpack 捆绑在一起时出现“找不到模块”错误

来自分类Dev

我可以将Microsoft支持诊断工具(.diagcab)文件与软件捆绑在一起吗?

来自分类Dev

如何使用node-webkit中的webpack将节点模块与本机插件捆绑在一起?

来自分类Dev

与PyInstaller捆绑在一起的代码无法导入本地安装的vtk模块:ModuleNotFoundError

来自分类Dev

托管与Webpack捆绑在一起的Web应用

来自分类Dev

插座是否与Pry捆绑在一起?

来自分类Dev

是JCE策略与OpenJDK的8捆绑在一起?

来自分类Dev

如何将C ++中的运算符捆绑在一起

来自分类Dev

如何将aurelia-dialog与Aurelia捆绑在一起?

来自分类Dev

奇怪的分配,将TextView捆绑在一起,反编译后为什么?

来自分类Dev

将require.js源代码与main.js捆绑在一起的方法

来自分类Dev

如何将Zeromq与电子应用程序捆绑在一起?

来自分类Dev

如何将socket.io-client与webpack捆绑在一起?

来自分类Dev

如何将本机DLL与托管应用程序捆绑在一起?

来自分类Dev

将几个内阁文件捆绑在一起?(对于Windows Mobile)

来自分类Dev

将Perl脚本及其依赖项捆绑在一起吗?

来自分类Dev

如何将Perl库与我的跨平台脚本捆绑在一起?

来自分类Dev

如何将多个JavaScript库与browserify捆绑在一起?

来自分类Dev

如何将CocoaPods依赖项与Cordova插件捆绑在一起?

来自分类Dev

避免将lib依赖项与webpack + handlebars loader捆绑在一起

来自分类Dev

可以将Perl与macOS应用程序捆绑在一起吗?

来自分类Dev

在ReactJS中构建后,条件样式导入将捆绑在一起

来自分类Dev

如何通过Gulp将npm Halfmoon的JS与现有代码捆绑在一起?

来自分类Dev

如何将服务与Android项目捆绑在一起

来自分类Dev

将Perl脚本及其依赖项捆绑在一起吗?

Related 相关文章

  1. 1

    如何将VC ++ 2015可再发行的软件包与ClickOnce(.NET)应用程序捆绑在一起?

  2. 2

    我可以在不安装可分发VC ++软件包的情况下将MSVCRT DLL与我的应用程序捆绑在一起吗

  3. 3

    将 webpack 与 dotnet run 捆绑在一起

  4. 4

    将所有js文件捆绑在一个捆绑包中,并与css文件捆绑在一起

  5. 5

    当 node_modules 在不同的包中时,将项目与 webpack 捆绑在一起时出现“找不到模块”错误

  6. 6

    我可以将Microsoft支持诊断工具(.diagcab)文件与软件捆绑在一起吗?

  7. 7

    如何使用node-webkit中的webpack将节点模块与本机插件捆绑在一起?

  8. 8

    与PyInstaller捆绑在一起的代码无法导入本地安装的vtk模块:ModuleNotFoundError

  9. 9

    托管与Webpack捆绑在一起的Web应用

  10. 10

    插座是否与Pry捆绑在一起?

  11. 11

    是JCE策略与OpenJDK的8捆绑在一起?

  12. 12

    如何将C ++中的运算符捆绑在一起

  13. 13

    如何将aurelia-dialog与Aurelia捆绑在一起?

  14. 14

    奇怪的分配,将TextView捆绑在一起,反编译后为什么?

  15. 15

    将require.js源代码与main.js捆绑在一起的方法

  16. 16

    如何将Zeromq与电子应用程序捆绑在一起?

  17. 17

    如何将socket.io-client与webpack捆绑在一起?

  18. 18

    如何将本机DLL与托管应用程序捆绑在一起?

  19. 19

    将几个内阁文件捆绑在一起?(对于Windows Mobile)

  20. 20

    将Perl脚本及其依赖项捆绑在一起吗?

  21. 21

    如何将Perl库与我的跨平台脚本捆绑在一起?

  22. 22

    如何将多个JavaScript库与browserify捆绑在一起?

  23. 23

    如何将CocoaPods依赖项与Cordova插件捆绑在一起?

  24. 24

    避免将lib依赖项与webpack + handlebars loader捆绑在一起

  25. 25

    可以将Perl与macOS应用程序捆绑在一起吗?

  26. 26

    在ReactJS中构建后,条件样式导入将捆绑在一起

  27. 27

    如何通过Gulp将npm Halfmoon的JS与现有代码捆绑在一起?

  28. 28

    如何将服务与Android项目捆绑在一起

  29. 29

    将Perl脚本及其依赖项捆绑在一起吗?

热门标签

归档