2016-03-19 14 views
2

Ich versuche, einige eingebettete Python-Code ausführen.
während einige davon gut funktioniert einige der Importe funktionieren nicht.Eingebettete Python findet nicht einige Module, (Ctypes, ...)

// pseudo code 
... 
Py_SetPath("//path//to//python35.zip"); 
... 
Py_Initialize(); 
PyEval_InitThreads(); 

char * s = "import ctypes\n\nctypes.windll.user32.LockWorkStation()"; 
... 
PyObject *main_module = PyImport_AddModule("__main__"); 
PyObject *main_dict = PyModule_GetDict(main_module); 
... 
PyObject * PyRes = PyRun_String(s, Py_file_input, main_dict, main_dict); 
... 

in der Tat, wenn alles, was ich tun Anruf ist,

... 
char * s = "import ctypes"; 
... 

ich einen Fehler ("ctypes" nicht gefunden wird).

Aber wenn ich ...

... 
import time 
t = time.ctime() 
... 

Es funktioniert gut, so klar einige Module geladen werden, während andere nicht.

Irgendwelche Vorschläge, warum "Ctypes" einen Fehler werfen würden, während andere dies nicht tun?

bearbeiten: mehr Code ...

#include <python.h> 

int main() 
{ 
    //////////////////////////////////////////////////////////////////////// 
    Py_SetPath(L"path\\to\\python35.zip"); 
    Py_Initialize(); 
    PyEval_InitThreads(); 
    PyThreadState *mainstate = PyThreadState_Get(); 
    PyEval_ReleaseLock(); 

    // 
    // ... 
    // 
    // run the code. 
    PyEval_AcquireLock(); 
    PyInterpreterState* mainInterpreterState = mainstate->interp; 

    PyObject *main_module = PyImport_AddModule("__main__"); 
    PyObject *main_dict = PyModule_GetDict(main_module); 
    Py_INCREF(main_module); 

    PyObject *local_dic = PyDict_New(); 
    Py_XINCREF(local_dic); 

    // we can now run our script 
    const char* s = "import ctypes"; 
    PyObject * PyRes = PyRun_String(s, Py_file_input, main_dict, local_dic); 
    PyObject* ex = PyErr_Occurred(); 
    if (NULL != ex) 
    { 
    // didn't work, import error. 
    } 
    PyErr_Clear(); 

    PyDict_Clear(local_dic); 
    Py_XDECREF(local_dic); 
    Py_DECREF(main_module); 

    PyThreadState_Swap(NULL); 
    PyThreadState_Swap(mainstate); 
    PyEval_ReleaseLock(); 

    // 
    // ... 
    // 

    // close 
    PyEval_AcquireLock(); 
    PyThreadState_Swap(mainstate); 
    Py_Finalize(); 
    ////////////////////////////////////////////////////////////////////////// 
} 
+0

Wie über Sie ein minimales Beispiel für andere extrahieren zu reproduzieren? –

+0

Es ist so ziemlich wie ich es habe, stackoverflow erlaubt nicht mehr Code hinzugefügt werden. Sofern Sie sich nicht irgendwo vorstellen können, könnte ich es hier einfügen und zurück verlinken. –

+0

Sie missverstehen mich und auch Sie scheinen die Regeln der Website hier nicht zu kennen. Sie sollen ein minimales aber vollständiges Beispiel extrahieren, um es hier zu veröffentlichen. Ihr "Pseudo-Code" ist sowohl überflüssig als auch nicht genug, Sie müssen Code zur Verfügung stellen, der es jedem erlaubt, Ihr Problem zu reproduzieren. Dies hilft auch, die üblichen Fälle von dummen Fragen zu vermeiden, übrigens. –

Antwort

0

Der obige Code korrekt ist, das 'Problem' ist mit dem embeddable. Es ist für die Freigabeverteilung und nicht für das Debuggen (und das ist von Entwurf).

Im Beispielcode sucht die Python-DLL im Debugging nach _ctypes_d.pyd, aber der Redist hat nur _ctypes.pyd, daher der Grund, warum das Modul nicht gefunden wurde.

Die Python-Entwickler werden ein Blog über die Verwendung der eingebetteten ZIP schreiben.

Der Code enthält ein Projekt _ctypes.vcxproj, das Sie erstellen können, wenn Sie das _ctypes_d.pyd Python-Modul erstellen möchten.

Bitte sehen the bug report I created auf python.org

+0

Eine bessere Erklärung des Geschehens finden Sie hier: https://bugs.python.org/issue26598 –

-1

Ich hatte das sind zu beheben, die Python.h statt python.h sein sollte, dann könnte ich Ihren Code kompilieren und ausführen, das Problem zu reproduzieren. Nun ist das Problem, das durch

Py_SetPath(L"path\\to\\python35.zip"); 

, die den Weg vermasselt, wo Python zusätzliche Module sucht, das heißt diejenigen, die nicht in den Interpreter binären hart erarbeitet. Das ist auch der Grund, warum einige Anweisungen funktionieren und andere nicht. Diejenigen, die funktionieren, benötigen keinen korrekten Pfad, da sie keine zusätzlichen Dateien benötigen.

Als Referenz können Sie das gleiche Verhalten von innen Python bekommen, auch:

Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.path = ['/path/to/some/archive.tar.gz'] 
>>> import time 
>>> import ctypes 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named 'ctypes' 
>>> 
+0

Es ist keine gute Frage, zum Beispiel weil es knapp ist. Und ja, ich habe meinen "Anspruch" sowohl über den Code als auch durch das Lesen der Dokumentation überprüft. Warum kannst du nicht? Sind Sie nicht in der Lage, die Dokumentation zu finden? Führt der Code nach dem Entfernen dieser Zeile nicht zu den erwarteten Ergebnissen? Oder willst du nur deinen Fuß stampfen und den Atem anhalten, weil jemand es wagte, in deiner "vollkommen guten Frage" auf Fehler hinzuweisen? –

+0

Entfernen Sie die Zeile '' Py_SetPath (L "Pfad \\ zu \\ python35.zip"); ''?, Warum würde ich die eine Zeile entfernen, die die Einbettung ermöglicht. Das zeigt deutlich, dass Sie die Frage und den Code tatsächlich nicht verstehen. Was das Dokument angeht, können Sie nichts angeben, weil es einfach nicht da ist (und es ist auch nicht im Code enthalten, da Sie nicht zu verstehen scheinen, wofür die Funktion eigentlich ist). –

+0

Haben Sie es versucht? –