使用swig和Anaconda Python找不到Python.h

时间:2014-09-17 04:08:46

标签: python c macos swig anaconda

我正在尝试按照本教程编译一个简单的python / C示例:

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

我使用Anaconda python在MacOS上。

然而,当我跑

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

我明白了:

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

似乎在许多问题中报告了这个问题:

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

但似乎没有提供针对MacOS上Anaconda的具体答案

有人解决了这个问题吗?

1 个答案:

答案 0 :(得分:19)

使用-I/Users/myuser/anaconda/include/python2.7命令中的gcc选项。 (假设您正在使用python 2.7。更改名称以匹配您正在使用的python版本。)您可以使用命令python-config --cflags来获取完整的推荐编译标记集:

$ 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

但是,要构建扩展模块,我建议使用简单的安装脚本,例如以下setup.py,让distutils为您找出所有编译和链接选项。

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

然后你可以运行:

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

(看一下运行setup.py时回显给终端的编译器命令。)

distutils了解SWIG,因此您可以包含example_wrap.c,而不是在源文件列表中包含example.i,而swig将由设置自动运行脚本:

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

使用上述版本的setup.py,您可以使用单个命令

构建扩展模块
$ python setup.py build_ext --inplace

一旦构建了扩展模块,您就可以在python中使用它:

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

如果您不想使用脚本setup.py,这里有一组对我有用的命令:

$ 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

注意:我使用的是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