2014-09-17 9 views
6

Sto cercando di compilare un semplice esempio Python/C seguendo questo tutorial:Python.h non trovato utilizzando sorso e Anaconda Python

http://www.swig.org/tutorial.html

Sono su MacOS utilizzando anaconda pitone.

tuttavia, quando corro

gcc -c example.c example_wrap.c -I/Users/myuser/anaconda/include/ 

ottengo:

example_wrap.c:130:11: fatal error: 'Python.h' file not found 
# include <Python.h> 
     ^

Sembra che questo problema è riportato in una serie di domande:

Missing Python.h while trying to compile a C extension module

Missing Python.h and impossible to find

Python.h: No such file or directory

ma nessuno sembra fornire una risposta specifica ad Anaconda su MacOS

Chiunque ha risolto questo?

risposta

13

Utilizzare l'opzione -I/Users/myuser/anaconda/include/python2.7 nel comando gcc. (Questo supponendo che si sta utilizzando Python 2.7 Cambiare il nome in modo che corrisponda alla versione di Python che si sta utilizzando.). È possibile utilizzare il comando python-config --cflags per ottenere il set completo di bandiere di compilazione consigliati:

$ python-config --cflags 
-I/Users/myuser/anaconda/include/python2.7 -I/Users/myuser/anaconda/include/python2.7 -fno-strict-aliasing -I/Users/myuser/anaconda/include -arch x86_64 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes 

Tuttavia, a Costruisci il modulo di estensione, ti consiglio di utilizzare uno script di installazione semplice, come il seguente setup.py, e lasciare che distutils trovi tutte le opzioni di compilazione e collegamento per te.

# setup.py 

from distutils.core import setup, Extension 


example_module = Extension('_example', sources=['example_wrap.c', 'example.c']) 

setup(name='example', ext_modules=[example_module], py_modules=["example"]) 

Quindi è possibile eseguire:

$ swig -python example.i 
$ python setup.py build_ext --inplace 

(Date un'occhiata ai comandi del compilatore che vengono ripetuti terminale quando setup.py viene eseguito.)

distutils sa di SWIG, così invece di includere example_wrap.c nell'elenco dei file di origine, è possibile includere example.i e swig verrà eseguito automaticamente dallo script di installazione:

# setup.py 

from distutils.core import setup, Extension 


example_module = Extension('_example', sources=['example.c', 'example.i']) 

setup(name='example', ext_modules=[example_module], py_modules=["example"]) 

Con la versione sopra di setup.py, si può costruire il modulo di estensione con il singolo comando

$ python setup.py build_ext --inplace 

Una volta che hai costruito il modulo di estensione, si dovrebbe essere in grado di utilizzarlo in python:

>>> import example 
>>> example.fact(5) 
120 

Se si preferisce non utilizzare lo script setup.py, ecco una serie di comandi che hanno lavorato per me:

$ swig -python example.i 
$ gcc -c -I/Users/myuser/anaconda/include/python2.7 example.c example_wrap.c 
$ gcc -bundle -undefined dynamic_lookup -L/Users/myuser/anaconda/lib example.o example_wrap.o -o _example.so 

Nota: sto usando Mac OS X 10.9.4:

$ gcc --version 
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin13.3.0 
Thread model: posix 
+0

Fantastico! Ha funzionato. Spiegazione molto chiara! Grazie – Fra

+0

Grazie per aver condiviso i suggerimenti sull'uso di setup.py ~~ Funziona per me su mac osx 10.11 ~~ – zhkzyth