假设我有一个以下结构的简单包:

cython_functions/
    __init__.py
    fib.pyx

其中fib.pyx包含:
def fib(int n):
    fiblist = [0, 1]
    a, b = fiblist
    while b < n:
        a, b = b, a + b
        fiblist.append(b)
    return fiblist

__init__.py包含:
import pyximport
pyximport.install()
from cython_functions.fib import fib

如果我对fib.pyx做了任何更改,每当我尝试导入包时,都会收到一大堆编译器警告:
/Users/andfranklin/.pyxbld/temp.macosx-10.6-intel-3.5/pyrex/cython_functions/fib.c:1687:28: warning: unused function '__Pyx_PyObject_AsString' [-Wunused-function]
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
                           ^
/Users/andfranklin/.pyxbld/temp.macosx-10.6-intel-3.5/pyrex/cython_functions/fib.c:1684:32: warning: unused function '__Pyx_PyUnicode_FromString' [-Wunused-function]
static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
                               ^
.
.
.

有什么简单的方法可以压制他们吗?在another questions中,它们描述了如何通过.pyxbld文件传递编译器标志。我可以创建包含以下内容的fib.pyxbld
def make_ext(modname, pyxfilename):
    from distutils.extension import Extension
    return Extension(name=modname,
                     sources=[pyxfilename],
                     extra_compile_args=['-w'])

我想避免这个。如果我需要创建更多的函数,我还需要用相同的样板创建更多的文件。这似乎是过度的和非蟒蛇。

最佳答案

我自己也和这件事做过斗争(很高兴知道我并不孤单!)也没有找到完美的解决方案。不幸的是,Pyximport相当不透明,在可定制性方面没有太多。
但我确实有一个我认为合理的解决方法,尤其是当你有越来越多的赛通模块的时候。
基本上,我在某个地方(比如common.cython)有一个模块包含如下内容:

from distutils.extension import Extension


DEFAULT_EXTENSION_KWARGS = {
    "extra_compile_args": ["-w"]
}


def pyx_extension(**kwargs):
    for key, value in DEFAULT_EXTENSION_KWARGS.items():
        if key not in kwargs:
            kwargs[key] = value

    return Extension(**kwargs)


def make_ext(modname, pyxfilename):
    return pyx_extension(name=modname, sources=[pyxfilename])

基本上是distutilsExtension类的一个薄包装,在这里我可以设置一些自定义默认值。
然后,在不需要任何自定义构建的PYX模块旁边,我只放了一行some_module.pyxbld
from common.cython import make_ext

这很好地工作,因为.pyxbld文件只是一个python模块,它应该包含一个带有该签名的make_ext函数。
如果我确实需要为模块自定义.pyxbld,比如说如果我需要添加一个C源文件或其他文件,它将如下所示:
def make_ext(modname, pyxfilename):
    from common.cython import pyx_extension

    return pyx_extension(name=modname, sources=[pyxfilename, "my_extra_source.c"])

所以,与基本的文档化方法没有太大的不同,但是仅仅满足我的OCD:。希望这有帮助,如果你找到更好的方法,请告诉我。

07-24 18:03