C++ in Python aufrufen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Hallo allerseits,

ich schreibe Momentan meine Masterarbeit und bearbeite dazu ein in Python (v2.7) programmiertes Projekt.
Bei diesem Projekt handelt es sich um eine Simulationssoftware in welche ich zusätzliche Tools einbauen soll.
Da ich jedoch in Python nicht so fit bin hoffe ich dass Ihr mir das ein oder andere Mal helfen könnt.
Teile der Software wurden auch zusätzlich, um das Programm zu beschleunigen, in C++ geschrieben.
Diese werden bei mir jedoch nicht aufgerufen, sondern die dazu äquivalenten Python Programmteile.
Auch ein nachinstallierter C++Compiler (MinGW) konnte keine Abhilfe schaffen.
Deshalb meine Frage:

Wie kann ich den C++Teil aufrufen/kompilieren lassen? :K

Programmcode:
http://larfis.polymtl.ca/index.php/en/links/openfilters

Vielen Dank Im Voraus!

MfG

Froststurm
BlackJack

@froststurm85: Einfach nur einen C++-Compiler installieren reicht nicht, man muss den C++-Quelltext dann auch damit übersetzen. Die verlinkte Webseite sagt dazu
http://larfis.polymtl.ca/index.php/en/links/openfilters hat geschrieben:If you want to use the abeles and moremath dynamic libraries, you will need to compile them. To do so, you will need to modify the Makefiles according to the compiler you are using and the position of python header and library files on your system.
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Wer lesen kann ist klar im Vorteil ;)

Danke erstmal!
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Ich hab die Makefiles überprüft und festgestellt, dass mit Python v2.6 programmiert wurde und die Makefiles auf den MinGW C++ Compiler (diesen habe ich auch installiert) "geeicht" sind. Deshalb habe ich alle Pfadangaben (für Header und Lib...) auf den Python 2.7 Pfad umgeschrieben. Aber auch das war nicht Zielführend. Jetzt habe ich die Pythenversion (auf 2.6) gewechselt aber es besteht immernoch das gleiche Problem.

Vielleicht kann jemand anhand der Makefile erkennen wo mein Problem liegt.

Vielen Dank im Voraus!

Makefile:

Code: Alles auswählen

# MAKEFILE
# 
# Makefile for the moremath dynamic library. Many options are
# available:
#            used alone, it compiles the DLL.
#   install  copy the DLL to the appropriate directory;
#   clean    remove temporary files;
#   all      all of the above.
# 
# Copyright (c) 2006-2009 Stephane Larouche.
# 
# This file is part of OpenFilters.
# 
# OpenFilters is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or (at
# your option) any later version.
#
# OpenFilters is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA


# The following lines make the compilation with the MinGW GCC port on
# Windows.

CC = g++
LINK = g++
CP = cp
RM = rm

O = o
SO = pyd

CFLAGS = -c -O3

PYTHON_HEADER_PATH = C:/Python26/include
CFLAGS_FOR_PYTHON_WRAPPERS = -I$(PYTHON_HEADER_PATH)

PYTHON_LIB_PATH = C:/Python26/libs
LINK_FLAGS = -L$(PYTHON_LIB_PATH)
LINK_SYNTAX = -mdll\
              -o _moremath.$(SO)\
              $(objects) $(objects_wrapper) _moremath.def\
              -lpython26 -lmsvcr71

RM_FLAGS = -f

CLEAN_SYNTAX = $(RM_FLAGS) $(objects) $(objects_wrapper) _moremath.$(SO)


# The following lines make the compilation with GCC on GNU Linux (tested with Ubuntu 8.04).

#CC = gcc
#LINK = gcc
#CP = cp
#RM = rm

#O = o
#SO = so

#CFLAGS = -c -O3

#PYTHON_HEADER_PATH = /usr/include/python2.6
#CFLAGS_FOR_PYTHON_WRAPPERS = -I $(PYTHON_HEADER_PATH)

#STANDARD_LIB_PATH = /usr/lib
#PYTHON_LIB_PATH = /usr/lib/python2.6
#LINK_FLAGS = -shared -export-dynamic -L$(STANDARD_LIB_PATH) -L$(PYTHON_LIB_PATH)
#LINK_SYNTAX = -o _moremath.$(SO) $(objects) $(objects_wrapper) -lstdc++

#RM_FLAGS = -f

#CLEAN_SYNTAX = $(RM_FLAGS) $(objects) $(objects_wrapper) _moremath.$(SO)


# The following lines make the compilation with GCC on FreeBSD.

#CC = gcc
#LINK = ld
#CP = cp
#RM = rm

#O = o
#SO = so

#CFLAGS = -c -O3

#PYTHON_HEADER_PATH = /usr/local/include/python2.6
#CFLAGS_FOR_PYTHON_WRAPPERS = -I $(PYTHON_HEADER_PATH)

#STANDARD_LIB_PATH = /usr/lib
#PYTHON_LIB_PATH = /usr/local/lib/python2.6
#LINK_FLAGS = -shared -export-dynamic -L$(STANDARD_LIB_PATH) -L$(PYTHON_LIB_PATH)
#LINK_SYNTAX = -o _moremath.$(SO) $(objects) $(objects_wrapper)

