2015-04-15 9 views
9

Sto usando Python3.4 e sto cercando di installare il modulo sfocatamodulo dinamico non definisce la funzione init (PyInit_fuzzy)

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

Dal momento che è menzionato funziona solo per python2, ho cercato di convertirlo usando cython. Questi sono i passi che ho seguito:

  1. Cython fuzzy.pyx
  2. gcc-g -02 -fpic python-config --cflags -c fuzzy.c -o fuzzy.o
  3. fatto lo stesso per double_metaphone.c
  4. gcc -o -shared fuzzy.so fuzzy.o double_metaphone.o python-config --libs

Quando ho cercato di importare sfocata ho ottenuto un errore:

dynamic module does not define init function (PyInit_fuzzy) 

Qual è il problema? È a causa dello scontro Python2 e Python3? Come risolvere questo?

+2

Provare a scambiare "python-config" per "python3-config" o "python3.4-config"? – DavidW

+0

Ciò ha fatto. Grazie. – blackmamba

risposta

12

Questo è stato risolto con un breve commento, ma inviato come una risposta per il bene di dare un po 'più in dettaglio ...

La risposta molto breve è quello di sostituire tutte le istanze di per python3-config o python3.4-config.

dettaglio Inutile segue

OP cercava di usare un modulo Pyrex in Python 3 (questo non è particolarmente evidente dalla domanda), e quindi riedificandolo Cython è un approccio ragionevole per prendere, poiché Cython era originariamente basato su Pyrex.

Cython genera codice che dovrebbe essere compilato per funzionare in Python 2 o 3, a seconda di quali intestazioni sono incluse. genera opzioni di compilatore/linker rilevanti per la versione predefinita di Python sul sistema che al momento della scrittura è tipicamente Python 2 (sul mio sistema include -I/usr/include/python2.7 -I/usr/include/x86_64-linux-gnu/python2.7). Pertanto costruisce il modulo per Python 2. L'utilizzo di python3.4-config assicura che sia inclusa la versione corretta.

Nel passaggio da Python 2 a Python 3 la funzione chiamata quando i moduli C vengono importati è stata modificata da init<modulename> a PyInit_<modulename>, presumibilmente per garantire che sia possibile importare solo i moduli creati per la versione corretta. Pertanto, quando il modulo è compilato con Python 2, crea solo initfuzzy e pertanto non riesce a trovare PyInit_fuzzy durante l'importazione.

Problemi correlati