Einführung in Boost.python mit Homebrew

Als ich es mit Homebrew einführte, um [Boost.python] auszuprobieren (http://www.boost.org/doc/libs/1_60_0/libs/python/doc/html/index.html), war ich ein wenig süchtig danach. Ich werde es notieren.

Umgebung

Anwendungsbeispiel (C ++)

Rufen wir eine Funktion auf, die das Quadrat von c ++ aus Python zurückgibt.

hello_ext.cpp


#include <boost/python/module.hpp>
#include <boost/python/def.hpp>

int square(int a)
{
    return a*a;
}

BOOST_PYTHON_MODULE(hello_ext)
{
	using namespace boost::python;
	def("square",square);
}

Makefile zum Erstellen von hello_ext.so.

all: hello_ext.so

CC = g++

FRAMEWORK_PATH=/usr/local/opt/python/Frameworks
INCLUDE_PATH=$(FRAMEWORK_PATH)/Python.framework/Versions/2.7/include/python2.7

hello_ext.o: hello_ext.cpp
    $(CC) -Wall -O2 -fPIC -c $< -I$(INCLUDE_PATH)

hello_ext.so: hello_ext.o
    $(CC) -shared  -o $@ $< -lboost_python -F$(FRAMEWORK_PATH) -framework Python

Der Anrufer von Python.

hello.py


#!/usr/bin/env python
import hello_ext
print hello_ext.square(2)

Build- und Ausführungsergebnisse.

$ make
g++ -shared  -o hello_ext.so -I/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/include/python2.7 hello_ext.o -lboost_python -F/usr/local/opt/python/Frameworks -framework Python
$ python hello.py
4

Nun, der Code sollte sauberer sein als die altmodischen Python-Erweiterungen.

Anwendungsbeispiel (Objective-C ++)

Wenn Sie Objective-C mischen möchten, weil Sie ein vorhandenes Framework verwenden möchten, sollten Sie Objective-C ++ verwenden. Erstellen Sie Folgendes als hello_ext.mm.

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>

#import <Foundation/Foundation.h>

int square(int a)
{
    return a*a;
}

void nslog(void)
{
    NSLog(@"Hello");
}

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("square",square);
    def("nslog",nslog);
}

Das Makefile ist unten. Fügen Sie beim Kompilieren -x Objective-C ++ und beim Verknüpfen den Framework-Pfad und den Framework-Namen hinzu.

all: hello_ext.so

CC =clang++

FRAMEWORK_PATH=/usr/local/opt/python/Frameworks
INCLUDE_PATH=$(FRAMEWORK_PATH)/Python.framework/Versions/2.7/include/python2.7
FRAMEWORK_PATH2=/System/Library/Frameworks

STD_CPP_PATH = /usr/include/c++/4.2.1/

FRAMEWORK_OPTIONS=-F$(FRAMEWORK_PATH) -framework Python -F$(FRAMEWORK_PATH2) -framework Foundation

hello_ext.o: hello_ext.mm
	$(CC) -x objective-c++ -Wall -O2 -fPIC -c $< -I$(INCLUDE_PATH) -I$(STD_CPP_PATH)

hello_ext.so: hello_ext.o
	$(CC) -shared -o $@  $< -lboost_python $(FRAMEWORK_OPTIONS)

.PHONY: clean
clean:
	rm *.so *.o

Sie können es unten nennen.

import hello_ext

hello_ext.nslog()
print hello_ext.square(2)

Das Ausführungsergebnis ist wie folgt.

2017-04-09 11:45:29.818 Python[7710:333116] Hello
4

Wovon ich süchtig war und wie es gelöst wurde

Zunächst heißt es im Offiziellen Tutorial, dass Sie bjam verwenden können. Sie können bjam installieren, indem Sie den Boost-Build von Homebrew installieren. Ich wurde jedoch gebeten, den Pfad von Jamfile usw. anzugeben. Daher gab ich auf, weil ich nicht wusste, wo ich Homebrew installieren sollte.

Als nächstes habe ich versucht, mit g ++ zu bauen, indem ich von meinen Vorgängern wie Ich werde kurz die Funktionen von Boost.Python vorstellen gelernt habe. Aber als ich versuchte, das Argument zu übergeben

Segmentation fault: 11

Aber

Fatal Python error: PyEval_SaveThread: NULL tstate

Es war schrecklich, das zu sagen.

Die letztere Fehlermeldung blieb in der Suche und im StackOverflow-Artikel hängen ) Ist gekommen.

Meistens werden mehrere Python-Versionen gemischt, oder? Wenn Sie sich die Abhängigkeiten mit otool -L oder so ansehen;)

Der Kommentar ist genau Bingo. Sicherlich gab es eine Mischung aus nativen OSX-Pfaden und Homebrew-Pfaden.

Also habe ich es gelöst, indem ich den Framework-Pfad durch den Homebrew-Pfad anstelle des nativen OSX-Pfads durch die Option -F ersetzt habe.

Ich kam mit man ld zur Option -F. Ich schäme mich zu sagen, dass ich die Option -framework nicht einmal verstehe. Ich habe nicht genug gelernt, aber ich habe es geschafft.

Referenzlink

Recommended Posts

Einführung in Boost.python mit Homebrew
Stolpern Sie mit opencv3 von Homebrew
Richten Sie mit Homebrew eine moderne Python-Umgebung ein
Einführung von OpenCV in Mac mit Homebrew
Verwalten Sie jede Python-Version mit Homebrew
Veröffentlichen Sie Ihre eigene Python-Bibliothek auf Homebrew
Einführung von sip-4.14 in der Python3.2.2-Umgebung mit MacOS 10.7.4