2011-03-16 39 views
1

我在這樣的C文件blargUtils.c(我定義的方法,並在Blargmethods了很多關於它)來定義我的包裝對象的名稱...Ç - > Python的進口包裝問題

void initBlarg(){ 
    Py_InitModule("Blarg", Blargmethods); 
} 

我編譯它像這樣...

blarglib: blargUtils.c 
    gcc -I/usr/include/python2.6 -fPIC -c blargUtils.c -Wall  
    gcc -shared blargUtils.o -o blargUtils.so 
clean: 
    rm *.so 

然而,當我嘗試導入包裝在我的Python腳本...

import Blarg 

它s說它說:「ImportError:沒有名爲Blarg的模塊」。我在這裏有點迷路,我不明白爲什麼當他們是完全相同的拼寫時找不到課程。也許它是一個邏輯錯誤?

如果需要更多的代碼請告訴我。

+0

我忘了提及編譯的.os文件,如果無論如何幫助 – 2011-03-16 20:10:37

+0

你把你編譯的.so文件放在哪裏? (什麼目錄?)你想從哪裏導入?像任何其他Python模塊一樣,以C編譯的模塊需要位於Python路徑中才能找到。 – dappawit 2011-03-16 20:17:28

+2

你把你的.so文件放在哪裏?如果將其重命名爲Blarg.so,會發生什麼情況? – DNS 2011-03-16 20:18:41

回答

1

首先,從查看評論,我發現重命名它沒有奏效。這意味着(1)python找不到.so文件,(2).so文件不可用(即未正確編譯或未找到所有必需的符號),或者(3).py/.pyc/.pyo文件放在同一個目錄中,該目錄已經有了這個名字。如果你已經定義了Blarg.py,python會首先查看這個文件。如果您在搜索路徑中有一個名爲Blarg的目錄,也是一樣。因此,不是撲你的頭靠在牆上,試試這個:

1)重命名你的.so庫的東西保證不會碰撞(即_Blarg)

void initBlarg() { 
    Py_InitModule("_Blarg", Blargmethods); 
} 

2)具有相同的名稱

編譯
gcc -I/usr/include/python2.6 -fPIC -c blargUtils.c -Wall  
gcc -shared blargUtils.o -Wl,-soname -Wl,_Blarg.so -o _Blarg.so 

3)創建一個Python包裝(即Blarg.py)

import sys 
sys.path.append('/path/to/your/library') 

import _Blarg 

def blargFunc1(*args): 
    """Wrap blargFunc1""" 
    return _Blarg.blargFunc1(*args) 

4)現在只需使用它作爲正常

import Blarg 
Blarg.blargFunc1(1, 2, 3) 

顯然,這是一個有點矯枉過正,但它應該可以幫助您確定問題出在哪裏。希望這可以幫助。

+0

非常感謝! – 2011-03-18 05:20:42