假设我有一个以下结构的简单包:
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])
基本上是distutils
Extension
类的一个薄包装,在这里我可以设置一些自定义默认值。然后,在不需要任何自定义构建的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:。希望这有帮助,如果你找到更好的方法,请告诉我。