python导入

时间:2016-08-17 16:26:08

标签: python c++ cython

我正在制作一个C ++类来管理与设备(SPI)的通信。我的想法是在Arduino和Raspberry Pi上使用这个C ++类。这样我只需要创建一次这个类。

我将在Arduino上使用该类(这没问题)。 我也想在我的Raspberry Pi和python一起使用它。 (这是问题)

我已经制作了一个测试类(Rectangle)来在两者上使用它。这个成功了:))

现在我偶然发现了真正的班级问题。

我的想法是制作一个namespace里面有两个班级(一个public,一个private)。 public用于管理设备的通信。 private用于管理器件所需的SPI总线。

现在我想用mikem的bcm2835类创建SPI类,这是我收到错误的地方。 (http://www.airspayce.com/mikem/bcm2835/)。

我制作的下一个文件(我知道,它仍然是公开的): device.h中

namespace device {
    class Spi {
        public:
            int speed, modus;
            Spi(int speed, int modus);
            ~Spi();
            void openSpi();
            void closeSpi();
            void writeSpi(int dataToWrite);
            int readSpi();
    };
}

Device.cpp

#include "Device.h"
#include “bcm2835.h”
#include <iostream>

using namespace device;

//###############################################################################################
//***********************************************************************************************
//      Constructors:
//                      Default constructor: speed = 1MHz, modus = 0
//                      Specific constructor: speed = var(int), modus = var(int)
//***********************************************************************************************
//Specific
Spi::Spi(int speed, int modus) {
    speed = speed;
    modus = modus;
}

//Default
Spi::~Spi() {
}
//###############################################################################################

void Spi::openSpi() {
    if (!bcm2835_init())
    {
      std::cout<< "bcm2835_init failed." ;
      //return 1;
    }
    std::cout << "SPI is open.";
}

void Spi::closeSpi()
{
    std::cout << "SPI is closed.";
}

void Spi::writeSpi(int dataToWrite) {
    std::cout << "SPI write: " << dataToWrite;
}

int Spi::readSpi() {
    return 0;
}

dev.pyx

cdef extern from "Device.h" namespace "device":
    cdef cppclass Spi:
        Spi(int, int) except +
        int speed, modus
        void openSpi()
        void closeSpi()
        void writeSpi(int)
        int readSpi()

cdef class PySpi:
    cdef Spi *thisptr
    def __cinit__(self, int speed, int modus):
        self.thisptr = new Spi(speed, modus)
    def __dealloc__(self):
        del self.thisptr
    def openSpi(self):
        self.thisptr.openSpi()
    def closeSpi(self):
        self.thisptr.closeSpi()
    def writeSpi(self, data):
        self.thisptr.writeSpi(data)
    def readSpi(self):
        return self.thisptr.readSpi()

setup.py

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

setup(ext_modules = cythonize(Extension(
        "dev",
        sources=["dev.pyx","Device.cpp"],
        language="c++",
    )))

构建时我没有错误,但是当我在python中执行“import dev”时。我收到错误:

  

未定义的符号:bcm2835_init

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

bcm2835_init可能位于“bcm2835.cpp”中,因此您需要将其添加到“{。1}”的“setup.py”中

sources

或者,如果您已经编译了bcm2835库,则可能需要通过添加到“setup.py”链接到它

sources=["dev.pyx","Device.cpp","bcm2835.cpp"]

您收到错误是因为您调用了该函数(在“Device.cpp”中),但从未提供该函数的定义。