[英]Swig wrapping C++ to python is using default Python rather than Anaconda python in Mac OS X
我正在嘗試使用swig將c ++函數包裝到python中。 我正在使用以下命令
swig -c++ -python helloworld.i
g++ -O2 -fPIC -c hello.cpp
g++ -O2 -fPIC -c helloworld_wrap.cxx -I//anaconda/include/python2.7
g++ -lpython -dynamclib hello.o helloworld_wrap.o -o _helloworld.so
hello.cpp
是具有功能的初始文件, helloworld.i
是具有包裝器的文件。 這些命令創建了helloworld
庫,但是我只能通過/usr/bin/python
默認python導入它
如果我嘗試通過通過python
安裝的python
導入它,則會出現以下錯誤:
Fatal Python error: PyThreadState_Get: no current thread
Abort trap: 6
你能告訴我如何用anaconda的python
包裝代碼嗎?
找到了一個解決方案: 使用swig和Anaconda Python找不到Python.h
在上述問題中,最高答案給出了使用disutils
和python中的設置文件來構建庫的說明。 這行奇妙的:)
包裝簡單類時遇到的下一個問題:
我來自[example]的班級代碼( http://web.mit.edu/svn/src/swig-1.3.25/Examples/python/class/index.html )
/* File : example.h */
class Shape {
public:
Shape() {
nshapes++;
}
virtual ~Shape() {
nshapes--;
};
double x, y;
void move(double dx, double dy);
virtual double area() = 0;
virtual double perimeter() = 0;
static int nshapes;
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) { };
virtual double area();
virtual double perimeter();
};
class Square : public Shape {
private:
double width;
public:
Square(double w) : width(w) { };
virtual double area();
virtual double perimeter();
};
我的setup.py
文件:
#setup.py file:
from setuptools import setup, Extension
setup(name='example',
version='0.1',
ext_modules=[Extension('_example', ['example.h', 'example.i'],
swig_opts=['-c++'],
)],
)
我用來包裝的代碼:
python setup.py build_ext --inplace
錯誤信息:
running build_ext
building '_example' extension
swigging example.i to example_wrap.cpp
swig -python -c++ -o example_wrap.cpp example.i
error: unknown file type '.h' (from 'example.h')
你能在這里提出什么問題嗎? 我想它不能識別“ .h”文件,但由於它是頭文件,我認為可以將其保留為原樣。 另外,我的setup.py
文件是否正確? 我只是嘗試遵循簡單包裝的示例,顯然在線上沒有簡單的教程。
我也可以在其他不同的問題上問這個問題,但我想只是在這里繼續。
Warren Weckesser在類似問題中的回答 。 我按照答案中的建議使用了setup.py
文件,並將該庫的路徑添加到sys.path
,它的工作原理很神奇:)
在gcc
命令中使用選項-I/Users/myuser/anaconda/include/python2.7
。 (假設您使用的是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.i
而不是將example_wrap.c
包括在內,並且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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.