2015-04-15 71 views
9

我使用Python3.4和我想既然是提到它僅適用於Python2安裝模塊模糊動態模塊沒有定義初始化函數(PyInit_fuzzy)

https://pypi.python.org/pypi/Fuzzy. 

,我試圖將其轉換使用cython。這些是我遵循的步驟:

  1. 用Cython fuzzy.pyx
  2. gcc的-g -02 -fpic python-config --cflags -c fuzzy.c -o fuzzy.o
  3. 沒有爲double_metaphone.c
  4. 相同
  5. 的gcc -o -shared fuzzy.so fuzzy.o double_metaphone.o python-config --libs

當我試圖導入模糊我得到了一個錯誤:

dynamic module does not define init function (PyInit_fuzzy) 

問題是什麼?這是因爲python2和python3衝突?如何解決這個問題?

+2

嘗試爲「python3-config」或「python3.4-config」交換「python-config」? – DavidW

+0

這樣做。謝謝。 – blackmamba

回答

12

這是一個快速評論解決,但發佈作爲給予多一點細節着想的答案...

非常簡短的回答是更換的所有實例python3-configpython3.4-config

的不必要的細節如下

OP試圖用在Python 3在Pyrex模塊(這是不能從問題尤其明顯),因此在用Cython重建它是明智的做法服用,因爲Cython最初基於Pyrex。

Cython生成的代碼應該編譯爲在Python 2或3中工作,具體取決於包含哪些頭文件。 爲系統上的默認版本的Python生成相關的編譯器/鏈接器選項,在撰寫本文時這通常是Python 2(在我的系統上它包括-I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7)。因此它爲Python 2構建了模塊。使用python3.4-config可確保包含正確的版本。

在從Python 2切換到Python 3時,導入C模塊時調用的函數已從init<modulename>更改爲PyInit_<modulename>,這大概有助於確保您只能導入爲正確版本構建的模塊。因此,當模塊使用Python 2構建時,它僅創建initfuzzy,因此無法在導入時找到PyInit_fuzzy

相關問題