Seite 1 von 1
Python in c++ => socket Problem
Verfasst: Dienstag 24. April 2007, 12:01
von hobbes_dmS
hi,
ich bin gerade dabei mir einen logger in python zu schreiben, um statusmeldungen aus c++ anzuzeigen.
dazu habe ich zwei py-Scripte, das eine macht ein kleines Fenster auf und horcht auf einem port.
das zweite Skript ist eine einzelne Methode, die eine Verbindung zum entsprechenden port des Listeners aufbaut und die Daten rüberschickt.
in der IDLE funktioniert das auch alles wunderbar, wenn ich mein "sendescript" aber aus c++ heraus aufrufe, bekomme ich folgende Fehlermeldung:
Traceback (most recent call last):
File "d:\Programming\PythonPP\logger.py", line 8, in logMsg
import socket
File "D:\Programming\Python25\Lib\socket.py", line 45, in <module>
import _socket
ImportError: No module named _socket
jemand eine Ahnung was ich tun kann, um socket korrekt zu importieren?
Verfasst: Dienstag 24. April 2007, 22:11
von Masaru
Hmmm ... ich würde auf eine fehlerhafte Installation tippen (oder gar Kompilierung).
Welche Version von Python hast du denn installiert (2.5 oder 2.5.1 - Development, Release oder Final)?
Verfasst: Mittwoch 25. April 2007, 00:19
von birkenfeld
Wie "rufst du das Skript aus C++ auf"?
Verfasst: Mittwoch 25. April 2007, 07:52
von hobbes_dmS
Masaru hat geschrieben:Hmmm ... ich würde auf eine fehlerhafte Installation tippen (oder gar Kompilierung).
Welche Version von Python hast du denn installiert (2.5 oder 2.5.1 - Development, Release oder Final)?
tatsächlich, das scheint so zu sein.
im release build geht es.
installiert habe ich 2.5, da mir beim windows-installer allerdings die "python_d.dll" und die "python_d.dll" gefehlt haben, habe ich nochmal den py-source runtergeladen und selbst kompiliert, danach hatte ich auch die fehlenden Dateien... die hab ich dann einfach in die entsprechenden Ordner kopiert.
allerdings habe ich
ohne das bsddb-Modul kompiliert. ist das schon der Fehler?
@ birkenfeld: der aufrufende Code ist nix spannendes:
Code: Alles auswählen
int main(int argc, char *argv[])
{
string message = "helas!";
Py_Initialize();
PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue, *pMessage;
pName = pModule = pDict = pFunc = pArgs = pValue = pMessage = 0;
pMessage = PyString_FromString(message.c_str());
// Initialize the Python Interpreter
//Py_Initialize();
// Build the name object
pName = PyString_FromString("logger");
// Load the module object
if(pName)
pModule = PyImport_Import(pName);
// pDict is a borrowed reference
if(pModule)
pDict = PyModule_GetDict(pModule);
// pFunc is also a borrowed reference
if(pDict)
pFunc = PyDict_GetItemString(pDict, "logMsg");
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, pMessage);
if(pArgs){
pValue = PyObject_CallObject(pFunc,pArgs );
if (pValue) {
long l = PyInt_AsLong(pValue);
std::stringstream s;
s << l;
std::string asd = s.str();
//printf("Return of call : %d\n", PyInt_AsLong(pValue));
Py_DECREF(pValue);
}else{
PyErr_Print();
}
}
}
else{
PyErr_Print();
}
// Clean up
if(pModule)
Py_DECREF(pModule);
if(pName)
Py_DECREF(pName);
if(pMessage)
Py_DECREF(pMessage);
// Finish the Python Interpreter
Py_Finalize();
return 0;
}
thx für eure Hilfe
Verfasst: Mittwoch 25. April 2007, 18:40
von Sr4l
Ich denke das dort wo das C++ Programm liegt auch aus dem Python-Ordner "DLLs" die Datei "_socket.pyd" kopiert werden muss.
Evl. und / oder die _socket.lib aus dem Lib Verzeichnis.
Das war zumindest so als ich Python in Gamestudio genutzt habe. Kann mich aber nur noch schwach daran erinnern.
Verfasst: Donnerstag 26. April 2007, 13:26
von hobbes_dmS
Sr4l hat geschrieben:Ich denke das dort wo das C++ Programm liegt auch aus dem Python-Ordner "DLLs" die Datei "_socket.pyd" kopiert werden muss.
Evl. und / oder die _socket.lib aus dem Lib Verzeichnis.
Das war zumindest so als ich Python in Gamestudio genutzt habe. Kann mich aber nur noch schwach daran erinnern.
wow, super, vielen Dank, das war's!
*freu*