2016-02-19 3 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 

Но а/а .pxd есть. Что было бы правильным способом импортировать определения pxd из других пакетов?

ответ

1

A directory is not a package unless it contains a __init__.py file, даже если файл пуст. Поэтому добавьте пустой файл __init__.py в каталог a.


С помощью этой структуры каталогов, ваш a.pxd и b.pyx, setup.py и script.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()