2014-09-17 5 views
6

Ich versuche, eine einfache Python/C Beispiel nach diesem Tutorial zu kompilieren:Python.h nicht mit swig und Anaconda Python gefunden

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

ich auf MacOS Python mit Anaconda bin.

jedoch, wenn ich

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

laufen erhalte ich:

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

Es scheint, dass dieses Problem in einer Reihe von Fragen berichtet wird:

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

aber keine scheinen eine Antwort spezifisch für Anaconda auf MacOS zur Verfügung zu stellen

Wer diese gelöst?

Antwort

13

Verwenden Sie die Option -I/Users/myuser/anaconda/include/python2.7 im Befehl gcc. (Das ist vorausgesetzt, Sie verwenden Python 2.7 Ändern Sie den Namen, die Version von Python entsprechen, die Sie verwenden.). Sie können mit dem Befehl python-config --cflags den vollen Satz von empfohlenen Kompilation Fahnen zu erhalten:

$ 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 

jedoch zu Erstellen Sie das Erweiterungsmodul, ich empfehle die Verwendung eines einfachen Setup-Skript, wie die folgenden setup.py, und lassen Sie distutils herauszufinden, alle kompilieren und verknüpfen Optionen für Sie.

# 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"]) 

Dann können Sie laufen:

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

(an den Compiler Befehle Werfen Sie einen Blick, die an das Terminal hallte, wenn setup.py ausgeführt wird.)

distutils über SWIG weiß, so dass statt von einschließlich example_wrap.c in der Liste der Quelldateien können Sie example.i einschließen, und swig wird automatisch durch das Setup-Skript ausgeführt:

# 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"]) 

Mit der obigen Version von setup.py, können Sie das Erweiterungsmodul mit dem einzigen Befehl

$ python setup.py build_ext --inplace 

bauen Sobald Sie das Erweiterungsmodul erstellt haben, sollten Sie in der Lage sein, es zu benutzen in Python:

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

Wenn Sie lieber das Skript nicht setup.py verwenden würde, ist hier ein Satz von Befehlen, die für mich gearbeitet:

$ 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 

Hinweis: Ich verwende 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

Fantastisch! Es funktionierte. Sehr klare Erklärung! Danke – Fra

+0

Danke für die Nutzung der Tipps von setup.py ~~ Es funktioniert für mich auf Mac OSX 10.11 ~~ – zhkzyth