假设我有一个以下结构的简单包:
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 :)希望这会有所帮助,欢迎与我们如果你找到一个更好的方法我知道.
归档时间: |
|
查看次数: |
882 次 |
最近记录: |