python导入的cython错误
Posted
技术标签:
【中文标题】python导入的cython错误【英文标题】:cython error by python import 【发布时间】:2016-08-17 16:26:07 【问题描述】:我正在创建一个 C++ 类来管理与设备 (SPI) 的通信。这个想法是在 Arduino 和 Raspberry Pi 上使用这个 C++ 类。这样我只需要做一次这门课。
我将使用 Arduino 上的课程(这没问题)。 我还想在我的 Raspberry Pi 上与 python 一起使用它。 (这里有问题)
我已经创建了一个测试类(矩形)来在两者上使用它。这个成功了:)
现在我偶然发现了我真正的班级的一个问题。
我的想法是制作一个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】:bcm2835_init
大概在“bcm2835.cpp”中,因此您需要将其添加到“setup.py”中的sources
sources=["dev.pyx","Device.cpp","bcm2835.cpp"]
或者,如果您已经编译了 bcm2835 库,您可能希望通过添加到“setup.py”来链接到它
libraries = ["bcm2835"]
您收到错误是因为您调用了函数(在“Device.cpp”中)但从未提供函数的定义。
【讨论】:
以上是关于python导入的cython错误的主要内容,如果未能解决你的问题,请参考以下文章
python / cython编译pyx:致命错误:capsule.h:没有这样的文件或目录