2012-12-17 89 views
2

創建一個pxd定義文件最簡單的方法是什麼,它只是收集通過pyx文件複製的cdefs,而不創建新的擴展?如何在不使用擴展的情況下使用cython定義文件(pxd)?

我的情況如下:我想在pxd文件(hp/src/common.pxd)中收集一些extern cdefs。我還添加了一些非外部的cdef,其實現在common.pyx中。

在另一個pyx文件(hp/src/_lib.pyx)中,我把它變成了一個擴展,我引用了一些常用的東西。

在setup.py文件創建以下擴展:

Extension('hp._lib', 
      ['hp/src/_lib.pyx'], 
      language='c++'), 

通過這樣做,沒有common.cpp文件被創建,所以它看起來像它的依賴不會自動處理。這是第一個問題。

然後,手動運行'cython --cplus common.pyx'在目錄hp/src中正確創建一個common.cpp文件,如果我將'hp/src/common.cpp'添加到擴展列表中來源,命令python setup.py安裝一切都沒有抱怨,但是,然後,導入模塊hp觸發一個ImportError:No module common ... from _lib.cpp ... 我卡在這裏。任何想法?

+0

您也可以嘗試在[cython-users](https://groups.google.com/forum/#!forum/cython-users) – forivall

回答

2

您可以使用include聲明包含來自其他文件的材料。

在這裏看到的文檔:

http://docs.cython.org/src/userguide/language_basics.html#the-include-statement

如果你在common.pxd,你將需要包括他們兩個外部定義和commond.pyx實現。例如,在_lib.pyx

include "common.pxd" 
include "common.pyx" 

這些文件的內容將被編譯到_lib模塊,好像他們是文字上包括在這一點上。即不會生成common.c文件,而是包含在_lib.c中。

當決定是否需要重新生成模塊的.c文件時,Cython編譯器無法識別包含的更改,因此請記住在重新編譯之前刪除此文件。

0

如果將.pyx和.pxd文件與.py文件完全相同,那麼你將會有更好的運氣。這包括在您的setup.py文件中爲common.pyx擴展。您可能想嘗試使用cythonize來處理依賴關係。

相關問題