#RM_FLAGS = -f

#CLEAN_SYNTAX = $(RM_FLAGS) $(objects) $(objects_wrapper) _moremath.$(SO)


# The following lines make the compilation with GCC on OS X.

#CC = c++
#LINK = c++
#CP = cp
#RM = rm

#O = o
#SO = so

#CFLAGS = -c -O3

#PYTHON_HEADER_PATH = /usr/include/python2.6
#CFLAGS_FOR_PYTHON_WRAPPERS = -I $(PYTHON_HEADER_PATH)

#STANDARD_LIB_PATH = /usr/lib
#PYTHON_LIB_PATH = /usr/lib/python2.6
#LINK_FLAGS = -bundle -flat_namespace -undefined suppress -L$(STANDARD_LIB_PATH) -L$(PYTHON_LIB_PATH) /usr/lib/libpython2.6.dylib 
#LINK_SYNTAX = -o moremath_.$(SO) $(objects) $(objects_wrapper)

#RM_FLAGS = -f

#CLEAN_SYNTAX = $(RM_FLAGS) $(objects) $(objects_wrapper) _moremath.$(SO)


sources = interpolation.cpp\
          Levenberg_Marquardt.cpp\
          Newton_polynomials.cpp\
          QR.cpp\
          roots.cpp

sources_wrapper = QR_wrapper.cpp\
                  Levenberg_Marquardt_wrapper.cpp\
                  roots_wrapper.cpp\
                  _moremath.cpp


objects = $(sources:.cpp=.o)
objects_wrapper = $(sources_wrapper:.cpp=.o)


_moremath.$(SO) : $(objects)\
                  $(objects_wrapper)\
                  _moremath.def
	$(LINK) $(LINK_FLAGS) $(LINK_SYNTAX) 


interpolation.$(O) : interpolation.cpp\
                     _moremath.h
	$(CC) $(CFLAGS) interpolation.cpp

Levenberg_Marquardt.$(O) : Levenberg_Marquardt.cpp\
                           _moremath.h
	$(CC) $(CFLAGS) Levenberg_Marquardt.cpp

Levenberg_Marquardt_wrapper.$(O) : Levenberg_Marquardt_wrapper.cpp\
                                   _moremath.h\
                                   _moremath_wrapper.h
	$(CC) $(CFLAGS) $(CFLAGS_FOR_PYTHON_WRAPPERS) Levenberg_Marquardt_wrapper.cpp

Newton_polynomials.$(O) : Newton_polynomials.cpp\
                          _moremath.h
	$(CC) $(CFLAGS) Newton_polynomials.cpp

QR.$(O) : QR.cpp\
          _moremath.h
	$(CC) $(CFLAGS) QR.cpp

QR_wrapper.$(O) : QR_wrapper.cpp\
                  _moremath.h\
                  _moremath_wrapper.h
	$(CC) $(CFLAGS) $(CFLAGS_FOR_PYTHON_WRAPPERS) QR_wrapper.cpp

roots.$(O) : roots.cpp\
             _moremath.h
	$(CC) $(CFLAGS) roots.cpp

roots_wrapper.$(O) : roots_wrapper.cpp\
                     _moremath.h\
                     _moremath_wrapper.h
	$(CC) $(CFLAGS) $(CFLAGS_FOR_PYTHON_WRAPPERS) roots_wrapper.cpp

_moremath.$(O) : _moremath.cpp\
                 _moremath.h\
                 _moremath_wrapper.h
	$(CC) $(CFLAGS) $(CFLAGS_FOR_PYTHON_WRAPPERS) _moremath.cpp


install : _moremath.$(SO)
	$(CP) _moremath.$(SO) ..


clean : 
	$(RM) $(CLEAN_SYNTAX)


all : _moremath.$(SO)\
      install\
      clean
Zuletzt geändert von Anonymous am Donnerstag 4. Dezember 2014, 10:26, insgesamt 1-mal geändert.
Grund: Quelltext in Code-Tags gesetzt.
BlackJack

@froststurm85: Man müsste die Pfade zu den Python-Dateien anpassen, die Linkoption für die Python-Bibliothek, und eventuell auch die zu Microsoft's „common runtime”, denn 7.1 ist ja sicher auch etwas älter und wahrscheinlich sollte man dort die gleiche DLL linken die auch das Python verwendet.

Und dann wäre halt die Frage was das konkrete Problem ist beim Kompilieren.
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Die Python Pfade sind meines Erachtens angepasst, da ich Python 2.6 (Pfad: C:\Python26) installiert habe.
Für mich ist momentan, wenn ich es richtig beurteile, die folgende Codestelle wichtig, weil hier der Compiler für Windows aufgerufen wird:

Code: Alles auswählen

# The following lines make the compilation with the MinGW GCC port on
# Windows.

CC = g++
LINK = g++
CP = cp
RM = rm

O = o
SO = pyd

CFLAGS = -c -O3

