2017-05-14 18 views
0
使用痛飲C的擴展

我嘗試C到Python擴展使用痛飲
對於我所做的玩具應用程序下列文件
錯誤安裝文件,同時使在Python

  1. hw.c
  2. hw.h
  3. hw.i

hw.h內容

double hw1(double r1, double r2); 

hw.c的內容

#include<hw.h> #include <math.h> 
double hw1(double r1, double r2) { 
    return sin(r1 + r2); 
} 

hw.i的內容

%module mathModule 
%{ 
#include <hw.h> 
%} 
%include<hw.h> 

有人能請解釋一下我該怎麼寫。我的文件?
setup.py的內容

from distutils.core import setup, Extension 
name = 'hw' 
version = '1.0' 
ext_modules_list = [Extension(name = '_mathModule', sources = ["hw.i","hw.c"], include_dirs=['.'])] 
setup(name=name, version=version, ext_modules = ext_modules_list) 

當我構建模塊,在IPython中,當我嘗試下面的代碼
from mathModule import hw1
但是,當我在Python Shell
運行同樣的事情,工作正常,給我一個錯誤 也在setup.py的最後一行,設置了一個方法,傳遞參數的方式是什麼?
也是在模塊的名稱決定
這是我在IPython中

no module named _mathModule 

得到的錯誤也可以任何人說我應該怎麼指定擴展類include_dirs?我想,它應該在當前目錄下,並因此被置於.

感謝提前:)

回答

0

我不知道爲什麼你在IPython中得到不同的行爲VS Python,但我可以回答你的一些其他問題。

設置了一個方法和傳遞參數的方法是什麼?

setup是distutils.core提供的一個函數,它在這裏被稱爲關鍵字參數。我通常會這樣寫電話

setup(
    name = "hw", 
    version = "1.0", 
    ext_modules = [ 
     Extension(name = '_mathModule', sources = ["hw.i","hw.c"], 
    ] 
) 

但它完全等同於您的呼叫。

模塊的名稱在哪裏決定?

安裝文件定義了兩個模塊,一個叫做「hw」,一個是python模塊,另一個叫做「_mathModule」,它是一個編譯後的C擴展。這兩個名稱都是使用name關鍵字指定的。

當您執行python setup.py build時,它會生成一個包含兩個子目錄build/temp *和build/lib *的目錄,其中*取決於您編譯代碼的系統。如果你調查這些目錄,你應該找到build/lib */hw.py和build/lib */_ mathModule.so。構建完成後,這些目錄不在你的python路徑中,所以你需要做一個額外的步驟,然後才能在python中導入它們。這可能是

  • 運行python setup.py install將文件複製到系統目錄 巨蟒哪裏可以找到他們。
  • 使符號鏈接從您的主/ test目錄在構建
  • 追加編譯/ lib中*文件夾在sys.path中的文件/ lib目錄*目錄
  • 添加構建/ lib目錄*您PYTHONPATH環境變量python解釋器。

後來的三個是僅用於開發和測試。分發代碼時,應始終依靠第一個選項。

我應該如何在Extension類中指定include_dirs

include_dirs僅用於編譯您的擴展。一旦成功構建,變量不會影響模塊的搜索路徑。