【问题标题】:What's wrong with my Cython?我的 Cython 怎么了?
【发布时间】:2015-07-03 23:49:01
【问题描述】:

我尝试围绕 C++ 库 http://primesieve.org/ 编写 Cython 包装器

它包装了一个函数count。到目前为止,它正确安装了python setup.py install,但是当我import primesieve 时,函数primesieve.count 丢失了。有什么想法吗?


primesieve.pxd(跟随http://docs.cython.org/src/tutorial/clibraries.html

cdef extern from "stdint.h":
    ctypedef unsigned long long uint64_t

cdef extern from "primesieve/include/primesieve.h":
    uint64_t primesieve_count_primes(uint64_t start, uint64_t stop)

primesieve.pyx

cimport primesieve

cpdef int count(self, int n):
    return primesieve.primesieve_count_primes(1, n)

setup.py

from setuptools import setup, Extension
from Cython.Build import cythonize

setup(
    ext_modules = cythonize([Extension("*", ["primesieve.pyx"], include_dirs = ["primesieve/include"])])
)

【问题讨论】:

    标签: cython


    【解决方案1】:

    通过将libraries = ["primesieve"] 添加到Extension 构造函数的参数,修改setup.py 以链接libprimesieve.so。没有它,你会得到这个错误:

    ImportError: ./primesieve.so: undefined symbol: primesieve_count_primes
    

    一旦我更改了setup.py,它就对我有用:

    $ python2 setup.py build
    ...
    $ (cd build/lib.linux-x86_64-2.7 && python2 -c 'import primesieve; print primesieve.count(None, 5)')
    3
    

    【讨论】:

    • 啊哈,谢谢。 setuptools.Extension 的文档在哪里?
    • 酷我还通过安装库 ./configure --prefix=$HOME && make && make install 并将 library_dirs = ["/home/colonelpanic/lib"] 添加到 setup.py 中的 Extension 来修复错误 /usr/bin/ld.bfd.real: cannot find -lprimesieve。这是正确的做法吗?
    • 不觉得把我的主文件夹的绝对路径放在那里
    猜你喜欢
    • 2012-09-05
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多