簡體   English   中英

在C OS中將C ++包裝為python的Swig在Mac OS X中使用默認Python而不是Anaconda python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM