使用pyximport.install时是否有一种干净的方法来抑制Cython的编译器警告?

And*_*lin 15 python cython

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

cython_functions/
    __init__.py
    fib.pyx
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

__init__.py包含:

import pyximport
pyximport.install()
from cython_functions.fib import fib
Run Code Online (Sandbox Code Playgroud)

如果我做了任何更改,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) {
                               ^
.
.
.
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法可以抑制它们?在另一个问题中,他们描述了如何通过.pyxbld文件传递编译器标志.我可以创建fib.pyxbld包含以下内容:

def make_ext(modname, pyxfilename):
    from distutils.extension import Extension
    return Extension(name=modname,
                     sources=[pyxfilename],
                     extra_compile_args=['-w'])
Run Code Online (Sandbox Code Playgroud)

我想避免这个.如果我需要创建更多函数,我还需要.pyxbld使用相同的样板创建更多文件.这看起来过分而且不那么pythonic.

小智 5

我自己也在与这件事做斗争(很高兴知道我并不孤单!)并且没有找到完美的解决方案.不幸的是,pyximport相当不透明,并且AFAICT在可定制性方面没有太多.

但我确实拥有我认为合理的解决方法,特别是一旦你拥有越来越多的Cython模块.

基本上,我有一个模块(让我们说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])
Run Code Online (Sandbox Code Playgroud)

基本上是distutils Extension类的一个瘦包装器,我可以设置一些自定义默认值.

然后在不需要任何自定义构建的pyx模块旁边,我只放了some_module.pyxbld一行:

from common.cython import make_ext
Run Code Online (Sandbox Code Playgroud)

这很好用,因为.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"])
Run Code Online (Sandbox Code Playgroud)

因此,没有巨大的从基本的记录方式不同,但刚够满足我 OCD :)希望这会有所帮助,欢迎与我们如果你找到一个更好的方法我知道.