2016-02-19 200 views
0

试图从其他包中导入pxd定义。编译Cython文件时出错:包中未找到pxd

简单的例子,a.pxd文件:

cdef inline void a(): 
    print "a" 

b.pyx文件:

cimport a 

def b(): 
    a.a() 

直到这里,一切都很好,和$ cython b.pyx作品。

如果我a.pxd移动到文件夹,如a/,然后我改变b.pyx到:

from a cimport a 

def b(): 
    a.a() 

,然后我有错误:

$ cython b.pyx 

Error compiling Cython file: 
------------------------------------------------------------ 
... 
from a cimport a 
^ 
------------------------------------------------------------ 

b.pyx:1:0: 'a.pxd' not found 

Error compiling Cython file: 
------------------------------------------------------------ 
... 
from a cimport a 
^ 
------------------------------------------------------------ 

b.pyx:1:0: 'a/a.pxd' not found 

但A/A .pxd在那里。 什么是从其他软件包导入pxd定义的正确方法?

回答

1

A directory is not a package unless it contains a __init__.py file,即使该文件为空。因此,将一个空的__init__.py文件添加到a目录。


使用该目录结构,你a.pxdb.pyxsetup.pyscript.py(下同),

% tree . 
. 
├── a 
│   ├── a.pxd 
│   └── __init__.py 
├── b.c 
├── b.pyx 
├── b.so 
├── build 
│   ├── temp.linux-x86_64-2.7 
│   │   └── b.o 
│   └── temp.linux-x86_64-3.4 
│    └── b.o 
├── script.py 
├── setup.py 

运行script.py作品:

% python setup.py build_ext --inplace 
% python ./script.py 
a 

setup.py:

# python setup.py build_ext --inplace 

from distutils.core import setup 
from Cython.Build import cythonize 

setup(
    name='test', 
    ext_modules=cythonize("b.pyx"), 
) 

script.py:

import b 
b.b()