PYTHON_HEADER_PATH = C:/Python26/include
CFLAGS_FOR_PYTHON_WRAPPERS = -I$(PYTHON_HEADER_PATH)

PYTHON_LIB_PATH = C:/Python26/libs
LINK_FLAGS = -L$(PYTHON_LIB_PATH)
LINK_SYNTAX = -mdll\
              -o _moremath.$(SO)\
              $(objects) $(objects_wrapper) _moremath.def\
              -lpython26 -lmsvcr71

RM_FLAGS = -f

CLEAN_SYNTAX = $(RM_FLAGS) $(objects) $(objects_wrapper) _moremath.$(SO)
Weiterhin befinden sich sowohl die msvcr71.dll als auch die python26.dll im System32 bzw. SysWOW64 Ordner.
Sollten diese noch wo anders sein?

Die Fehlermeldung lautet:

Moremath dynamic library import failed.
BlackJack

@froststurm85: Wovon ist das die Fehlermeldung? Das sieht nach Python aus das beim Importieren des Moduls scheitert. Soweit sind wir doch aber noch gar nicht. Vorher muss man das Modul ja übersetzen und installieren. Oder läuft das ohne Fehler? Wahrscheinlich ja nicht ohne Ausgaben.

Gibt es einen Grund für Python 2.6? Ich würde ja das aktuellste 2er Verwenden wenn da nichts gegen spricht.
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Den Fehler hat der Programmierer "abgefangen". An dieser Stelle erscheint eine Messagebox, wenn diese mit "OK" geschlossen wird arbeitet das Programm mit Python-Modulen weiter und nicht wie vorgesehen mit den schnelleren C++ Modulen. Das heißt die Rechenmodule liegen in Python und C++ vor und sind auch beide zu 100% funktional. Sodass dieses Programm auch auf PCs ohne C++ Compiler läuft.
Mein Fokus liegt dabei aber mehr auf den C++ Modulen.

Python 2.6 habe ich installiert weil das Programm seinerzeit mit dieser Version geschrieben wurde und um Pfadabweichungen und Ähnlichem vorzubeugen habe ich versucht alles auf den gleichen Stand zu bringen, um so mögliche Fehlerquellen auszuschließen.
Jetzt ist die aktuellste 2er Version wieder installiert.
BlackJack

@froststurm85: Das klingt jetzt so als wenn Du das in Python geschriebene Programm einfach gestartet hast. Du musst vorher selber dafür sorgen das die C++-Quelltexte in Erweiterungsmodule übersetzt werden und in die entsprechenden Verzeichnisse installiert werden. Das wird nicht auf magische Weise von selbst funktionieren nur weil man einen C++-Compiler installiert und das Makefile angepasst hat. Du musst schon noch ``make`` auf der Kommandozeile des Betriebssystems im entsprechenden Verzeichnis aufrufen wo das Makefile liegt und in diesem Fall auch noch ein Ziel angeben das im Makefile definiert ist. 'all' wäre das in diesem Fall wohl. *Dann* werden die Anweisungen ausgeführt die im Makefile stehen. Und das führt dann zu einem Übersetzen der C++-Quelltexte und dem installieren des Ergebnis in das passende Verzeichnis.
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Guten Morgen!

Erstmal ein dickes Dankeschön an BlackJack!!!!!
Ohne deine Unterstützung wäre ich nicht so schnell vorangekommen.

Ich habe jetzt das "make" in den jeweiligen Ordnern ausgeführt. (Bei dem MinGW-Compiler lautet der Befehl übrigens mingw32-make)
Das Ergebnis war aber trotzdem mal wieder ernüchternd. :(

Deshalb lade ich mal ein paar Screenshots von der Eingabeaufforderung hoch.

Bild
Bild
BlackJack

@froststurm85: Die nicht gefundenen Namen sehen alle ”bekannt” aus. Das sind Funktionen der Python-API, allerdings mit einem `_imp__*`-Präfix. Keine Ahnung ob das ein Windows-DLL-Ding ist, „name mangling” von C++ oder irgend etwas anderes. Oder die python26.dll wird nicht gefunden beim linken.
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Ein Teilproblem konnte ich mittlerweile lösen. Das Problem lag darin, dass ich eine 64-Bit Version von Python benutzt habe.
Nachdem ich -DMS_WIN64 bei compiler_flags_for_Python_wrapper hinzugefügt habe bin ich schon mal einen Schritt weiter gekommen.
Es kommt aber immer noch folgende Fehlermeldung:

Bild
froststurm85
User
Beiträge: 8
Registriert: Mittwoch 3. Dezember 2014, 14:16

Hallo,

falls es jemanden interessiert, ich habe das Problem gelöst und es war im Endeffekt äußerst simpel.
Die Kopier- und Löschbefehle waren für die Windowseingabeaufforderung falsch angegeben und so musste ich nur

Code: Alles auswählen

33.
CC = g++
LINK = g++
CP = cp
RM = rm
in

Code: Alles auswählen

CC = g++
LINK = g++
CP = copy
RM = del
ändern.

Nochmal vielen Dank an BlackJack für die Denkanstöße.
Antworten